Làm thế nào tôi có thể có được tên hệ điều hành một cách đáng tin cậy?


69

Nói rằng tôi đang đăng nhập vào một hệ thống từ xa, làm sao tôi biết nó đang chạy cái gì? Trên hầu hết các Linux hiện đại (Linuces?), Bạn có lsb_releaselệnh:

$ lsb_release -ic    
Distributor ID: LinuxMint
Codename:       debian

Mà theo như tôi có thể nói chỉ cung cấp thông tin tương tự như /etc/lsb-release. Nếu tập tin đó không có mặt thì sao? Tôi dường như nhớ lại rằng lsb_releaselệnh này tương đối mới, vậy nếu tôi phải lấy HĐH của một hệ thống cũ thì sao?

Trong mọi trường hợp, lsblà viết tắt của Linux Standard Basevì vậy tôi cho rằng nó sẽ không hoạt động trên các Unice không phải là Linux. Theo như tôi biết, không có cách nào để có được thông tin này từ unameđó làm thế nào tôi có thể nhận được thông tin này trên các hệ thống không sử dụng lsb_release?


1
unix.stackexchange.com/questions/6345/ Khăn cho Linux. uname -sphải đủ bên ngoài Linux (có thể mong đợi cho các BSD).
Mat

Bạn đã kiểm tra facterchưa? facter operatingsystemnên làm những gì bạn muốn trên tất cả các hệ thống facterđã được thực hiện để làm việc với.
Joseph R.

@JosephR. Có vẻ tốt nhưng không được cài đặt theo mặc định.
terdon

1
Tôi đã dán factermã lấy tên hệ điều hành trên pastebin. Tìm nó ở đây . Nó kiểm tra nhiều tập tin khác nhau để có được tên đáng tin cậy.
Joseph R.

@JosephR. wow, đó là rất nhiều tập tin. Tôi sẽ chuyển sang bash khi tôi có cơ hội, nó sẽ đủ di động. Cảm ơn!
terdon

Câu trả lời:


72

lsb_release -a có thể sẽ là lựa chọn tốt nhất của bạn để tìm ra thông tin này và có thể làm điều đó một cách nhất quán.

Lịch sử của LSB

Lệnh lsbtrong đó là viết tắt của Dự án Cơ sở Tiêu chuẩn Linux , một dự án ô được tài trợ bởi Quỹ Linux để cung cấp các phương pháp chung để thực hiện các loại điều cơ bản trên các bản phân phối Linux khác nhau.

Dự án là tự nguyện và các nhà cung cấp có thể tham gia vào dự án với tư cách là người dùng và cũng là người hỗ trợ các thông số kỹ thuật khác nhau xung quanh các mô-đun khác nhau giúp thúc đẩy tiêu chuẩn hóa trong các bản phân phối Linux khác nhau.

trích từ điều lệ

Nhóm làm việc LSB, như là mục tiêu cốt lõi của nó, để giải quyết hai mối quan tâm này. Chúng tôi xuất bản một tiêu chuẩn mô tả bộ API tối thiểu mà một bản phân phối phải hỗ trợ, tham khảo ý kiến ​​với các nhà cung cấp phân phối chính. Chúng tôi cũng cung cấp các thử nghiệm và công cụ đo lường sự hỗ trợ cho tiêu chuẩn và cho phép các nhà phát triển ứng dụng nhắm mục tiêu vào bộ chung. Cuối cùng, thông qua công việc thử nghiệm của chúng tôi, chúng tôi tìm cách ngăn chặn sự phân kỳ không cần thiết giữa các bản phân phối.

Các liên kết hữu ích liên quan đến LSB

Phê bình

Có một số vấn đề với LSB khiến nó trở thành vấn đề đối với các bản phát hành như Debian. Việc sử dụng bắt buộc của RPM là một. Xem bài viết Wikipedia để biết thêm về vấn đề này .

Tiểu thuyết

Nếu bạn tìm kiếm, bạn có thể sẽ bắt gặp một trang tìm kiếm khá cũ có tiêu đề: Phát hiện phần mềm phân phối Linux từ Novell. Đây là một trong số ít những nơi tôi đã thấy một danh sách thực tế hiển thị một số phân phối chính và cách bạn có thể phát hiện những gì bên dưới bạn đang sử dụng.

đoạn trích

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

Trang này cũng bao gồm một tập lệnh tiện dụng cố gắng mã hóa cho phần trên bằng cách sử dụng unamecác lệnh vanilla và sự hiện diện của một trong các tệp trên.

