ฉันจะรับชื่อระบบปฏิบัติการได้อย่างน่าเชื่อถือได้อย่างไร


69

ว่าฉันเข้าสู่ระบบระยะไกลฉันจะรู้ได้อย่างไรว่ามันกำลังทำงานอยู่? ใน Linuxes ที่ทันสมัยที่สุด (Linuces?) คุณมีlsb_releaseคำสั่ง:

$ lsb_release -ic    
Distributor ID: LinuxMint
Codename:       debian

/etc/lsb-releaseซึ่งเท่าที่ผมสามารถบอกได้เพียงแค่ให้ข้อมูลเช่นเดียวกับ เกิดอะไรขึ้นถ้าไฟล์นั้นไม่มีอยู่? ฉันดูเหมือนจะจำได้ว่าlsb_releaseคำสั่งนั้นค่อนข้างใหม่ดังนั้นถ้าฉันต้องใช้ระบบปฏิบัติการของระบบเก่า

ในกรณีใด ๆlsbย่อมาLinux Standard Baseดังนั้นผมสมมติว่ามันจะไม่ทำงานบนลินุกซ์ที่ไม่ใช่ Unices เท่าที่ฉันรู้ไม่มีวิธีรับข้อมูลนี้จากunameดังนั้นฉันจะได้รับสิ่งนี้ในระบบที่ไม่ได้ใช้lsb_releaseอย่างไร


1
unix.stackexchange.com/questions/6345/…สำหรับ Linux uname -sควรเพียงพอนอก Linux (คาดว่าอาจเป็นไปได้สำหรับ BSD)
Mat

คุณเช็คเอาท์facter? facter operatingsystemควรทำสิ่งที่คุณต้องการในทุกระบบที่facterได้ทำงานกับ
โจเซฟอาร์

@JosephR ดูดี แต่ไม่ได้ติดตั้งตามค่าเริ่มต้น
terdon

1
ฉันวางfacterรหัสที่ได้รับชื่อระบบปฏิบัติการบน pastebin พบว่ามันนี่ มันตรวจสอบไฟล์ต่าง ๆ มากมายเพื่อรับชื่อที่เชื่อถือได้
โจเซฟอาร์

@JosephR ว้าวนั่นเป็นไฟล์จำนวนมาก ฉันจะพอร์ตที่จะทุบตีเมื่อฉันได้รับโอกาสที่ควรพกพาพอ ขอบคุณ!
terdon

คำตอบ:


72

lsb_release -a เป็นไปได้ว่าจะเป็นตัวเลือกที่ดีที่สุดของคุณสำหรับการค้นหาข้อมูลนี้และความสามารถในการทำเช่นนั้นในลักษณะที่สอดคล้องกัน

ประวัติของ LSB

lsbในคำสั่งที่ยืนสำหรับโครงการลินุกซ์มาตรฐานฐานซึ่งเป็นโครงการที่ร่มรับการสนับสนุนจากมูลนิธิลินุกซ์เพื่อให้วิธีการทั่วไปสำหรับการทำชนิดพื้นฐานของสิ่งที่อยู่ในลินุกซ์ distros ต่างๆ

โครงการดังกล่าวเป็นความสมัครใจและผู้ค้าสามารถเข้าร่วมในโครงการในฐานะผู้ใช้และเป็นผู้อำนวยความสะดวกในข้อกำหนดต่าง ๆ ของโมดูลต่างๆที่ช่วยในการผลักดันมาตรฐานในลีนุกซ์รุ่นต่างๆ

ตัดตอนมาจากกฎบัตร

กลุ่มงาน LSB มีเป้าหมายหลักในการแก้ไขข้อกังวลทั้งสองนี้ เราเผยแพร่มาตรฐานที่อธิบายชุด API ขั้นต่ำที่การกระจายต้องสนับสนุนโดยการปรึกษากับผู้จำหน่ายหลัก ๆ เรายังมีการทดสอบและเครื่องมือที่ใช้วัดการสนับสนุนสำหรับมาตรฐานและเปิดใช้งานนักพัฒนาแอปพลิเคชันเพื่อกำหนดเป้าหมายชุดทั่วไป ในที่สุดผ่านการทดสอบของเราเราพยายามที่จะป้องกันไม่ให้เกิดความแตกต่างที่ไม่จำเป็นระหว่างการแจกแจง

