Katakanlah saya masuk ke sistem jarak jauh, bagaimana saya bisa tahu apa yang sedang berjalan? Pada kebanyakan Linux modern (Linuces?), Anda memiliki lsb_release
perintah:
$ 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_release
perintahnya relatif baru jadi bagaimana jika saya harus mendapatkan OS dari sistem yang lebih lama?
Dalam hal apapun, lsb
singkatan dari Linux Standard Base
jadi saya berasumsi itu tidak akan berfungsi pada Unites non-Linux. Sejauh yang saya tahu, tidak ada cara untuk mendapatkan informasi ini uname
jadi bagaimana saya bisa mendapatkan ini pada sistem yang tidak digunakan lsb_release
?
uname -s
harus cukup di luar Linux (harapkan mungkin untuk BSD).facter
?facter operatingsystem
harus melakukan apa yang Anda inginkan pada semua sistemfacter
yang dibuat untuk bekerja dengannya.facter
kode yang mendapatkan nama sistem operasi pada pastebin. Temukan di sini . Ia memeriksa banyak file berbeda untuk mendapatkan nama dengan andal.Jawaban:
lsb_release -a
kemungkinan akan menjadi pilihan terbaik Anda untuk mencari tahu informasi ini, dan mampu melakukannya secara konsisten.Sejarah LSB
The
lsb
dalam 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
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
Halaman yang sama ini juga termasuk skrip praktis yang mencoba mengkodifikasikan untuk yang di atas menggunakan
uname
perintah 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
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.
Potongan kode ini dapat dimasukkan ke sistem
/etc/bashrc
atau 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 --version
Anda akan mendapatkan distro yang dibangun untuk gcc, yang sama dengan sistem yang sedang berjalan.Fedora 14
CentOS 5.x
CentOS 6.x
Ubuntu 12.04
TL; DR;
Jadi yang mana yang harus saya gunakan? Saya cenderung mengikuti
lsb_release -a
distribusi Linux yang sering saya kunjungi (RedHat, Debian, Ubuntu, dll.). Untuk situasi di mana Anda mendukung sistem yang tidak menyediakan,lsb_release
saya 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
Inilah respons Rob
sumber
Karena Anda mungkin tidak akan dapat menginstal
facter
pada server jauh, Anda dapat meniru apa yang dilakukannya untuk menemukan nama OS. Kode Ruby untukoperatingsystem
fakta dapat ditemukan di sini di pastebin . Pada dasarnya, ia melihat melalui berbagai*-release
file dan lainnya untuk menentukan nama OS.Beberapa file yang dilihatnya:
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.sumber
... | uniq
?... | sort -u
.uniq
hanya menemukan elemen unik yang berdekatan.Jika Anda telah
python
menginstal (tidak masalah apakah Python 3 atau Python 2), Anda dapat mengetahui nama distribusi tanpa menciptakan kembali roda :sumber
/etc/issue
harus berisi informasi rilis. Saya cukup yakin saya pernah melihatnya di sistem Solaris. Ini file dari sistem Debian modern:/ etc / issue juga disebutkan dalam FHS (yang tidak hanya untuk sistem Linux), meskipun "opsional".
sumber
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./etc/issue
sama sekali tidak bisa diandalkan. (Saya telah melihat sistem dalam versi XY dengan/etc/issue
spanduk yang mengatakan bahwa mereka YZ mengikuti manajemen tambalan yang buruk. Ini dapat berisi apa saja.)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'.
sumber
Saya menggunakan perintah shell ini untuk mendapatkan string yang menunjukkan distribusi Linux:
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
sumber
for f in /etc/*{_version,...*-release}; do [ -f "$f" ] && echo ${f:5:${#f}-13} ; done
bekerja sama baiknya pada mereka semua? Saya tidak mengerti mengapa Anda pertama-find
tama harus memasukkan semua file/etc
.SNMP adalah protokol yang cukup di mana-mana sehingga dapat ditemukan di berbagai jenis distribusi GNU / Linux dan sistem UNIX.
The
system.sysDescr.0
objek dalam SNMPv2-MIB dapat membantu Anda mengetahui OS Anda menghubungi, disediakan ada sebuah daemon SNMP berjalan di sistem target:Halaman
snmpget(1)
manual menjelaskan cara mengambil nilai ini dengan contoh.sumber
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 ...
sumber
Dari apa yang saya dapat kumpulkan dari utas ini, Anda seharusnya bisa mendapatkan info dari hampir semua sistem menggunakan:
sumber
ls
. Dia lexing output darils
. Tapi ya ... Ini salah karena/etc/issue
sama 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.more reliable options
Yah, 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 yanglsb
menginstal secara default.Jika ada situasi yang membutuhkannya, Anda bisa mencari tahu dari jauh menggunakan snmpwalk [atau SNMP protocal secara umum]. Contohnya di bawah ini:
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.
sumber
snpwalk
? Di mana saya bisa menemukannya? Juga, yang hanya mencetak "Linux", tidak ada informasi distribusi (yang saya inginkan,uname
dapat memberi sayaLinux
). Apakah ini berfungsi pada OS non-Linux? Pada UNIX katakanlah, atau BSD atau OSX?uname -a
tidak 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).it also prints the kernel version which is really the only thing you need
Tapi ... itulah inti dari pertanyaan ini. Jika hanya itu yang Anda butuhkan, Anda bisa menggunakannyauname -a
. Kernel adalah bagian penting dari sistem operasi, tetapi ini bukan keseluruhan sistem operasi. Layout sistem file dan utilitas userland (mis. Manajer paket) penting.Gunakan
/etc/os-release
: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_release
yang sejauh ini merupakan jawaban teratas yang dipilih dari 2013sumber
/etc/os-release
akan 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./etc/os-release
tidak ada? Saya kira basis pengguna mereka sengsara dibandingkan dengan sistem di manalsb_release
tidak dikirimkan secara default. Setidaknya saya tidak bisa menggunakan jawaban Anda yang diterima di Fedora. Adapun komentar C, itu bukan milik saya, tetapi kutipan darisystemd
tautan 0pointer.de yang saya berikan.os-release
sebagian 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.lsb_release
dan Anda dapat mengganti C dengan Go dan mendapatkan argumen yang sama. Ongkos menjalankanlsb_release
jauh 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