Bagaimana saya dapat dengan andal mendapatkan nama sistem operasi?

69

Katakanlah saya masuk ke sistem jarak jauh, bagaimana saya bisa tahu apa yang sedang berjalan? Pada kebanyakan Linux modern (Linuces?), Anda memiliki lsb_releaseperintah:

$ lsb_release -ic    
Distributor ID: LinuxMint
Codename:       debian

Yang sejauh yang saya tahu hanya memberikan info yang sama /etc/lsb-release. Bagaimana jika file itu tidak ada? Sepertinya saya ingat bahwa lsb_releaseperintahnya relatif baru jadi bagaimana jika saya harus mendapatkan OS dari sistem yang lebih lama?

Dalam hal apapun, lsbsingkatan dari Linux Standard Basejadi saya berasumsi itu tidak akan berfungsi pada Unites non-Linux. Sejauh yang saya tahu, tidak ada cara untuk mendapatkan informasi ini unamejadi bagaimana saya bisa mendapatkan ini pada sistem yang tidak digunakan lsb_release?

terdon
sumber
1
unix.stackexchange.com/questions/6345/… untuk Linux. uname -sharus cukup di luar Linux (harapkan mungkin untuk BSD).
Mat
Sudahkah Anda check out facter? facter operatingsystemharus melakukan apa yang Anda inginkan pada semua sistem facteryang dibuat untuk bekerja dengannya.
Joseph R.
@ JosephephR. terlihat bagus tetapi tidak diinstal secara default.
terdon
1
Saya menempelkan facterkode yang mendapatkan nama sistem operasi pada pastebin. Temukan di sini . Ia memeriksa banyak file berbeda untuk mendapatkan nama dengan andal.
Joseph R.
@ JosephephR. wow, itu banyak file. Saya akan port ke bash ketika saya mendapat kesempatan, itu harus cukup portabel. Terima kasih!
terdon

Jawaban:

72

lsb_release -a kemungkinan akan menjadi pilihan terbaik Anda untuk mencari tahu informasi ini, dan mampu melakukannya secara konsisten.

Sejarah LSB

The lsbdalam perintah yang berdiri untuk proyek Linux Standar Basis yang merupakan proyek payung yang disponsori oleh Yayasan Linux untuk menyediakan metode generik untuk melakukan jenis dasar hal-hal di berbagai distro Linux.

Proyek ini bersifat sukarela dan vendor dapat berpartisipasi dalam proyek hanya sebagai pengguna dan juga sebagai fasilitator dari berbagai spesifikasi di sekitar modul yang berbeda yang membantu mendorong standardisasi dalam distribusi Linux yang berbeda.

kutipan dari piagam

Kelompok kerja LSB memiliki, sebagai tujuan intinya, untuk mengatasi dua masalah ini. Kami menerbitkan standar yang menjelaskan tentang set minimum API yang harus didukung oleh distribusi, dengan berkonsultasi dengan vendor distribusi utama. Kami juga menyediakan tes dan alat yang mengukur dukungan untuk standar, dan memungkinkan pengembang aplikasi untuk menargetkan perangkat umum. Akhirnya, melalui pekerjaan pengujian kami, kami berusaha untuk mencegah perbedaan yang tidak perlu antara distribusi.

Tautan bermanfaat yang terkait dengan LSB

Kritik

Ada sejumlah masalah dengan LSB yang membuatnya bermasalah untuk distro seperti Debian. Pemaksaan penggunaan RPM menjadi satu. Lihat artikel Wikipedia untuk informasi lebih lanjut .

Novell

Jika Anda mencari, Anda mungkin akan menemukan halaman yang cukup bertanggal berjudul: Mendeteksi Distro Linux yang Mendasari dari Novell. Ini adalah salah satu dari sedikit tempat saya telah melihat daftar aktual yang menunjukkan beberapa distro utama dan bagaimana Anda dapat mendeteksi apa yang mendasarinya yang Anda gunakan.