ลิงค์ที่มีประโยชน์ที่เกี่ยวข้องกับ LSB

วิพากษ์วิจารณ์

มีปัญหามากมายเกี่ยวกับ LSB ที่ทำให้เกิดปัญหาสำหรับ distros เช่น Debian การบังคับใช้ RPM เป็นหนึ่งเดียว ดูบทความ Wikipedia สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้

โนเวลล์

หากคุณค้นหาคุณอาจเจอหน้าดูค่อนข้างล้าสมัยที่มีชื่อว่า: การตรวจจับ Underlying Linux Distroจาก Novell นี่คือหนึ่งในไม่กี่แห่งที่ฉันเคยเห็นรายการจริงที่แสดง distros สำคัญ ๆ และวิธีที่คุณสามารถตรวจสอบสิ่งที่คุณกำลังใช้งานอยู่

สิ่งที่สกัดมา

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

หน้าเดียวกันนี้ยังมีสคริปต์ที่ใช้งานง่ายซึ่งพยายามประมวลผลสำหรับข้างต้นโดยใช้เพียงunameคำสั่งวานิลลาและการมีหนึ่งในไฟล์ข้างต้น

หมายเหตุ:รายการนี้มีการลงวันที่ แต่คุณสามารถวาง distros ที่ล้าสมัยเช่น Mandrake จากรายการและแทนที่ด้วยทางเลือกอื่น สคริปต์ประเภทนี้อาจเป็นหนึ่งในวิธีการหากคุณพยายามที่จะรองรับชุดย่อยของ Solaris & Linux

Linux Mafia

การค้นหาเพิ่มเติมจะเปิดขึ้นหน้าต่อไปเก็บรักษาไว้ใน Linuxmafia.com หัวข้อ: / etc / ปล่อยเทียบเท่าทั้งเพลินุกซ์ (และอื่น ๆ Unix) การกระจาย นี่อาจเป็นรายการที่ละเอียดที่สุดที่ฉันเคยเห็น คุณสามารถประมวลรายการนี้ด้วยคำสั่ง case / switch และรวมเป็นส่วนหนึ่งของการกระจายซอฟต์แวร์ของคุณ

ในความเป็นจริงมีสคริปต์ที่ด้านล่างของหน้านั้นทำอย่างนั้น ดังนั้นคุณสามารถดาวน์โหลดและใช้สคริปต์เป็นบุคคลที่สามในการกระจายซอฟต์แวร์ของคุณ

ต้นฉบับ

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

หมายเหตุ:สคริปต์นี้ควรดูคุ้นเคยเป็นเวอร์ชั่นล่าสุดของ Novell!

สคริปต์ Legroom

อีกวิธีที่ฉันได้เห็นการว่าจ้างคือการม้วนสคริปต์ของคุณเองคล้ายกับวิธี Novell ด้านบน แต่ใช้ LSB แทน บทความนี้ชื่อ: Generic Method เพื่อตรวจสอบชื่อการแจกจ่าย Linux (หรือ UNIX)แสดงวิธีดังกล่าวหนึ่งวิธี

# 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

ก้อนของรหัสนี้อาจจะรวมเข้ากับระบบของหรือบางไฟล์ดังกล่าวซึ่งก็จะตั้งค่าตัวแปรสภาพแวดล้อม/etc/bashrc$DISTRO

GCC

gccเชื่อหรือไม่ว่าวิธีการที่จะทำให้การใช้งานของ หากคุณสอบถามคำสั่งgcc --versionคุณจะได้รับ distro ที่ gcc ถูกสร้างขึ้นมาซึ่งจะเหมือนกับระบบที่กำลังรันอยู่

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;

