Bagaimana cara menulis skrip yang secara efektif menentukan nama distro?

13

Saya melihat posting ini tentang berbagai cara untuk mengetahui distro apa yang diinstal, jadi saya mencoba menulis skrip yang mencoba semuanya. Perintah yang mungkin termasuk:

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

Saya mencoba menulis sesuatu seperti ini (saya berbicara bahasa Spanyol secara normal, jadi dalam bahasa Spanyol):

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"
}

Dapatkah seseorang membantu saya memasukkan semua cara lain untuk mendapatkan nama distro?

inukaze
sumber

Jawaban:

13

Setiap distribusi (terlepas dari upaya lsb) menggunakan atau mungkin menggunakan (atau bahkan mungkin tidak memilikinya) file lain di / etc / untuk menyatakan apa nama dan versinya.

Anda harus menambahkan ketentuan dalam skrip Anda untuk masing-masing. Juga memperhitungkan bahwa beberapa distro berasal dari yang besar dan mungkin atau mungkin tidak mengadaptasi file versinya.

Jika Anda tidak ingin menemukan kembali roda Anda dapat menggunakan orang lain bekerja untuk mencapai apa yang Anda cari. Sebagai contoh dalam python dalam platform modul ada metode untuk menebak distribusi:

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.

sebagai contoh:

In [1]: import platform

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

The Linux Standard Base menentukan perintah untuk itu:

lsb_release -si

Ini tidak selalu merupakan bagian dari instalasi default, jadi jika Anda ingin skrip Anda bekerja pada setiap sistem, Anda harus kembali ke rute lihat-dan-tebak.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
lsb_release -si bekerja dengan beberapa distro, tetapi tidak dengan semua linux, di bawah "ArchLinux, Slackware & Derivates" ini tidak berfungsi, hasilnya adalah "kosong"
inukaze
1

Ini adalah sedikit metode "brute-force" untuk menyelesaikan sesuatu, tapi ini cepat dan harus, menggunakan bash, bekerja pada sebagian besar distro

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
frogstarr78
sumber
1

Jika Anda tidak takut dengan ketergantungan tambahan, Anda dapat menggunakan facter untuk itu. Ini memberikan informasi tentang nama dan versi distro bahkan tanpa lsb_release diinstal.

rvs
sumber