จะทราบได้อย่างไรว่าแพลตฟอร์มที่ทำงานคือ Ubuntu หรือ CentOS ด้วยความช่วยเหลือของสคริปต์ Bash?


39

ฉันรู้ว่าคำสั่งเพื่อตรวจสอบชื่อของเครื่อง Linux ที่ทำงานบนเครื่องของฉัน ตัวอย่างเช่น:

อูบุนตู

cat /etc/version

CentOS

cat /etc/issue

ฉันจะรับเอาต์พุตจากเทอร์มินัลและเปรียบเทียบเพื่อดูว่าเป็น UBUNTU หรือ CENTOS และดำเนินการคำสั่งต่อไปนี้ได้อย่างไร?

apt-get install updates 

หรือ

yum update

Ubuntu 14.04

cat /etc/issue

2
ยินดีต้อนรับสู่ถาม Ubuntu ได้โปรดคุณใช้เวลาอ่านบ้างฉันควรทำอย่างไรเมื่อมีคนตอบคำถามของฉัน
Sylvain Pineau

คำตอบ:


53

น่าเสียดายที่ไม่มีวิธีที่แน่นอนในการรับชื่อการแจกจ่าย distros สำคัญส่วนใหญ่เคลื่อนไปสู่ระบบที่พวกเขาใช้/etc/os-releaseเพื่อเก็บข้อมูลนี้ ดิสทริบิวชันที่ทันสมัยส่วนใหญ่ยังมีlsb_releaseเครื่องมือ แต่ค่าเหล่านี้ไม่ได้ติดตั้งตามค่าเริ่มต้น ดังนั้นนี่คือวิธีการบางอย่างที่คุณสามารถใช้:

  1. ใช้ /etc/os-release

    awk -F= '/^NAME/{print $2}' /etc/os-release
  2. ใช้lsb_releaseเครื่องมือหากมี

    lsb_release -d | awk -F"\t" '{print $2}'
  3. ใช้สคริปต์ที่ซับซ้อนยิ่งขึ้นซึ่งควรใช้กับ distros ส่วนใหญ่:

    # 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
    
  4. แยกวิเคราะห์ข้อมูลรุ่นgccหากติดตั้งไว้:

    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.
    

    Ubuntu 14.04

    $ gcc --version
    gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
    Copyright (C) 2013 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    

นี้ได้รับการคัดลอกพื้นโดยตรงจากที่ดีของ @ SLM ตอบคำถามของฉันที่นี่


"น่าเสียดายที่ไม่มีวิธีที่แน่นอนในการรับชื่อการแจกจ่าย" <— นี่ไม่ใช่กรณีทั้งหมด ตัวอย่างเช่นSylvain Pineauจัดแสดงหนึ่งซับในที่น่าสงสัยสอบถามประเภทแพลตฟอร์มปัจจุบันโดยการเลื่อนไปที่ Python ซึ่งติดตั้งมาพร้อมกับแพลตฟอร์มส่วนใหญ่ (รวมถึง Ubuntu) เชลล์สคริปต์ไม่ควรพยายามสืบค้นข้อมูลเมตาของแพลตฟอร์มด้วยการทดสอบระดับต่ำแบบพกพาที่ใช้ในคำตอบนี้
เซซิลแกงกะหรี่

Gawk ไม่ได้ติดตั้งใน Debian โดยค่าเริ่มต้น
Ville Laitila

@VilleLaitila ฉันกลัวว่ามันไม่เกี่ยวข้องกับที่นี่เนื่องจากเว็บไซต์นี้เป็นเพียงเกี่ยวกับ Ubuntu แต่ไม่มีอะไรที่เฉพาะเจาะจงเพ่งพิศที่นี่ดังนั้นawkหรือmawkหรือการดำเนินการอื่น ๆ จะทำงานได้เช่นกัน
terdon

การใช้งานที่เฉพาะเจาะจงมากขึ้นlsb_release:lsb_release -d | awk -F"\t" '{print $2}' | awk -F " " '{print $1}'
NerdOfCode

@NerdOfCode หากคุณต้องการหมายเลขรีลีสให้ทำlsb_release -d | awk '{print $3}'หรือgrep -oP 'VERSION="\K\S+' /etc/os-releaseไม่จำเป็นต้องให้ไพพ์สองเท่าติดตั้ง awk
terdon

25

คุณไม่จำเป็นต้องทุบตีเพื่อทำงานดังกล่าวและฉันขอแนะนำให้ใช้วิธีการระดับสูงเพื่อหลีกเลี่ยงการจัดการกับไฟล์เช่น/etc/versionและ/etc/issue(ฉันไม่มี / etc / version ใน 13.10)

ดังนั้นคำแนะนำของฉันคือใช้คำสั่งนี้แทน:

python -mplatform | grep -qi Ubuntu && sudo apt-get update || sudo yum update

โมดูลแพลตฟอร์มหลามจะทำงานกับทั้งสองระบบส่วนที่เหลือของคำสั่งจะตรวจสอบว่า Ubuntu ส่งคืนโดยไพ ธ อนและทำงานapt-getอื่นyumหรือไม่


เพิ่ม-iการgrepช่วยเหลือพฤษภาคม
coanor

8