ฉันควรใช้อันไหนดี? ฉันมักจะไปกับlsb_release -aลีนุกซ์รุ่นใดก็ได้ที่ฉันใช้บ่อยๆ (RedHat, Debian, Ubuntu, ฯลฯ ) สำหรับสถานการณ์ที่คุณกำลังสนับสนุนระบบที่ไม่ได้จัดเตรียมไว้lsb_releaseฉันจะเปิดตัวเองในฐานะเป็นส่วนหนึ่งของการแจกจ่ายซอฟต์แวร์ที่ฉันกำลังให้บริการซึ่งคล้ายกับหนึ่งในสคริปต์ด้านบน

อัพเดท # 1: ติดตามด้วย SuSE

ในการพูดกับ @Nils ในความคิดเห็นด้านล่างเราได้พิจารณาแล้วว่าด้วยเหตุผลใดก็ตาม SLES11 ดูเหมือนจะปล่อย LSB ไม่ให้ติดตั้งโดยค่าเริ่มต้น มันเป็นเพียงการติดตั้งเสริมซึ่งดูเหมือนจะตอบโต้กับแพคเกจที่ให้คุณสมบัติที่สำคัญประเภทนี้

ดังนั้นฉันจึงมีโอกาสติดต่อกับใครบางคนจากโครงการ OpenSuSE เพื่อรับรู้ว่าทำไม

ข้อความที่ตัดตอนมาจากอีเมล

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

นี่คือคำตอบของ 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
หมายเหตุ: เพิ่งทำการตรวจสอบอย่างรวดเร็วบนเครื่องที่มี AIX และ SunOS ดูเหมือนว่าพวกเขาจะไม่ได้ติดตั้ง lsb_release (และหลังจากนี้เป็น Unix ไม่ใช่ Linux stack) ปัญหากับ gcc ก็คือตอนนี้บางคนเริ่มใช้เสียงดังกราว นอกจากนี้คุณไม่สามารถแน่ใจได้ว่า gcc ใดที่ใช้สร้าง (ในระบบที่ฉันทำงานด้วยมีอย่างน้อยสองสามรุ่นในแต่ละรายการ) ดังนั้นการลงคะแนนของฉันไปที่โซลูชัน Python เนื่องจากดูเหมือนว่าจะติดตั้งได้ทุกที่ตามค่าเริ่มต้น
elmo

@elmo - ใช่ LSB เป็นฐานมาตรฐาน Linux ดังนั้นฉันจะไม่คาดหวังว่า AIX หรือ SunOS จะมีมัน ประสบการณ์ของฉันกับ SunOS คือ 15 ปีขึ้นไปและผู้ค้าส่วนใหญ่ที่ฉันจัดการกับซอฟต์แวร์มักจะให้เชลล์สคริปต์ของตัวเองคล้ายกับที่ฉันอ้างถึงข้างต้น Python ไม่มีตัวเลือกจนกว่าจะถึง Solaris 11 และนี่คือสิ่งที่ทำให้ถั่วแตกยาก หากคุณจัดหาซอฟต์แวร์ที่จำเป็นต้องใช้งานบน Solaris 9, 10, 11, AIX และ Linux distros สองตัว (SUSE, Ubntu และ RHEL) คุณจะทำอย่างไร Python ไม่ใช่ตัวเลือกดังนั้นคุณจะเหลือสคริปต์เชลล์ที่เขียนด้วยมือ
slm

@elmo - gcc แม้ว่าตัวเลือกจะไม่น่าสนใจสำหรับฉันเช่นกัน ดูเหมือนว่ามีปัญหามากเกินไปฉันแสดงให้เห็นว่ามันเป็นเพียงทางเลือก
slm

@elmo - ดูรหัสหลังฟังก์ชั่นที่hg.python.org/cpython/file/2.7/Lib/platform.py#l259 เซอร์ไพรส์มาก ๆ ที่ใช้ LSB!
slm