LƯU Ý: Danh sách này là ngày nhưng bạn có thể dễ dàng loại bỏ các bản phát hành ngày như Mandrake khỏi danh sách và thay thế chúng bằng các lựa chọn thay thế. Loại tập lệnh này có thể là một cách tiếp cận nếu bạn đang cố gắng hỗ trợ một lượng lớn các biến thể Solaris & Linux.

Linux Mafia

Tìm kiếm nhiều hơn sẽ bật lên trang sau được duy trì trên Linuxmafia.com, có tiêu đề: / etc / phát hành tương đương cho các bản phân phối Linux (và Unix khác) . Đây có lẽ là danh sách đầy đủ nhất cho đến nay mà tôi đã thấy. Bạn có thể mã hóa danh sách này bằng câu lệnh case / switch và đưa nó vào danh sách phân phối phần mềm của bạn.

Trong thực tế, có một kịch bản ở dưới cùng của trang đó thực hiện chính xác điều đó. Vì vậy, bạn có thể chỉ cần tải xuống và sử dụng tập lệnh với tư cách là bên thứ 3 để phân phối phần mềm của bạn.

kịch bản

#!/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}

LƯU Ý: Kịch bản này sẽ trông quen thuộc, đây là phiên bản cập nhật của Novell!

Kịch bản chân

Một phương pháp khác tôi từng thấy được sử dụng là cuộn tập lệnh của riêng bạn, tương tự như phương pháp Novell ở trên nhưng sử dụng LSB thay thế. Bài viết này có tiêu đề: Phương pháp chung để xác định tên phân phối Linux (hoặc UNIX) , hiển thị một phương thức như vậy.

# 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

Đoạn mã này có thể được đưa vào một hệ thống /etc/bashrchoặc một số tệp như vậy sau đó sẽ đặt biến môi trường $DISTRO.

gcc

Tin hay không một phương pháp khác là sử dụng gcc. Nếu bạn truy vấn lệnh, gcc --versionbạn sẽ nhận được bản phân phối mà gcc được xây dựng, nó hoàn toàn giống với hệ thống mà nó đang chạy.

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;

Vậy tôi nên dùng cái nào? Tôi có xu hướng đi cùng với lsb_release -abất kỳ bản phân phối Linux nào mà tôi thường thấy (RedHat, Debian, Ubuntu, v.v.). Đối với các tình huống mà bạn hỗ trợ các hệ thống không cung cấp, lsb_releasetôi sẽ tự mình thực hiện như một phần của phân phối phần mềm mà tôi đang cung cấp, tương tự như một trong các tập lệnh trên.

CẬP NHẬT # 1: Theo dõi với SuSE

Khi nói chuyện với @Nils trong các bình luận bên dưới, người ta xác định rằng vì bất kỳ lý do gì, SLES11 dường như bỏ LSB khỏi cài đặt theo mặc định. Nó chỉ là một cài đặt tùy chọn, dường như truy cập một gói cung cấp loại tính năng chính này.

Vì vậy, tôi đã nhân cơ hội liên hệ với ai đó từ dự án OpenSuSE để hiểu lý do tại sao.

trích đoạn 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

Đây là câu trả lời của 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 

1
Lưu ý: Chỉ cần kiểm tra nhanh trên các máy có AIX và SunOS. Họ dường như không cài đặt lsb_release (và sau tất cả, đây là Unix không phải là ngăn xếp Linux). Vấn đề với gcc là một số ppl bây giờ bắt đầu sử dụng tiếng kêu. Ngoài ra, bạn không bao giờ có thể chắc chắn gcc nào đã được sử dụng để xây dựng (trên các hệ thống tôi làm việc với ít nhất một vài phiên bản trên mỗi hệ thống). Vì vậy, phiếu bầu của tôi thuộc về giải pháp Python vì nó dường như được cài đặt ở mọi nơi theo mặc định.
elmo

@elmo - vâng LSB là Cơ sở Tiêu chuẩn của Linux, vì vậy tôi sẽ không mong đợi AIX hoặc SunOS sẽ có nó. Kinh nghiệm của tôi với SunOS là hơn 15 năm và phần lớn các nhà cung cấp có phần mềm tôi xử lý thường sẽ cung cấp tập lệnh shell riêng tương tự như tập lệnh tôi đã giới thiệu ở trên. Cho đến Solaris 11, Python không phải là một lựa chọn. Và đây là những gì làm cho nó một hạt khó nứt. Nếu bạn cung cấp phần mềm cần chạy trên Solaris 9, 10, 11, AIX và một vài bản phân phối Linux (SUSE, Ubntu và RHEL), bạn sẽ làm gì? Python không phải là một tùy chọn, vì vậy bạn còn lại với một tập lệnh shell được mã hóa bằng tay.
slm