kutipan

Novell SUSE         /etc/SUSE-release
Red Hat             /etc/redhat-release, /etc/redhat_version
Fedora              /etc/fedora-release
Slackware           /etc/slackware-release, /etc/slackware-version
Debian              /etc/debian_release, /etc/debian_version,
Mandrake            /etc/mandrake-release
Yellow dog          /etc/yellowdog-release
Sun JDS             /etc/sun-release
Solaris/Sparc       /etc/release
Gentoo              /etc/gentoo-release
UnitedLinux         /etc/UnitedLinux-release
ubuntu              /etc/lsb-release

Halaman yang sama ini juga termasuk skrip praktis yang mencoba mengkodifikasikan untuk yang di atas menggunakan unameperintah vanilla saja , dan keberadaan salah satu file di atas.

CATATAN: Daftar ini bertanggal tetapi Anda dapat dengan mudah menjatuhkan distro tanggal seperti Mandrake dari daftar dan menggantinya dengan alternatif. Jenis skrip ini mungkin merupakan salah satu pendekatan jika Anda mencoba mendukung sebagian besar varian Solaris & Linux.

Linux Mafia

Pencarian lebih lanjut akan muncul halaman berikut dikelola di Linuxmafia.com, berjudul: / etc / rilis setara untuk berbagai Linux (dan Unix lainnya) distribusi . Ini mungkin daftar paling lengkap yang pernah saya lihat. Anda dapat menyusun daftar ini dengan pernyataan case / switch dan memasukkannya sebagai bagian dari distribusi perangkat lunak Anda.

Bahkan ada skrip di bagian bawah halaman yang melakukan hal itu. Jadi Anda bisa mengunduh dan menggunakan skrip sebagai pihak ke-3 untuk distribusi perangkat lunak Anda.

naskah

#!/bin/sh
# Detects which OS and if it is Linux then it will detect which Linux
# Distribution.

OS=`uname -s`
REV=`uname -r`
MACH=`uname -m`

GetVersionFromFile()
{
    VERSION=`cat $1 | tr "\n" ' ' | sed s/.*VERSION.*=\ // `
}

if [ "${OS}" = "SunOS" ] ; then
    OS=Solaris
    ARCH=`uname -p` 
    OSSTR="${OS} ${REV}(${ARCH} `uname -v`)"
elif [ "${OS}" = "AIX" ] ; then
    OSSTR="${OS} `oslevel` (`oslevel -r`)"
elif [ "${OS}" = "Linux" ] ; then
    KERNEL=`uname -r`
    if [ -f /etc/redhat-release ] ; then
        DIST='RedHat'
        PSUEDONAME=`cat /etc/redhat-release | sed s/.*\(// | sed s/\)//`
        REV=`cat /etc/redhat-release | sed s/.*release\ // | sed s/\ .*//`
    elif [ -f /etc/SuSE-release ] ; then
        DIST=`cat /etc/SuSE-release | tr "\n" ' '| sed s/VERSION.*//`
        REV=`cat /etc/SuSE-release | tr "\n" ' ' | sed s/.*=\ //`
    elif [ -f /etc/mandrake-release ] ; then
        DIST='Mandrake'
        PSUEDONAME=`cat /etc/mandrake-release | sed s/.*\(// | sed s/\)//`
        REV=`cat /etc/mandrake-release | sed s/.*release\ // | sed s/\ .*//`
    elif [ -f /etc/debian_version ] ; then
        DIST="Debian `cat /etc/debian_version`"
        REV=""

    fi
    if [ -f /etc/UnitedLinux-release ] ; then
        DIST="${DIST}[`cat /etc/UnitedLinux-release | tr "\n" ' ' | sed s/VERSION.*//`]"
    fi

    OSSTR="${OS} ${DIST} ${REV}(${PSUEDONAME} ${KERNEL} ${MACH})"