@slm: ฉันสามารถเข้าถึงเครื่องที่มี SunOS 5.10 (ซึ่งฉันถือว่าเป็น 10 ในรายการของคุณ - ฉันไม่คุ้นเคยกับหมายเลขรุ่น / การประชุมของ Sun) และมันมี Python ฉันสามารถเข้าถึงเครื่องที่มี AIX 7 และมี Python เห็นได้ชัดว่าเครื่อง Linux มีมันยัง Python จึงดูเหมือนว่าเป็นตัวเลือกพกพามากที่สุด สำหรับ Sun ที่ต่ำกว่า 10 ฉันไม่แน่ใจว่าทำไมมันถึงไม่อนุญาตให้ติดตั้ง Python (การติดตั้งปัจจุบันที่ยอมรับว่าขาดเช่น ncurses และ ctypes ดังนั้นใครจะรู้) สำหรับ Python ที่ใช้ LSB นั้นไม่น่าแปลกใจเลยสำหรับ Linux หากเป็นแนวทางเริ่มต้น
elmo

16

เนื่องจากคุณอาจจะไม่สามารถติดตั้งfacterบนเซิร์ฟเวอร์ระยะไกลคุณสามารถเลียนแบบสิ่งที่ต้องทำเพื่อค้นหาชื่อระบบปฏิบัติการ รหัสทับทิมสำหรับoperatingsystemความเป็นจริงสามารถพบได้ที่นี่ใน Pastebin โดยทั่วไปมัน*-releaseจะทำการตรวจสอบไฟล์ต่างๆ และไฟล์อื่น ๆ เพื่อพิจารณาชื่อ OS

ไฟล์บางไฟล์ที่มีลักษณะ:

/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

grepฉันขอโทษถ้าคุณพบว่ารายการที่ซ้ำกันในรายการนี้ผมผลิตมันได้อย่างรวดเร็วด้วย ควรจะค่อนข้างง่าย (แม้ว่าจะค่อนข้างน่าเบื่อ) ในการพอร์ตนี้ไปยังสคริปต์เชลล์ POSIX


5
"ฉันขอโทษถ้าคุณพบรายการที่ซ้ำกันในรายการนี้ฉันสร้างมันได้อย่างรวดเร็วด้วย grep" ... | uniq?
new123456

@ new123456 ถูกต้อง ขอบคุณ คำสำคัญนี่คือ "ได้อย่างรวดเร็ว" :)
โจเซฟอาร์

ขออภัยที่ไม่ยอมรับสิ่งนี้ แต่คำตอบของ @ slm นั้นครอบคลุมเกินกว่าจะเพิกเฉยต่อ :)
terdon

3
แล้ว / etc / os-release เกี่ยวกับอะไร?
Yauhen Yakimovich

1
@ new123456 ... | sort -uเทคนิคที่ควรจะเป็น uniqค้นหาองค์ประกอบเฉพาะที่อยู่ติดกันเท่านั้น
คู่ปรับ Shot

9

ในกรณีที่คุณpythonติดตั้ง (ไม่สำคัญว่า Python 3 หรือ Python 2) คุณสามารถค้นหาชื่อการแจกจ่ายได้โดยไม่ต้องปรับแต่งวงล้อใหม่ :

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

ถ้าคุณอยากจะใช้ตัวเลือกนี้ให้แน่ใจว่าระบบปฏิบัติการของคุณได้รับการสนับสนุน: hg.python.org/cpython/file/2.7/Lib/platform.py#l259 ถ้าไม่ใช่คุณสามารถเพิ่มรายการเพิ่มเติมได้ที่: coderwall.com/p/cwrenq
slm

1
สิ่งนี้จะไม่ทำงานกับลีนุกซ์รุ่นเก่า ตัวอย่างเช่น: SuSE 7.0 มี Python 1.5.2 และมีการเพิ่มโมดูลแพลตฟอร์มก่อนการกำเนิดของ Python 2.3 ในปี 2003 ;-)
pefu

6

/etc/issueควรมีข้อมูลการเปิดตัว ฉันค่อนข้างแน่ใจว่าฉันเห็นมันในระบบ Solaris นี่คือไฟล์จากระบบ Debian ที่ทันสมัย:

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

$ 

/ etc / issue ยังถูกกล่าวถึงในFHS (ซึ่งไม่ได้เป็นระบบ Linux เท่านั้น) ถึงแม้ว่ามันจะเป็น "ตัวเลือก"