@elmo - gcc mặc dù, một tùy chọn, dường như cũng không hấp dẫn đối với tôi. Có vẻ như quá nhiều vấn đề, tôi đã chứng minh nó chỉ là một lựa chọn.
slm

@elmo - hãy xem mã đằng sau chức năng đó, hg.python.org/cpython/file/2.7/Lib/pl platform.py # l259 . Thật ngạc nhiên khi sử dụng LSB!
slm

@slm: Tôi có quyền truy cập vào máy với SunOS 5.10 (mà tôi giả sử là 10 trong danh sách của bạn - Tôi không quen thuộc với số phiên bản / quy ước của Sun) và nó có Python. Tôi có quyền truy cập vào máy với AIX 7 và nó có Python. Máy Linux rõ ràng cũng có nó. Vì vậy, Python vẫn giống như hầu hết các lựa chọn di động. Đối với Sun dưới 10, tôi không chắc tại sao nó không cho phép cài đặt Python (phải thừa nhận rằng cài đặt hiện tại đang thiếu, ví dụ như ncurses và ctypes, vì vậy ai biết được). Đối với Python sử dụng LSB, không có gì đáng ngạc nhiên đối với Linux nếu đó là cách tiếp cận mặc định.
elmo

16

Vì có thể bạn sẽ không thể cài đặt factertrên một máy chủ từ xa, bạn có thể bắt chước những gì nó làm để tìm tên hệ điều hành. Mã Ruby cho operatingsystemthực tế có thể được tìm thấy ở đây trên pastebin . Về cơ bản, nó xem qua các *-releasetệp khác nhau và các tệp khác để xác định tên hệ điều hành.

Một số tệp nó nhìn vào:

/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

Tôi xin lỗi nếu bạn tìm thấy bản sao trong danh sách này, tôi đã nhanh chóng tạo ra nó grep. Nên khá dễ dàng (mặc dù hơi tẻ nhạt) để chuyển cái này sang tập lệnh shell POSIX.


5
"Tôi xin lỗi nếu bạn tìm thấy bản sao trong danh sách này, tôi đã sản xuất nó nhanh chóng với grep." ... | uniq?
new123456

@ new123456 Đúng. Cảm ơn. Từ khóa ở đây là "nhanh chóng" :)
Joseph R.

Xin lỗi về việc không chấp nhận điều này nhưng câu trả lời của @ slm chỉ là quá toàn diện để bỏ qua :).
terdon

3
Điều gì về / etc / os-phát hành?
Yauhen Yakimovich

1
@ new123456 Về mặt kỹ thuật, nên như vậy ... | sort -u. uniqchỉ tìm thấy các yếu tố độc đáo liền kề.
Bắn Parthian

9

Trong trường hợp bạn đã pythoncài đặt (không quan trọng là Python 3 hay Python 2), bạn có thể tìm ra tên phân phối mà không cần phát minh lại bánh xe :

python -c "import platform;print(platform.linux_distribution()[0])"

Nếu bạn muốn sử dụng tùy chọn này, hãy đảm bảo hệ điều hành của bạn được hỗ trợ: hg.python.org/cpython/file/2.7/Lib/pl platform.py # l259 . Nếu không, bạn có thể thêm nhiều hơn vào danh sách: coderwall.com/p/cwrenq
slm

1
Điều này sẽ không hoạt động với các bản phân phối Linux cổ. Ví dụ: SuSE 7.0 có Python 1.5.2 và mô-đun nền tảng đã được thêm vào trước khi Python 2.3 ra đời năm 2003 ;-)
pefu

6

/etc/issuenên chứa thông tin phát hành. Tôi khá chắc chắn tôi đã nhìn thấy nó trên các hệ thống Solaris. Đây là tập tin từ một hệ thống Debian hiện đại:

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

$ 

/ etc / vấn đề cũng được đề cập trong FHS (vốn không chỉ dành cho các hệ thống Linux), mặc dù nó là "tùy chọn".