fi

echo ${OSSTR}

CATATAN: Script ini seharusnya terlihat familier, ini adalah versi terbaru dari Novell!

Script ruang kaki

Metode lain yang saya lihat digunakan adalah untuk menggulung skrip Anda sendiri, mirip dengan metode Novell di atas tetapi menggunakan LSB sebagai gantinya. Artikel ini berjudul: Metode Generik untuk Menentukan Linux (atau UNIX) Nama Distribusi , menunjukkan salah satu metode tersebut.

# Determine OS platform
UNAME=$(uname | tr "[:upper:]" "[:lower:]")
# If Linux, try to determine specific distribution
if [ "$UNAME" == "linux" ]; then
    # If available, use LSB to identify distribution
    if [ -f /etc/lsb-release -o -d /etc/lsb-release.d ]; then
        export DISTRO=$(lsb_release -i | cut -d: -f2 | sed s/'^\t'//)
    # Otherwise, use release info file
    else
        export DISTRO=$(ls -d /etc/[A-Za-z]*[_-][rv]e[lr]* | grep -v "lsb" | cut -d'/' -f3 | cut -d'-' -f1 | cut -d'_' -f1)
    fi
fi
# For everything else (or if above failed), just use generic identifier
[ "$DISTRO" == "" ] && export DISTRO=$UNAME
unset UNAME

Potongan kode ini dapat dimasukkan ke sistem /etc/bashrcatau beberapa file seperti itu yang kemudian akan mengatur variabel lingkungan $DISTRO.

gcc

Percaya atau tidak, metode lain adalah memanfaatkannya gcc. Jika Anda menanyakan perintah, gcc --versionAnda akan mendapatkan distro yang dibangun untuk gcc, yang sama dengan sistem yang sedang berjalan.

Fedora 14

$ gcc --version
gcc (GCC) 4.5.1 20100924 (Red Hat 4.5.1-4)
Copyright (C) 2010 Free Software Foundation, Inc.

CentOS 5.x

$ gcc --version
gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-54)
Copyright (C) 2006 Free Software Foundation, Inc.

CentOS 6.x

$ gcc --version
gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3)
Copyright (C) 2010 Free Software Foundation, Inc.

Ubuntu 12.04

$ gcc --version
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.

TL; DR;

Jadi yang mana yang harus saya gunakan? Saya cenderung mengikuti lsb_release -adistribusi Linux yang sering saya kunjungi (RedHat, Debian, Ubuntu, dll.). Untuk situasi di mana Anda mendukung sistem yang tidak menyediakan, lsb_releasesaya akan menggulirkan saya sendiri sebagai bagian dari distribusi perangkat lunak yang saya sediakan, mirip dengan salah satu skrip di atas.

UPDATE # 1: Tindak lanjut dengan SuSE

Dalam berbicara dengan @Nils dalam komentar di bawah ini ditentukan bahwa untuk alasan apa pun, SLES11 tampaknya menjatuhkan LSB agar tidak diinstal secara default. Itu hanya instalasi opsional, yang tampaknya berlawanan dengan paket yang menyediakan fitur utama jenis ini.

Jadi saya mengambil kesempatan untuk menghubungi seseorang dari proyek OpenSuSE untuk mengetahui alasannya.

kutipan email

Hi Rob,

I hope you don't mind me contacting you directly but I found your info here: 
https://en.opensuse.org/User:Rjschwei. I participate on one of the StackExchange 
sites, Unix & Linux and a question recently came up regarding the best option 
for determining the underlying OS.

http://unix.stackexchange.com/questions/92199/how-can-i-reliably-get-the-operating-systems-name/92218?noredirect=1#comment140840_92218

In my answer I suggested using lsb_release, but one of the other users mentioned 
that this command wasn't installed as part of SLES11 which kind of surprised me. 
Anyway we were looking for some way to confirm whether this was intentionally 
dropped from SLES or it was accidental.

