Как узнать, является ли запущенная платформа Ubuntu или CentOS с помощью скрипта Bash?

Я знаю команды для проверки имени машины Linux, запущенной на моей машине. Например:

Ubuntu

cat /etc/version

ЦентОС

cat /etc/issue

Как мне получить выходные данные из терминала и сравнить, чтобы узнать, является ли это UBUNTU или CENTOS, и выполнить следующие команды?

apt-get install updates 

или

yum update

Ubuntu 14.04

cat /etc/issue

К сожалению, нет надежного и простого способа получить имя дистрибутива. Большинство основных дистрибутивов движемся к система, в которой они используют /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 platformUNAME=$(uname | tr "[:upper:]" "[:lower:]")# If Linux, try to determine specific distributionif [ "$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)    fifi# For everything else (or if above failed), just use generic identifier[ "$DISTRO" == "" ] && export DISTRO=$UNAMEunset UNAME
  4. Проанализируйте информацию о версии gcc если установлен:

    CentOS 5.x

    $ gcc --versiongcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-54)Copyright (C) 2006 Free Software Foundation, Inc.

    CentOS 6.x

    $ gcc --versiongcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3)Copyright (C) 2010 Free Software Foundation, Inc.

    Ubuntu 12.04

    $ gcc --versiongcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3Copyright (C) 2011 Free Software Foundation, Inc.

    Ubuntu 14.04

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

Это в основном было непосредственно скопировано с замечательного сайта @ slm ответ на мой вопрос здесь.

Вам не нужен bash для выполнения такой задачи, и я бы посоветовал использовать высокоуровневый подход, чтобы избежать работы с такими файлами, как /etc/version и /etc/issue (У меня нет /etc/ версии на 13.10).

Поэтому я рекомендую использовать вместо этого эту команду:

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

питон платформа модуль будет работать в обеих системах, остальная часть команды проверит, возвращается ли Ubuntu python, и запустит apt-get ещё yum.

Вот простой ответ, который, как я нахожу, работает во всех версиях Ubuntu / CentOS / RHEL благодаря простому присутствию файлов (не обязательно, конечно, если кто-то случайно удаляет / etc / redhat-release в ваших коробках Ubuntu и т. Д.):

if [ -f /etc/redhat-release ]; then  yum updatefiif [ -f /etc/lsb-release ]; then  apt-get updatefi

Проверьте наличие Ubuntu в названии ядра:

if [  -n "$(uname -a | grep Ubuntu)" ]; then    sudo apt-get update && sudo apt-get upgrade else    yum updatefi  
 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 установленный.

Воспользуйся Шеф-повар для этих задач .;-)

В Chef вы можете использовать platform? метод:

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

Или:

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

Или:

if platform?("ubuntu")  # Do Ubuntu thingsend

Или:

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

То lsb_release для этой цели команда была добавлена в стандартную базу Linux (ISO/IEC 23360).:

$ lsb_release -siUbuntu$ lsb_release -sdUbuntu 18.04.3 LTS$ lsb_release -sr18.04$ lsb_release -aNo LSB modules are available.Distributor ID: UbuntuDescription:    Ubuntu 18.04.3 LTSRelease:        18.04Codename:       bionic

Поэтому заявление по делу в соответствии с

case "`/usr/bin/lsb_release -si`" in  Ubuntu) echo 'This is Ubuntu Linux' ;;       *) echo 'This is something else' ;; esac

должен делать то, что ты хочешь.

В более новых дистрибутивах Linux, основанных на systemd, также есть /etc/os-release, который предназначен для включения в сценарии оболочки с помощью команды source (.), как в

. /etc/os-releasecase "$ID" in  ubuntu) echo 'This is Ubuntu Linux' ;;       *) echo 'This is something else' ;; esac

Но в приведенном вами примере использования на самом деле вас может больше интересовать не название дистрибутива, а то, есть ли у него apt-get или yum. Вы могли бы просто проверить наличие файлов /usr/bin/apt-get или /usr/bin/yum с if [ -x /usr/bin/apt-get ]; then ... или для наличия связанных каталогов инфраструктуры, таких как /var/lib/apt и /etc/apt/.

Следующий скрипт должен указать, является ли это Ubuntu. Если это не так и единственным другим вариантом, который у вас есть, является CentOS, вы должны иметь его в else пункт:

dist=`grep DISTRIB_ID /etc/*-release | awk -F '=' '{print $2}'`if [ "$dist" == "Ubuntu" ]; then  echo "ubuntu"else  echo "not ubuntu"fi

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

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

Я бы использовал 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 0fi