À, đó là một gợi ý hay, +1. Nó có thể không phải lúc nào cũng hoạt động mặc dù The file /etc/issue is a text file which contains a message or system identification to be printed before the login prompt.có vẻ như tùy thuộc vào sysadmin để viết bất cứ điều gì anh ấy / cô ấy mong muốn.
terdon

2
/etc/issuelà hoàn toàn không đáng tin cậy. (Tôi đã thấy các hệ thống trong phiên bản XY có /etc/issuebiểu ngữ nói rằng chúng là YZ sau khi quản lý bản vá xấu. Nó có thể chứa hoàn toàn mọi thứ.)
Mat

Đó là khuyến cáo để điền vào tập tin đó. công cụ pháp lý như ai được phép đăng nhập.
Nils

Được đề xuất bởi hướng dẫn bảo mật và kiểm toán viên. Đã từng có một trường hợp tại pháp luật mà một tin tặc ra đi mà không bị trừng phạt, bởi vì đã có CHÀO MỪNG trong / etc / vấn đề
Nils

@drewbenn trang người đàn ông nói những gì tôi đã trích dẫn trong bình luận đầu tiên của tôi, không có gì về nhu cầu chứa thông tin hệ thống. Nó chỉ thường làm.
terdon

6

Bạn không thể lấy tên distro từ một lệnh duy nhất trên tất cả các distro. Một số có sẵn thông qua / etc / * - phát hành và một số khác có sẵn thông qua lệnh 'lsb-release'.


Cảm ơn nhưng không phải là một trợ giúp khi nói đến Unix hoặc bất kỳ Linux * nix nào khác.
terdon

3

Tôi đã sử dụng lệnh shell này để lấy một chuỗi biểu thị phân phối 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;

lệnh này dựa trên câu trả lời của Joseph R. và slm.

Nó chỉ tìm kiếm các tệp như / etc / {osname} -release hoặc / etc / {osname} _version và in tên os cụ thể.

Nó làm việc trong

  • CentOS (centos)
  • RedHat (redhat)
  • Debian (debian)
  • Vòm (vòm)
  • OpenSUSE (OpenSUSE)
  • Fedora (fedora)
  • Ubuntu (debian)