Would you know how we could go about confirming this one way or another?

Thanks for reading this, appreciate any help and/or guidance on this.

-Sam Mingolelli
http://unix.stackexchange.com/users/7453/slm

Inilah respons Rob

Hi,

On 10/01/2013 09:31 AM, Sam Mingo wrote:
- show quoted text -

lsb_release was not dropped in SLES 11. SLES 11 is LSB certified. However, it 
is not installed by default, which is consistent with pretty much every other
distribution. The lsb_release command is part of the lsb-release package.

At present almost every distribution has an entry in /etc such as 
/etc/SuSE-release for SLES and openSUSE. Since this is difficult for ISVs and 
others there is a standardization effort going on driven by the convergence to 
systemd. The standard location for distribution information in the future will 
be /etc/os-release, although Ubuntu will probably do something different.

HTH,    
Robert

--  Robert Schweikert                           MAY THE SOURCE BE WITH YOU    
SUSE-IBM Software Integration Center                   LINUX    
Tech Lead    
Public Cloud Architect 
slm
sumber
1
Catatan: Baru saja melakukan pemeriksaan cepat pada mesin dengan AIX dan SunOS. Mereka tampaknya tidak menginstal lsb_release (dan setelah semua, ini adalah Unix bukan Linux stack). Masalah dengan gcc adalah bahwa beberapa ppl sekarang mulai menggunakan dentang. Anda juga tidak pernah bisa memastikan gcc mana yang digunakan untuk membangun (pada sistem saya bekerja dengan setidaknya ada beberapa versi pada masing-masing). Jadi suara saya masuk ke solusi Python karena tampaknya sudah diinstal sekarang di mana-mana secara default.
Elmo
@elmo - ya LSB adalah Linux Standard Base, jadi saya tidak akan mengharapkan AIX atau SunOS untuk memilikinya. Pengalaman saya dengan SunOS adalah 15+ tahun, dan sebagian besar vendor yang perangkat lunaknya saya tangani biasanya menyediakan skrip shell sendiri mirip dengan yang saya rujuk di atas. Sampai Solaris 11, Python bukanlah pilihan. Dan inilah yang membuatnya sulit untuk retak. Jika Anda menyediakan perangkat lunak yang perlu dijalankan pada Solaris 9, 10, 11, AIX, dan beberapa distro Linux (SUSE, Ubntu, dan RHEL) apa yang Anda lakukan? Python bukan opsi, jadi Anda tinggal menggunakan skrip shell kode tangan.
slm
@elmo - gcc, sebuah opsi, tampaknya juga tidak menarik bagi saya. Tampaknya dipenuhi dengan banyak masalah, saya mendemonstrasikannya hanya sebagai pilihan.
slm
@elmo - lihat kode di balik fungsi itu, hg.python.org/cpython/file/2.7/Lib/platform.py#l259 . Kejutan besar menggunakan LSB!
slm
@slm: Saya memiliki akses ke mesin dengan SunOS 5.10 (yang saya asumsikan 10 dalam daftar Anda - saya tidak begitu akrab dengan nomor versi / konvensi Sun) dan memang memiliki Python. Saya memiliki akses ke mesin dengan AIX 7 dan memang memiliki Python. Mesin Linux jelas memilikinya juga. Jadi tetap saja Python terlihat seperti pilihan paling portabel. Adapun Sun di bawah 10 saya tidak yakin mengapa itu tidak akan mengizinkan Python untuk diinstal (memang instalasi saat ini kurang yaitu ncurses dan ctypes, jadi siapa yang tahu). Adapun Python menggunakan LSB itu tidak mengherankan sama sekali untuk Linux jika pendekatan standar.
Elmo
16

Karena Anda mungkin tidak akan dapat menginstal facterpada server jauh, Anda dapat meniru apa yang dilakukannya untuk menemukan nama OS. Kode Ruby untuk operatingsystemfakta dapat ditemukan di sini di pastebin . Pada dasarnya, ia melihat melalui berbagai *-releasefile dan lainnya untuk menentukan nama OS.