อานั่นเป็นคำแนะนำที่ดี +1 มันอาจไม่ทำงานแม้ว่าThe file /etc/issue is a text file which contains a message or system identification to be printed before the login prompt.มันจะขึ้นอยู่กับดูแลระบบที่จะเขียนสิ่งที่เขา / เธอต้องการ
terdon

2
/etc/issueไม่น่าเชื่อถืออย่างสมบูรณ์ (ผมเคยเห็นระบบในรุ่น XY กับ/etc/issueแบนเนอร์บอกว่าพวกเขาถูก YZ ต่อไปนี้การจัดการแก้ไขที่ไม่ดีมันสามารถมีอะไรอย่างแน่นอน..)
จ้า

ขอแนะนำให้เติมไฟล์นั้นด้วย สิ่งที่ชอบด้วยกฎหมายเช่นผู้ที่ได้รับอนุญาตให้เข้าสู่ระบบ
นิลส์

แนะนำโดยแนวทางความปลอดภัยและผู้ตรวจสอบ มีครั้งหนึ่งเคยมีคดีที่กฎหมายที่แฮ็กเกอร์ออกมาโดยไม่มีการลงโทษเพราะมีการต้อนรับใน / etc / ฉบับ
Nils

@drewbenn หน้า man พูดว่าสิ่งที่ฉันยกมาในความคิดเห็นแรกของฉันไม่มีอะไรเกี่ยวกับมันจำเป็นต้องมีข้อมูลระบบ มันมักจะทำ
terdon

6

คุณไม่สามารถรับชื่อ distro จากคำสั่งเดียวในทุก distros ได้อย่างน่าเชื่อถือ บางตัวพร้อมใช้งานผ่าน / etc / * - release และส่วนอื่น ๆ พร้อมใช้งานผ่านคำสั่ง 'lsb-release'


ขอบคุณ แต่ก็ไม่ได้ช่วยอะไรเมื่อมาถึง Unix หรืออื่น ๆ ที่ไม่ใช่ Linux * ระวัง
terdon

3

ฉันใช้คำสั่ง shell นี้เพื่อรับข้อความแสดงการกระจาย 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;

คำสั่งนี้ขึ้นอยู่กับคำตอบของโจเซฟอาร์และ slm

มันแค่ค้นหาไฟล์เช่น / etc / {osname} -release หรือ / etc / {osname} _version และพิมพ์ชื่อ os เฉพาะ

มันทำงานได้

  • CentOS (CentOS)
  • RedHat (redhat)
  • เดเบียน (เดเบียน)
  • ซุ้มประตู (ซุ้มโค้ง)
  • OpenSUSE (OpenSUSE)
  • Fedora (fedora)
  • Ubuntu (debian)