นี่เป็นคำตอบง่ายๆที่ฉันพบว่าทำงานได้กับทุกเวอร์ชั่นของ Ubuntu / CentOS / RHEL โดยการปรากฏตัวของไฟล์ (ไม่ใช่ความล้มเหลวแน่นอนว่าถ้ามีคนวางสุ่ม / etc / redhat-release บนกล่อง Ubuntu ฯลฯ ):

if [ -f /etc/redhat-release ]; then
  yum update
fi

if [ -f /etc/lsb-release ]; then
  apt-get update
fi

ในอูบุนตูของฉันไม่มี / etc / lsb-release
noonex

3
ฉันไม่ได้ไป -1 แต่คำตอบนี้ไม่ถูกต้องในกรณีอย่างน้อยหนึ่ง: /etc/lsb-releaseอยู่บน CloudLinux (CentOS) 6.8 จึงจะกลับทั้งสองและyum apt-get
dhaupin

5

ใช้Chefสำหรับงานเหล่านี้ ;-)

ใน Chef คุณสามารถใช้platform?วิธีการ:

if platform?("redhat", "centos", "fedora")
  # Code for only Red Hat Linux family systems.
end

หรือ:

if platform?("ubuntu")
  # Code for only Ubuntu systems
end

หรือ:

if platform?("ubuntu")
  # Do Ubuntu things
end

หรือ:

if platform?("freebsd", "openbsd")
  # Do BSD things
end

1
ในขณะที่ demonstrably เหนือกว่าระดับต่ำเปลือกเป็นศูนย์กลางที่ไม่ใช่การแก้ปัญหาที่เปราะบาง (เช่นlsb_release, /etc/os-release) วิธีนี้มีข้อเสียที่แตกต่างของการกำหนดให้พ่อครัว - โครงสร้างพื้นฐานรุ่นเป็นรหัส (IAC) กรอบไม่ได้ติดตั้งโดยเริ่มต้นบนแพลตฟอร์มมากที่สุดและต้องใช้ ภาษาเฉพาะโดเมนของตนเอง (DSL) ในระยะสั้นผู้ใช้ส่วนใหญ่อาจจะเพียงแค่ต้องการที่จะเลื่อนไปหลามซึ่งถูกติดตั้งโดยเริ่มต้นบนแพลตฟอร์มส่วนใหญ่ (รวมถึงอูบุนตู) และการเชื่อมต่อกันได้ดีกับสคริปต์เปลือก
เซซิลแกงกะหรี่


4
 apt-get -v &> /dev/null && apt-get update
 which yum &> /dev/null && yum update

หากมีเพียงสอง distro จากนั้นคุณสามารถทำให้สั้น:

apt-get -v &> /dev/null && apt-get update || yum update

อย่างใดyum -vกลับไม่ใช่ศูนย์ใน CentOS ดังนั้นใช้whichแทน
แน่นอนคุณควรพิจารณาสถานการณ์หากไม่มีการwhichติดตั้ง


2

สคริปต์ต่อไปนี้ควรบอกว่าเป็น Ubuntu หรือไม่ หากไม่ใช่และตัวเลือกอื่น ๆ ที่คุณมีคือ CentOS คุณควรมีมันอยู่ในelseclause:

dist=`grep DISTRIB_ID /etc/*-release | awk -F '=' '{print $2}'`

if [ "$dist" == "Ubuntu" ]; then
  echo "ubuntu"
else
  echo "not ubuntu"
fi

1
สิ่งนี้สามารถทำให้ง่ายขึ้นโดยใช้lsb_releaseเครื่องมือซึ่งควรอ่านไฟล์เดียวกัน lsb_release -iรายงานอย่างใดอย่างหนึ่งDistributor ID: UbuntuหรือDistributor ID: CentOSในกรณีเหล่านี้
chronitis

@ synchronitis: ใช่แน่ใจว่ามันจะเป็น
jobin

ฉันไม่คิดว่ามันจะมีให้บริการบน Centos โดยปริยาย
Sylvain Pineau

1

ดำเนินการ/etc/os-releaseในเชลล์ย่อยและสะท้อนค่า:

if [ "$(. /etc/os-release; echo $NAME)" = "Ubuntu" ]; then
  apt-get install updates 
else
  yum update
fi

0

ฉันจะใช้หลาม

if ! python -c "exec(\"import platform\nexit ('centos' not in platform.linux_distribution()[0].lower())\")" ; then
   echo "It is not CentOS distribution, ignoring CentOS setup"
   exit 0
fi

0

การใช้คำสั่งนี้ทำงานใน CentOS, Ubuntu และ Debian: grep "^NAME=" /etc/os-release |cut -d "=" -f 2 | sed -e 's/^"//' -e 's/"$//'

ใน Debian มันถัวเฉลี่ยDebian GNU/Linuxในอูบุนตูมันถัวเฉลี่ยและอัตราผลตอบแทนUbuntu CentOS มันCentOS Linux

ประโยชน์ของการใช้ grep, cut และ sed แทน gawk นั้นชัดเจน: Debian ไม่มีการติดตั้ง gawk โดยค่าเริ่มต้นดังนั้นคุณไม่สามารถพึ่งพามันในกล่อง Debian แบบสุ่ม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.