Beberapa file yang dilihatnya:

/etc/debian_version
/etc/gentoo-release
/etc/fedora-release
/etc/mandriva-release
/etc/mandrake-release
/etc/meego-release
/etc/arch-release
/etc/oracle-release
/etc/enterprise-release
/etc/ovs-release
/etc/vmware-release
/etc/redhat-release
/etc/SuSE-release
/etc/bluewhite64-version
/etc/slamd64-version
/etc/slackware-version
/etc/alpine-release
/etc/system-release
/etc/centos-release

Maaf jika Anda menemukan duplikat dalam daftar ini, saya membuatnya dengan cepat grep. Seharusnya cukup mudah (walaupun agak membosankan) untuk mem-port ini ke skrip POSIX shell.

Joseph R.
sumber
5
"Maaf jika kamu menemukan duplikat dalam daftar ini, aku memproduksinya dengan cepat dengan grep." ... | uniq?
new123456
@ new123456 Benar. Terima kasih. Kata kuncinya di sini adalah "cepat" :)
Joseph R.
Maaf tentang tidak menerima ini tetapi jawaban @ slm terlalu komprehensif untuk diabaikan :).
terdon
3
bagaimana dengan / etc / os-release?
Yauhen Yakimovich
1
@ new123456 Secara teknis, seharusnya begitu ... | sort -u. uniqhanya menemukan elemen unik yang berdekatan.
Parthian Shot
9

Jika Anda telah pythonmenginstal (tidak masalah apakah Python 3 atau Python 2), Anda dapat mengetahui nama distribusi tanpa menciptakan kembali roda :

python -c "import platform;print(platform.linux_distribution()[0])"
heinrich5991
sumber
Jika Anda tergoda untuk menggunakan opsi ini, pastikan OS Anda didukung: hg.python.org/cpython/file/2.7/Lib/platform.py#l259 . Jika tidak, Anda dapat menambahkan lebih banyak ke daftar: coderwall.com/p/cwrenq
slm
1
Ini tidak akan berfungsi dengan distribusi Linux kuno. Sebagai contoh: SuSE 7.0 memiliki Python 1.5.2 dan modul platform telah ditambahkan sebelum kedatangan Python 2.3 pada tahun 2003 ;-)
pefu
6

/etc/issueharus berisi informasi rilis. Saya cukup yakin saya pernah melihatnya di sistem Solaris. Ini file dari sistem Debian modern:

$ cat /etc/issue
Debian GNU/Linux 7 \n \l

$ 

/ etc / issue juga disebutkan dalam FHS (yang tidak hanya untuk sistem Linux), meskipun "opsional".

drewbenn
sumber
Ah, itu saran yang bagus, +1. Mungkin tidak selalu berhasil meskipun The file /etc/issue is a text file which contains a message or system identification to be printed before the login prompt.tampaknya terserah sysadmin untuk menulis apa pun yang dia inginkan.
terdon
2
/etc/issuesama sekali tidak bisa diandalkan. (Saya telah melihat sistem dalam versi XY dengan /etc/issuespanduk yang mengatakan bahwa mereka YZ mengikuti manajemen tambalan yang buruk. Ini dapat berisi apa saja.)
Mat
Disarankan untuk mengisi file itu dengan. hal-hal hukum seperti siapa yang diizinkan masuk.
Nils
Direkomendasikan oleh pedoman keamanan dan auditor. Pernah ada kasus di hukum di mana seorang hacker datang tanpa hukuman, karena ada SELAMAT DATANG di / etc / issue
Nils
@drewbenn halaman manual mengatakan apa yang saya kutip dalam komentar pertama saya, tidak ada yang perlu mengandung info sistem. Itu sering terjadi.
terdon
6