Sẽ không for f in /etc/*{_version,...*-release}; do [ -f "$f" ] && echo ${f:5:${#f}-13} ; donelàm việc tốt như nhau trên tất cả chúng? Tôi không hiểu lý do tại sao bạn đầu tiên findtất cả các tập tin trong /etc.
terdon

Cảm ơn phản hồi của bạn, terdon, nhưng lệnh của bạn đưa ra 0 dòng trong ít nhất Cent OS và Fedora
Scrutari

1
0pulum.de/blog/projects/os-release.html cho Câu hỏi thường gặp
weberjn

1

SNMP là một giao thức đủ phổ biến để có thể tìm thấy trong nhiều loại phân phối GNU / Linux và các hệ thống UNIX khác nhau.

Đối system.sysDescr.0tượng trong SNMPv2-MIB có thể giúp bạn tìm ra hệ điều hành nào bạn đang liên hệ, miễn là có một trình nền SNMP đang chạy trong hệ thống đích:

Sự miêu tả

Một mô tả văn bản của các thực thể. Giá trị này phải bao gồm tên đầy đủ và nhận dạng phiên bản của loại phần cứng, hệ điều hành phần mềm và phần mềm mạng.

Tình trạng: hiện tại

Truy cập: chỉ đọc

Trang này snmpget(1)giải thích cách lấy giá trị này bằng các ví dụ.


Hạn chế là đây là một chuỗi tĩnh không được duy trì tự động.
Nils

1

Vì không có cách chung để làm như vậy, chúng tôi đã xác định chuỗi phát hành thông qua lệnh thực thi snmp.

Nhiệm vụ của lệnh đó là in ra bản phân phối và phiên bản chính / phụ hiện tại của os.

Trên RH và bản sao, chúng tôi phân tích / etc / redhat-phát hành, trên SuSe SuSe-phát hành ...


Chúng ta là ai'? Còn Unix thì sao?
terdon

@terdon chúng tôi là nhóm của chúng tôi tại nơi làm việc. Trên Unix bạn có thể làm tương tự nếu phần mở rộng tương ứng được biên dịch thành snmpd.
Nils

À, tôi nghĩ bạn là một phần của nhóm tiêu chuẩn :)
terdon

@terdon Bạn bắt đầu phát triển các tiêu chuẩn trang web khi bạn phải quản lý hơn 80 máy chủ. Chúng tôi đã phát triển phương pháp này để chúng tôi có thể theo dõi thời tiết os đã lỗi thời (EoL hoặc số chính thậm chí)
Nils

1

Từ những gì tôi đã quản lý để lượm lặt được từ chủ đề này, bạn sẽ có thể lấy thông tin từ gần bất kỳ hệ thống nào bằng cách sử dụng:

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

2
không phân tích đầu ra của ls!
heinrich5991

@ heinrich5991 tại sao không?
Sammitch

Về mặt kỹ thuật, anh ta không phân tích cú pháp đầu ra ls. Anh ấy lexing đầu ra của ls. Nhưng vâng ... Điều này là sai vì /etc/issuehoàn toàn không đáng tin cậy. Hoàn toàn, hoàn toàn, hoàn toàn không đáng tin cậy. Ngoài ra, giả định của bạn rằng không ai có thể đặt tệp không liên quan đến os kết thúc bằng 'phát hành' hoặc 'phiên bản' là không khôn ngoan.
Bắn Parthian

@ParthianShot Vì vậy, chủ yếu bạn muốn phàn nàn về mức dự phòng thứ hai và thứ ba trong trường hợp các tùy chọn đáng tin cậy hơn không có sẵn?
Sammitch

@Sammitch more reliable optionsVâng, đối với một điều, chỉ có một lựa chọn. Vì vậy, ngay cả khi giả sử tôi đồng ý với giả định của bạn rằng nó đáng tin cậy hơn (mà tôi không), chúng ta đừng bắt đầu đa nguyên hóa mọi thứ. Thứ hai, nếu ai đó thực sự sử dụng giải pháp của bạn và nó hoàn toàn thất bại trong một nửa thời gian, họ sẽ không được an ủi bởi thực tế là nó đã thất bại trong "nếu khác". Không có hệ thống nào của tôi lsbđược cài đặt theo mặc định.
Bắn Parthian

1

Nếu một tình huống được yêu cầu, bạn có thể tìm ra từ xa bằng cách sử dụng snmpwalk [hoặc nói chung là SNMP]. Một ví dụ dưới đây:

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

OUPUT: sysDescr.0 = STRING: ví dụ Linux.hostname.com 2.6.32-358.23.2.el6.x86_64 # 1 SMP Sat ngày 14 tháng 9 05:32:37 EDT 2013 x86_64

Chìa khóa cho độ tin cậy là liệu SNMP có được thiết lập chính xác trong môi trường của bạn hay không, tất cả các máy chủ đều có snmp chạy với thiết lập chuỗi cộng đồng phù hợp.


Có gì snpwalk? Tôi có thể tìm thấy nó ở đâu? Ngoài ra, chỉ in "Linux", không có thông tin phân phối (đó là những gì tôi muốn, unamecó thể cung cấp cho tôi Linux). Nó có hoạt động trên các hệ điều hành không phải Linux không? Trên UNIX nói, hay BSD hay OSX?
terdon

snmpwalk là một tiện ích dòng lệnh Linux. Nó không chỉ in "Linux" mà còn in phiên bản kernel, đây thực sự là thứ duy nhất bạn cần. Nếu SNMP được định cấu hình trên các máy chủ khác của bạn, cho dù đó là UNIX, BSD, OSX, snmpwalk sẽ hoạt động vì nó là một tiêu chuẩn (v1 | v2c | v3) và thậm chí nó cũng sẽ hoạt động trên mặt nước trên các máy chủ Windows. Xem thêm snmpget hoặc snmpgetnext.
xpros

Nghe có vẻ hay nhưng bạn có thể vui lòng chỉnh sửa câu trả lời của mình và giải thích nơi chúng tôi có thể tìm thấy nó. Chẳng phải là bản repos của Debian chẳng hạn. Ngoài ra, vui lòng giải thích những gì nó mang uname -alại không và làm thế nào nó có thể cho tôi biết tên của bản phân phối đó là câu hỏi gì. Dù sao, ngay cả khi giả sử nó có thể trả về thông tin này, vì nó là một tiện ích không chuẩn và cần được cài đặt, tôi không chắc nó sẽ hữu ích ở đây. Ý tưởng là đăng nhập vào một hệ thống từ xa và tìm hiểu HĐH (bao gồm cả phân phối nếu là Linux).
terdon

it also prints the kernel version which is really the only thing you needNhưng ... đó là toàn bộ vấn đề của câu hỏi này. Nếu đó thực sự là tất cả những gì bạn cần, bạn có thể sử dụng uname -a. Nhân là một phần quan trọng của hệ điều hành, nhưng nó không phải là toàn bộ hệ điều hành. Bố cục hệ thống tập tin và các tiện ích vùng người dùng (ví dụ: trình quản lý gói) có vấn đề.
Bắn Parthian

1

Sử dụng /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

Những lý do được giải thích rõ trong Câu hỏi thường gặp bởi một liên kết http://0pulum.de/blog/projects/os-release.html được cung cấp một cách miễn phí bởi @weberjn trong bình luận này . Tôi chỉ liệt kê ở đây một đối số chống lại việc sử dụng lsb_releasecâu trả lời được nêu lên hàng đầu từ năm 2013.

Đã có công cụ lsb_release cho việc này, tại sao bạn không sử dụng nó?Chà, đó là một giao diện rất lạ: một tập lệnh shell mà bạn phải gọi (và do đó sinh ra không đồng bộ từ mã C của bạn) và nó không được viết để có thể mở rộng. Đó là một gói tùy chọn trong nhiều bản phân phối và không có gì chúng tôi vui lòng gọi như một phần của khởi động sớm để hiển thị thông báo chào mừng. (Trong thời gian có thời gian khởi động không gian người dùng phụ thứ hai, chúng tôi thực sự không muốn gọi một tập lệnh shell lớn cho sự tầm thường như hiển thị thông báo chào mừng). Công cụ lsb_release đối với chúng tôi dường như là một nỗ lực trừu tượng hóa kiểm tra phân phối, trong đó tiêu chuẩn hóa kiểm tra phân phối là cần thiết. Nó chỉ đơn giản là một giao diện được thiết kế tồi. Theo chúng tôi, nó được sử dụng như một giao diện để xác định phiên bản LSB, nhưng không phải để kiểm tra phân phối hoặc phiên bản.


Cảm ơn, nhưng câu trả lời được chấp nhận đã giải quyết điều này trong đoạn trích cuối cùng giải thích rằng điều đó /etc/os-releasesẽ trở nên chuẩn hơn. Tuy nhiên, tệp đó không phải lúc nào cũng có trên tất cả các hệ thống, đó là lý do tại sao câu trả lời được chấp nhận cung cấp nhiều lựa chọn thay thế di động hơn. Ngoài ra, tôi không biết tại sao bạn lại đề cập đến mã C, câu hỏi không phải là về việc gọi bất cứ thứ gì từ C.
terdon

@terdon Tôi chỉ tò mò những hệ thống đó trong năm 2018 /etc/os-releasevắng mặt ở đâu? Tôi đoán rằng cơ sở người dùng của họ là khốn khổ so với các hệ thống lsb_releasekhông được vận chuyển theo mặc định. Ít nhất tôi không thể sử dụng câu trả lời được chấp nhận của bạn trên Fedora. Đối với nhận xét C, nó không phải là của tôi, mà là một trích dẫn từ systemdliên kết 0pulum.de mà tôi đã cung cấp.
anatoly techtonik

Vâng, tôi biết nó không phải của bạn, tôi chỉ tự hỏi tại sao bạn cảm thấy rằng một trích dẫn về mã C có liên quan. Và theo như tôi biết, os-releasehầu hết hoặc độc quyền là một thứ của Linux. Nó dường như được định nghĩa bởi FreeDesktop.org, vì vậy có thể một số hương vị Unix cũng sử dụng nó, nhưng tôi nghi ngờ bạn sẽ tìm thấy nó trong hầu hết hoặc trong các hệ thống nhúng hoặc bất kỳ hệ thống không phải GUI nào, v.v ... Cuối cùng, đừng quên rằng nhiều nơi vẫn sử dụng máy rất cũ vì lý do ổn định.
terdon

Trích dẫn là về lsb_releasevà bạn có thể thay thế C bằng Go và nhận được cùng một đối số. Chi phí hoạt động lsb_releasecao hơn nhiều so với cả điểm bảo mật và hiệu suất so với chỉ phân tích tệp tĩnh. Tôi không tin vào những máy móc cũ kỹ mang đến sự ổn định. Heartbleed và bạn bè nên đã đưa họ đi từ lâu, vì vậy chỉ cần sử dụng/etc/os-release
anatoly techtonik
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.