จะfor f in /etc/*{_version,...*-release}; do [ -f "$f" ] && echo ${f:5:${#f}-13} ; doneทำงานได้ไม่ดีเท่า ๆ กันสำหรับพวกเขาทั้งหมดหรือไม่ ฉันไม่เข้าใจว่าทำไมคุณถึงต้องการfindไฟล์ทั้งหมด/etcก่อน
terdon

ขอขอบคุณสำหรับความคิดเห็นของคุณ terdon แต่คำสั่งของคุณจะช่วยให้เส้นใน 0 อย่างน้อย OS เซ็นต์และ Fedora
scrutari

1
0pointer.de/blog/projects/os-release.htmlสำหรับคำถามที่พบบ่อย
weberjn

1

SNMPเป็นโพรโทคอลที่แพร่หลายมากพอที่จะพบได้ใน GNU / Linux ดิสทริบิวชันและระบบ UNIX หลายประเภท

system.sysDescr.0วัตถุในSNMPv2-MIBสามารถช่วยให้คุณหาที่ OS ที่คุณกำลังติดต่อให้มีการภูต SNMP ทำงานในระบบเป้าหมาย:

ลักษณะ

คำอธิบายที่เป็นข้อความของกิจการ ค่านี้ควรรวมถึงชื่อเต็มและการระบุรุ่นของประเภทฮาร์ดแวร์ของระบบปฏิบัติการซอฟต์แวร์ระบบและซอฟต์แวร์เครือข่าย

สถานะ: ปัจจุบัน

การเข้าถึง: อ่านอย่างเดียว

snmpget(1)manpage อธิบายถึงวิธีการเรียกค่านี้กับตัวอย่าง


ข้อเสียเปรียบคือว่านี่คือสตริงคงที่ที่ไม่ได้ดูแลโดยอัตโนมัติ
นิลส์

1

เนื่องจากไม่มีวิธีทั่วไปในการทำเช่นนั้นเราจึงกำหนด release-string ผ่านคำสั่ง snmp exec-command

ภารกิจของคำสั่งนั้นคือการพิมพ์ distro และระบบปฏิบัติการหลัก / รองปัจจุบัน

ใน RH และโคลนเราแยก / etc / redhat-release บน SuSe SuSe-release ...


เราคือใคร แล้วยูนิกซ์ล่ะ?
terdon

@terdon เราคือทีมของเราในที่ทำงาน บน Unix คุณสามารถทำเช่นเดียวกันหากส่วนขยายที่สอดคล้องกันถูกคอมไพล์เป็น snmpd
นิลส์

อ่าฉันคิดว่าคุณเป็นส่วนหนึ่งของกลุ่มมาตรฐานบางอย่าง :)
terdon

@terdon คุณเริ่มพัฒนามาตรฐานไซต์เมื่อคุณต้องจัดการเซิร์ฟเวอร์มากกว่า 80 แห่ง เราพัฒนาวิธีการนี้เพื่อให้เราสามารถตรวจสอบได้ว่าระบบปฏิบัติการล้าสมัย (EoL เล็กน้อยหรือแม้กระทั่งหมายเลขหลัก)
Nils

1

จากสิ่งที่ฉันจัดการเพื่อรวบรวมจากกระทู้นี้คุณควรจะสามารถรับข้อมูลจาก damn - ใกล้ระบบใด ๆ โดยใช้:

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
ไม่แยกวิเคราะห์ผลลัพธ์ของ ls!
heinrich5991

@ heinrich5991 ทำไมไม่?
Sammitch

lsในทางเทคนิคแล้วเขาไม่ได้แยกการส่งออกของ เขาlexinglsการส่งออกของ แต่ใช่ ... มันผิดเพราะ/etc/issueไม่น่าเชื่อถืออย่างสมบูรณ์ สมบูรณ์ไม่น่าเชื่อถือทั้งหมด นอกจากนี้สมมติฐานของคุณที่ว่าไม่มีใครอาจวางไฟล์ที่ไม่เกี่ยวข้องกับระบบปฏิบัติการที่ลงท้ายด้วย 'release' หรือ 'version' นั้นไม่ฉลาด
คู่ปรับ Shot

@ParthianShot ดังนั้นส่วนใหญ่คุณต้องการบ่นเกี่ยวกับ fallback ระดับที่สองและสามในกรณีที่ไม่มีตัวเลือกที่เชื่อถือได้มากขึ้น ?
Sammitch

@ Samitch more reliable optionsเอ่ออย่างหนึ่งมีเพียงทางเลือกเดียว ดังนั้นแม้สมมติว่าฉันเห็นด้วยกับข้อสันนิษฐานของคุณว่ามันน่าเชื่อถือมากขึ้น (ซึ่งฉันทำไม่ได้) อย่าเริ่มทำหลายอย่าง ประการที่สองถ้ามีคนใช้วิธีแก้ปัญหาของคุณจริงและมันล้มเหลวไปครึ่งเวลาพวกเขาจะไม่ได้รับการปลอบใจจากความจริงที่ว่ามันล้มเหลวใน "else if" ไม่มีการlsbติดตั้งระบบของฉันเป็นค่าเริ่มต้น
คู่ปรับ Shot

1

หากมีสถานการณ์ที่เรียกใช้คุณสามารถค้นหาจากระยะไกลโดยใช้ snmpwalk [หรือ SNMP protocal โดยทั่วไป] ตัวอย่างด้านล่าง:

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 วันที่ 14 ก.ย. 05:32:37 EDT 2013 x86_64

กุญแจสำคัญในความน่าเชื่อถือคือการตั้งค่า SNMP อย่างถูกต้องในสภาพแวดล้อมของคุณโฮสต์ทั้งหมดมี snmp ที่ทำงานด้วยการตั้งค่าสตริงชุมชนที่เหมาะสม


อะไรนะsnpwalk? หาได้ที่ไหน นอกจากนี้ที่เพิ่งพิมพ์ "Linux" ไม่มีข้อมูลการกระจาย (ซึ่งเป็นสิ่งที่ฉันต้องการunameสามารถให้ฉันLinux) ใช้ได้กับระบบปฏิบัติการที่ไม่ใช่ Linux หรือไม่ บน UNIX พูดหรือ BSD หรือ OSX?
terdon

snmpwalk เป็นโปรแกรมอรรถประโยชน์บรรทัดคำสั่ง Linux มันไม่เพียงแค่พิมพ์ "Linux" แต่ยังพิมพ์รุ่นเคอร์เนลซึ่งเป็นสิ่งเดียวที่คุณต้องการ หาก SNMP ได้รับการกำหนดค่าบนโฮสต์อื่น ๆ ของคุณไม่ว่าจะเป็น UNIX, BSD, OSX, snmpwalk จะทำงานได้เช่นเดียวกับมาตรฐาน (v1 | v2c | v3) และจะทำงานข้ามน้ำบนโฮสต์ Windows ด้วยเช่นกัน ดูเพิ่มเติม snmpget หรือ snmpgetnext
xpros

ฟังดูดี แต่คุณช่วยแก้ไขคำตอบของคุณและอธิบายว่าเราสามารถหาได้ที่ไหน มันไม่ได้เป็นตัวอย่างที่เขา Debian repos นอกจากนี้โปรดอธิบายว่ามันให้uname -aอะไรไม่ได้และจะบอกชื่อของการกระจายซึ่งเป็นคำถามที่เกี่ยวกับเรื่องนี้ได้อย่างไร อย่างไรก็ตามแม้ว่าสมมติว่ามันสามารถส่งคืนข้อมูลนี้ได้เนื่องจากเป็นยูทิลิตี้ที่ไม่ได้มาตรฐานและจำเป็นต้องติดตั้งฉันไม่แน่ใจว่ามันจะมีประโยชน์ที่นี่ แนวคิดคือการเข้าสู่ระบบระยะไกลและค้นหาระบบปฏิบัติการ (รวมถึงการกระจายหากเป็น Linux)
terdon

it also prints the kernel version which is really the only thing you needแต่ ... นั่นคือประเด็นทั้งหมดของคำถามนี้ uname -aหากที่เป็นจริงทั้งหมดที่คุณจำเป็นคุณก็สามารถใช้ เคอร์เนลเป็นส่วนสำคัญของระบบปฏิบัติการ แต่ไม่ใช่ระบบปฏิบัติการทั้งหมด โครงร่างระบบไฟล์และยูทิลิตี้ userland (เช่นตัวจัดการแพคเกจ) มีความสำคัญ
คู่ปรับ Shot

1

ใช้/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

เหตุผลมีการอธิบายอย่างดีในคำถามที่พบบ่อยโดยลิงค์http://0pointer.de/blog/projects/os-release.htmlให้บริการโดย@weberjn ฟรีในความคิดเห็นนี้ ฉันเพียงแค่รายการที่นี่หนึ่งอาร์กิวเมนต์กับการใช้lsb_releaseซึ่งเป็นคำตอบ upvoted ชั้นนำจาก 2013

มีเครื่องมือ lsb_release อยู่แล้วทำไมคุณไม่ใช้มัน?มันเป็นอินเทอร์เฟซที่แปลกมาก: เชลล์สคริปต์ที่คุณต้องเรียกใช้ (และเกิดจากอะซิงโครนัสจากรหัส C ของคุณแบบอะซิงโครนัส) และมันไม่ได้ถูกเขียนขึ้นเพื่อขยาย มันเป็นแพคเกจเสริมในการแจกแจงมากมายและไม่มีอะไรที่เรายินดีที่จะเรียกใช้เป็นส่วนหนึ่งของการเริ่มระบบก่อนเพื่อแสดงข้อความต้อนรับ (ในเวลาที่มีการบูทผู้ใช้ครั้งที่สองเราไม่ต้องการเรียกใช้เชลล์สคริปขนาดใหญ่สำหรับเรื่องเล็กน้อยเช่นการแสดงข้อความต้อนรับ) เครื่องมือ lsb_release สำหรับเราดูเหมือนจะเป็นความพยายามในการสรุปการตรวจสอบการแจกจ่ายซึ่งจำเป็นต้องสร้างมาตรฐานของการตรวจสอบการกระจาย มันเป็นเพียงส่วนต่อประสานที่ออกแบบมาไม่ดี ในความเห็นของเรามันมีการใช้เป็นส่วนต่อประสานเพื่อกำหนดรุ่น LSB เอง แต่ไม่ใช่สำหรับการตรวจสอบการแจกจ่ายหรือรุ่น


ขอบคุณ แต่คำตอบที่ได้รับการยอมรับแล้วพูดถึงเรื่องนี้ในท้ายที่สุดแล้วซึ่งอธิบายว่า/etc/os-releaseมันจะกลายเป็นมาตรฐานมากขึ้น อย่างไรก็ตามไฟล์นั้นอาจไม่ได้มีอยู่ในระบบทั้งหมดเสมอไปซึ่งเป็นสาเหตุที่คำตอบที่ยอมรับนั้นให้ทางเลือกที่พกพาได้มากกว่า นอกจากนี้ฉันไม่รู้ว่าทำไมคุณถึงพูดถึงรหัส C คำถามไม่เกี่ยวกับการเรียกอะไรจาก C.
terdon

@terdon ฉันแค่อยากรู้ว่าระบบเหล่านั้นในปี 2018 อยู่ที่ไหน/etc/os-releaseหายไป? ฉันเดาว่าฐานผู้ใช้ของพวกเขานั้นน่าสังเวชเมื่อเทียบกับระบบที่lsb_releaseไม่มีการจัดส่งตามค่าเริ่มต้น อย่างน้อยฉันก็ไม่สามารถใช้คำตอบที่ยอมรับใน Fedora ได้ สำหรับความคิดเห็น C ไม่ใช่ของฉัน แต่เป็นคำพูดจากsystemdลิงก์ 0pointer.de ที่ฉันให้ไว้
Anatoly techtonik

ใช่ฉันรู้ว่าไม่ใช่ของคุณฉันแค่สงสัยว่าทำไมคุณถึงรู้สึกว่าคำพูดเกี่ยวกับรหัส C มีความเกี่ยวข้อง และเท่าที่ฉันรู้os-releaseส่วนใหญ่หรือเฉพาะสิ่ง Linux ดูเหมือนว่ามันจะถูกกำหนดโดย FreeDesktop.org ดังนั้นบางที Unix รสชาติก็ใช้เช่นกัน แต่ฉันสงสัยว่าคุณจะพบได้ในส่วนใหญ่หรือในระบบฝังตัวหรือระบบที่ไม่ใช่ GUI เป็นต้นสุดท้ายอย่าลืมว่าหลายแห่ง ยังคงใช้เครื่องจักรที่เก่ามาก ๆ เพื่อความมั่นคง
terdon

คำพูดเป็นเรื่องเกี่ยวกับlsb_releaseและคุณสามารถแทนที่ C ด้วย Go และรับอาร์กิวเมนต์เดียวกัน โอเวอร์เฮดของการทำงานlsb_releaseนั้นสูงกว่าทั้งจุดความปลอดภัยและประสิทธิภาพมากกว่าการแยกวิเคราะห์ไฟล์สแตติก ฉันไม่เชื่อในเครื่องจักรที่เก่าแก่มากที่ให้ความเสถียร มีกำลังใจและเพื่อน ๆ ควรจะพาพวกเขาไปนานแล้วดังนั้นเพียงใช้/etc/os-release
Anatoly techtonik
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.