Anda tidak dapat secara andal mendapatkan nama distro dari satu perintah di semua distro. Beberapa tersedia melalui / etc / * - release dan lainnya tersedia melalui perintah 'lsb-release'.

boz
sumber
Terima kasih tetapi tidak ada yang membantu ketika datang ke Unix atau non-Linux * nix lainnya.
terdon
3

Saya menggunakan perintah shell ini untuk mendapatkan string yang menunjukkan distribusi Linux:

for f in $(find /etc -type f -maxdepth 1 \( ! -wholename /etc/os-release ! -wholename /etc/lsb-release -wholename /etc/\*release -o -wholename /etc/\*version \) 2> /dev/null); do echo ${f:5:${#f}-13}; done;

perintah ini didasarkan pada jawaban Joseph R. dan slm.

Itu hanya mencari file seperti / etc / {osname} -release atau / etc / {osname} _versi dan mencetak nama os tertentu.

Ini berhasil

  • CentOS (centos)
  • RedHat (redhat)
  • Debian (debian)
  • Lengkungan (arch)
  • OpenSUSE (OpenSUSE)
  • Fedora (fedora)
  • Ubuntu (debian)
scrutari
sumber
Tidak akan for f in /etc/*{_version,...*-release}; do [ -f "$f" ] && echo ${f:5:${#f}-13} ; donebekerja sama baiknya pada mereka semua? Saya tidak mengerti mengapa Anda pertama- findtama harus memasukkan semua file /etc.
terdon
Terima kasih atas tanggapan Anda, terdon, tetapi perintah Anda memberikan 0 baris dalam setidaknya Cent OS dan Fedora
scrutari
1

SNMP adalah protokol yang cukup di mana-mana sehingga dapat ditemukan di berbagai jenis distribusi GNU / Linux dan sistem UNIX.

The system.sysDescr.0objek dalam SNMPv2-MIB dapat membantu Anda mengetahui OS Anda menghubungi, disediakan ada sebuah daemon SNMP berjalan di sistem target:

Deskripsi

Deskripsi tekstual entitas. Nilai ini harus mencakup nama lengkap dan identifikasi versi dari jenis perangkat keras sistem, sistem operasi perangkat lunak, dan perangkat lunak jaringan.

Status: saat ini

Akses: hanya-baca

Halaman snmpget(1)manual menjelaskan cara mengambil nilai ini dengan contoh.

dawud
sumber
Kelemahannya adalah ini adalah string statis yang tidak dipelihara secara otomatis.
Nils
1

Karena tidak ada cara umum untuk melakukannya, kami mendefinisikan string rilis melalui snmp exec-command.

Tugas dari perintah itu adalah untuk mencetak distro dan versi os utama / minor saat ini.

Pada RH dan klon kita mengurai / etc / redhat-release, pada SuSe SuSe-release ...

Nils
sumber
Siapa kami'? Dan bagaimana dengan Unix?
terdon
@terdon kami adalah tim kami di tempat kerja. Pada Unix Anda dapat melakukan hal yang sama jika ekstensi yang sesuai dikompilasi ke dalam snmpd.
Nils
Ah, saya pikir Anda adalah bagian dari beberapa grup standar :)
terdon
@terdon Anda mulai mengembangkan standar situs ketika Anda harus mengelola lebih dari 80 server. Kami mengembangkan metode ini sehingga kami dapat memantau apakah osnya sudah usang (EoL minor atau bahkan angka besar)
Nils
1

Dari apa yang saya dapat kumpulkan dari utas ini, Anda seharusnya bisa mendapatkan info dari hampir semua sistem menggunakan:

if which lsb_release &>> /dev/null; then
    lsb_release -a
elif [ -r /etc/issue ]; then
    cat /etc/issue
else
    ls /etc/ | grep -e '[_-]release$' -e '[_-]version$' | xargs -I % -n 1 cat /etc/%
fi
Sammitch
sumber
2
jangan parsing output ls!
heinrich5991
@ heinrich5991 kenapa tidak?
Sammitch
Secara teknis, dia tidak menguraikan output ls. Dia lexing output dari ls. Tapi ya ... Ini salah karena /etc/issuesama sekali tidak bisa diandalkan. Sepenuhnya, sepenuhnya, sama sekali tidak bisa diandalkan. Juga, asumsi Anda bahwa tidak seorang pun dapat meletakkan file yang tidak terkait os yang diakhiri dengan 'rilis' atau 'versi' adalah tidak bijaksana.
Parthian Shot
@ParthianShot Jadi, terutama Anda ingin mengeluh tentang tingkat mundur kedua dan ketiga jika opsi yang lebih andal tidak tersedia?
Sammitch
@Sammitch more reliable optionsYah, untuk satu hal, hanya ada satu opsi. Jadi, bahkan dengan asumsi saya setuju dengan asumsi Anda bahwa itu lebih dapat diandalkan (yang tidak saya lakukan), jangan mulai menjernihkan hal-hal. Kedua, jika seseorang benar-benar menggunakan solusi Anda, dan itu benar-benar gagal separuh waktu, mereka tidak akan terhibur oleh kenyataan bahwa itu gagal dalam "selain itu jika". Tidak ada sistem saya yang lsbmenginstal secara default.
Parthian Shot
1

Jika ada situasi yang membutuhkannya, Anda bisa mencari tahu dari jauh menggunakan snmpwalk [atau SNMP protocal secara umum]. Contohnya di bawah ini:

snmpwalk -Os -c <snmp community string> -v1 <hostname> sysDescr.0

OUPUT: sysDescr.0 = STRING: Linux example.hostname.com 2.6.32-358.23.2.el6.x86_64 # 1 SMP Sab 14 Sep Sep 05:32:37 EDT 2013 x86_64

Kunci dari keandalan adalah apakah SNMP diatur dengan benar di lingkungan Anda, semua host menjalankan snmp dengan pengaturan string komunitas yang tepat.

xpros
sumber
Apa snpwalk? Di mana saya bisa menemukannya? Juga, yang hanya mencetak "Linux", tidak ada informasi distribusi (yang saya inginkan, unamedapat memberi saya Linux). Apakah ini berfungsi pada OS non-Linux? Pada UNIX katakanlah, atau BSD atau OSX?
terdon
snmpwalk adalah utilitas baris perintah Linux. Tidak hanya mencetak "Linux" tetapi juga mencetak versi kernel yang merupakan satu-satunya yang Anda butuhkan. Jika SNMP dikonfigurasikan pada host Anda yang lain, apakah itu UNIX, BSD, OSX, snmpwalk akan berfungsi sebagaimana standar (v1 | v2c | v3), dan itu bahkan akan bekerja melintasi air pada host Windows juga. Lihat juga snmpget atau snmpgetnext.
xpros
Kedengarannya bagus tetapi bisakah Anda mengedit jawaban Anda dan menjelaskan di mana kami dapat menemukannya. Bukan int dia repo Debian misalnya. Juga, tolong jelaskan apa yang uname -atidak diberikannya dan bagaimana ia dapat memberi tahu saya nama distribusinya tentang pertanyaan ini. Pokoknya, bahkan dengan asumsi itu dapat mengembalikan info ini, mengingat itu adalah utilitas non-standar dan perlu diinstal, saya tidak yakin itu akan berguna di sini. Idenya adalah untuk masuk ke sistem jarak jauh dan mencari tahu OS (termasuk distribusi jika itu Linux).
terdon
it also prints the kernel version which is really the only thing you needTapi ... itulah inti dari pertanyaan ini. Jika hanya itu yang Anda butuhkan, Anda bisa menggunakannya uname -a. Kernel adalah bagian penting dari sistem operasi, tetapi ini bukan keseluruhan sistem operasi. Layout sistem file dan utilitas userland (mis. Manajer paket) penting.
Parthian Shot
1

Gunakan /etc/os-release:

$ cat /etc/os-release
NAME="Ubuntu"
VERSION="18.10 (Cosmic Cuttlefish)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.10"
VERSION_ID="18.10"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=cosmic
UBUNTU_CODENAME=cosmic

Alasannya dijelaskan dengan baik di FAQ dengan tautan http://0pointer.de/blog/projects/os-release.html disediakan oleh @weberjn dalam komentar ini . Saya hanya mendaftar di sini satu argumen yang menentang penggunaan lsb_releaseyang sejauh ini merupakan jawaban teratas yang dipilih dari 2013

Sudah ada alat lsb_release untuk ini, mengapa Anda tidak menggunakannya saja?Ya, itu antarmuka yang sangat aneh: skrip shell yang harus Anda panggil (dan karenanya menelurkan secara asinkron dari kode C Anda), dan itu tidak ditulis agar dapat diperluas. Ini adalah paket opsional di banyak distribusi, dan kami dengan senang hati tidak akan dipanggil sebagai bagian dari boot awal untuk menampilkan pesan selamat datang. (Dalam waktu dengan waktu boot userspace sub-detik kami benar-benar tidak ingin memanggil skrip shell besar untuk hal-hal sepele seperti menampilkan pesan selamat datang). Alat lsb_release kepada kami tampaknya merupakan upaya untuk mengabstraksi pemeriksaan distribusi, di mana diperlukan standarisasi pemeriksaan distribusi. Ini hanya antarmuka yang dirancang dengan buruk. Menurut pendapat kami, ini digunakan sebagai antarmuka untuk menentukan versi LSB itu sendiri, tetapi tidak untuk memeriksa distribusi atau versi.

techtonik anatoly
sumber
Terima kasih, tetapi jawaban yang diterima sudah membahas ini dalam kutipan pada akhirnya yang menjelaskan bahwa /etc/os-releaseakan menjadi lebih standar. Namun, file itu tidak selalu ada di semua sistem yang mengapa jawaban yang diterima memberikan alternatif yang lebih portabel. Juga, saya tidak tahu mengapa Anda menyebutkan kode C, pertanyaannya bukan tentang meminta apa pun dari C.
terdon
@terdon Saya hanya ingin tahu sistem apa saja yang ada di tahun 2018 di mana /etc/os-releasetidak ada? Saya kira basis pengguna mereka sengsara dibandingkan dengan sistem di mana lsb_releasetidak dikirimkan secara default. Setidaknya saya tidak bisa menggunakan jawaban Anda yang diterima di Fedora. Adapun komentar C, itu bukan milik saya, tetapi kutipan dari systemdtautan 0pointer.de yang saya berikan.
anatoly techtonik
Ya, saya tahu itu bukan milik Anda, saya hanya ingin tahu mengapa Anda merasa bahwa kutipan tentang kode C relevan. Dan sejauh yang saya tahu, os-releasesebagian besar atau semata-mata hal Linux. Tampaknya didefinisikan oleh FreeDesktop.org, jadi mungkin beberapa rasa Unix juga menggunakannya, tapi saya ragu Anda akan menemukannya di sebagian besar atau di sistem embedded atau sistem non-GUI dll. Akhirnya, jangan lupa bahwa banyak tempat masih menggunakan mesin yang sangat lama karena alasan stabilitas.
terdon
Kutipan tentang lsb_releasedan Anda dapat mengganti C dengan Go dan mendapatkan argumen yang sama. Ongkos menjalankan lsb_releasejauh lebih tinggi dari keamanan dan kinerja daripada hanya mengurai file statis. Saya tidak percaya pada mesin yang sangat tua yang memberikan stabilitas. Heartbleed dan teman-teman seharusnya mengambilnya sejak lama, jadi gunakan saja/etc/os-release
anatoly techtonik