Як дізнатися, чи є запущеною платформою Ubuntu або CentOS за допомогою сценарію Bash?


39

Я знаю команди перевірити ім'я Linux-машини, що працює на моїй машині. Наприклад:

Ubuntu

cat /etc/version

CentOS

cat /etc/issue

Як отримати вихід з терміналу і порівняти, щоб побачити, чи це UBUNTU або CENTOS, і виконати наступні команди?

apt-get install updates 

або

yum update

Ubuntu 14.04

cat /etc/issue

2
Ласкаво просимо до Ask Ubuntu. Скажіть, будь ласка, трохи часу, щоб прочитати Що робити, коли хтось відповість на моє запитання?
Сільвейн Пано

Відповіді:


53

На жаль, не існує надійного, простого способу отримання імені розповсюдження. Більшість основних дистрибутивів рухаються до системи, де вони використовують /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. Використовуйте більш складний сценарій, який повинен працювати для більшості дистрибутивів:

    # 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 за замовчуванням.
Віль Лаїтіла

@VilleLaitila Боюся, що це не актуально, оскільки цей сайт стосується лише Ubuntu. Але тут немає нічого конкретного гауку, так що awkабо mawkбудь-яка інша реалізація працювала б так само добре.
тердон

Ще більш конкретне використання 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не потрібно, щоб подвійний канал не пробуджувався.
тердон

25

Вам не потрібно bash, щоб виконувати таке завдання, і я б запропонував використовувати підхід високого рівня, щоб уникнути роботи з файлами на кшталт /etc/versionі /etc/issue(у мене немає / etc / version 13.10).

Тож моя рекомендація замість цього використовувати цю команду:

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

Модуль платформи python буде працювати в обох системах, решта команди перевірятиме, чи повернеться Ubuntu python та запустить 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

на моєму ubuntu немає / etc / lsb-release
noonex

3
Я не збираюся до -1, але ця відповідь є невірною хоча б в одному випадку: /etc/lsb-releaseіснує в CloudLinux (CentOS) 6.8, тому він поверне і те, yumі інше apt-get.
dhaupin

5

Використовуйте шефа для цих завдань. ;-)

У шеф-кухарі ви можете використовувати 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
У той час як явно перевершують оболонки орієнтованих тендітні НЕ-рішень низького рівня (наприклад, lsb_release, /etc/os-release), це рішення має виразний недолік , що вимагає Chef - важкоатлет інфраструктури як код (IAC) рамок НЕ встановлюється за умовчанням на більшості платформ і вимагають використання власна мова, що залежить від домену (DSL). Коротше кажучи, більшість користувачів , ймовірно , просто хочуть перенести на Python , який буде встановлений за замовчуванням на більшості платформ (включаючи Ubuntu) і інтерфейси також з допомогою сценаріїв оболонки.
Сесіль Карі

5

Перевірте наявність Ubuntu в імені ядра:

if [  -n "$(uname -a | grep Ubuntu)" ]; then
    sudo apt-get update && sudo apt-get upgrade 
else
    yum update
fi  

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

якщо є лише два дистрибутива, ви можете скоротити його:

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

якось yum -vповернути нецільове значення в CentOS, тому використовуйте whichзамість цього,
звичайно, слід розглянути сценарій, якщо він не whichвстановлений.


2

Наступний сценарій повинен сказати, чи це Ubuntu. Якщо це не так, і єдиний інший варіант, який ви маєте, це CentOS, ви повинні мати це в elseпункті:

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: так, впевнений, що може бути
приєднатися

Я не думаю , що він доступний за умовчанням на Centos хоча
Сільвен Pineau

1

Виконайте /etc/os-releaseв підколонці та повторіть його значення:

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

0

Я б використовував python

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 він дає, Ubuntuа в CentOS він дає CentOS Linux.

Перевага використання grep, cut та sed замість gawk очевидна: Debian не має встановленого gawk за замовчуванням, тому ви не можете розраховувати на нього у випадковому вікні Debian.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.