Làm thế nào để viết một kịch bản xác định hiệu quả tên distro?


13

Tôi đã thấy bài đăng này trên tất cả các cách khác nhau để tìm hiểu bản phân phối nào được cài đặt, vì vậy tôi đang cố gắng viết một kịch bản thử tất cả chúng. Các lệnh có thể bao gồm:

$ cat /etc/lsb-release 
$ cat /etc/issue 
$ dmesg | head -1
$ cat /proc/version 
$ cat /etc/slackware-version 
$ cat/etc/debian-verion 

Tôi đã thử viết một cái gì đó như thế này (tôi nói tiếng Tây Ban Nha bình thường, vì vậy nó bằng tiếng Tây Ban Nha):

function Nombre_SO()
{

    DistroName="Linux"
    if [ $DistroName = Linux ] ;
    then

# Debian
    debian=`cat /etc/debian_version | cut -d " " -f01 | tr '[:upper:]' '[:lower:]'`
    if [ "$debian" = "debian" || "squeeze/sid" || "lenny" ]; 
        then
        DistroName="debian"
        else
        echo "Esto no es debian"
    fi

# Slackware
    slackware=`cat /etc/slackware-version | cut -d " " -f01` | tr '[:upper:]' '[:lower:]'`
    if [ "$slackware" = "slackware" || "slackware-x86_64" ];
    then
        DistroName="slackware" 
    else
    echo "Esto no es Slackware"
}

Ai đó có thể giúp tôi kết hợp tất cả các cách khác để có được tên của một distro không?

Câu trả lời:


13

Mỗi bản phân phối (bất chấp các nỗ lực lsb) sử dụng hoặc có thể sử dụng (hoặc thậm chí có thể thiếu nó) một tệp khác trong / etc / để khai báo tên và phiên bản của nó là gì.

Bạn nên thêm một điều kiện trong kịch bản của bạn cho mỗi một. Ngoài ra, hãy lưu ý rằng một số bản phát hành có nguồn gốc từ các bản chính khác và có thể hoặc không thể điều chỉnh các tệp phiên bản của chúng.

Nếu bạn không muốn phát minh lại bánh xe, bạn có thể sử dụng người khác làm việc để đạt được những gì bạn đang tìm kiếm. Ví dụ: trong python trong nền tảng mô-đun, có một phương pháp để đoán phân phối:

Help on function linux_distribution in module platform:

linux_distribution(distname='', version='', id='', supported_dists=('SuSE', 'debian', 'fedora', 'redhat', 'centos', 'mandrake', 'mandriva', 'rocks', 'slackware', 'yellowdog', 'gentoo', 'UnitedLinux', 'turbolinux'), full_distribution_name=1)
    Tries to determine the name of the Linux OS distribution name.

    The function first looks for a distribution release file in
    /etc and then reverts to _dist_try_harder() in case no
    suitable files are found.

    supported_dists may be given to define the set of Linux
    distributions to look for. It defaults to a list of currently
    supported Linux distributions identified by their release file
    name.

    If full_distribution_name is true (default), the full
    distribution read from the OS is returned. Otherwise the short
    name taken from supported_dists is used.

    Returns a tuple (distname,version,id) which default to the
    args given as parameters.

ví dụ:

In [1]: import platform

In [2]: platform.linux_distribution()
Out[2]: ('Ubuntu', '11.10', 'oneiric')

3

Các Linux Standard Base định một lệnh cho điều đó:

lsb_release -si

Nó không phải luôn là một phần của cài đặt mặc định, vì vậy nếu bạn muốn tập lệnh của mình hoạt động trên mọi hệ thống, bạn sẽ phải quay lại tuyến đường nhìn và đoán.


lsb_release -si hoạt động với một số bản phát hành, nhưng không phải với tất cả linux, trong "ArchLinux, Slackware & Derivates", điều này không hoạt động, kết quả là "trống"
inukaze

1

Đây là một chút của một phương pháp "vũ phu" để hoàn thành mọi thứ, nhưng nó nhanh chóng và nên, sử dụng bash, hoạt động trên hầu hết các bản phân phối

ver=$(cat /etc/*{issues,release,version} 2> /dev/null)
if [[ $(echo $ver | grep DISTRIB_ID) ]]; then
    lsb_release -si
else
    echo $ver | cut -d ' ' -f 1 | sort -u | head -1
fi

1

Nếu bạn không sợ phụ thuộc thêm, bạn có thể sử dụng facter cho điều đó. Nó cung cấp thông tin về tên distro và phiên bản ngay cả khi không cài đặt lsb_release.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.