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

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

Ubuntu

cat /etc/version

CentOS

cat /etc/issue

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

apt-get install updates 

или

yum update

Ubuntu 14.04

cat /etc/issue
39
задан 30 September 2019 в 22:15

13 ответов

К сожалению, нет никакого безошибочного, простого способа получить имя распределения. Большинство главных дистрибутивов двигает систему, где они используют /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 до моего вопроса здесь.

53
ответ дан 23 November 2019 в 00:09

Вы не должны колотить, чтобы сделать такую задачу, и я предложил бы использовать высокоуровневый подход, чтобы не иметь дело с файлами как /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.

25
ответ дан 23 November 2019 в 00:09

Вот простой ответ, что я нахожу работы через все версии 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
8
ответ дан 23 November 2019 в 00:09

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

В Шеф-поваре, можно использовать 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
5
ответ дан 23 November 2019 в 00:09
 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 установлен.

4
ответ дан 23 November 2019 в 00:09

Проверьте на Ubuntu на имя ядра:

if [  -n "$(uname -a | grep Ubuntu)" ]; then
    sudo apt-get update && sudo apt-get upgrade 
else
    yum update
fi  
5
ответ дан 23 November 2019 в 00:09

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

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

if [ "$dist" == "Ubuntu" ]; then
  echo "ubuntu"
else
  echo "not ubuntu"
fi
2
ответ дан 23 November 2019 в 00:09

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

if [ "$(. /etc/os-release; echo $NAME)" = "Ubuntu" ]; then
  apt-get install updates 
else
  yum update
fi
1
ответ дан 23 November 2019 в 00:09

Я использовал бы 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
ответ дан 23 November 2019 в 00:09

Используя эту команду работает в 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, сокращения и sed вместо простофили ясно: Debian не имеет простофили установленной по умолчанию, таким образом, Вы не можете полагаться на него на случайном поле Debian.

0
ответ дан 23 November 2019 в 00:09

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

$ lsb_release -si
Ubuntu
$ lsb_release -sd
Ubuntu 18.04.3 LTS
$ lsb_release -sr
18.04
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.3 LTS
Release:        18.04
Codename:       bionic

Следовательно, оператор case в строках

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-release

case "$ID" in
  ubuntu) echo 'This is Ubuntu Linux' ;;
       *) echo 'This is something else' ;; 
esac

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

4
ответ дан 7 December 2019 в 13:20

Команда lsb_release работает только на платформе Ubuntu, но не в centos поэтому вы можете получить подробную информацию из файла / etc / os-release

, следующая команда даст вам имя и версию ОС -

cat /etc/os-release | awk -F '=' '/^PRETTY_NAME/{print $2}' | tr -d '"'

# output :-
# for centos -> CentOS Linux 7 (Core)
# for ubuntu -> Ubuntu 18.04.1 LTS (version differ with different releases)

Вы также можете получить имя и версию ОС по отдельности. в вашем случае для запуска команды обновления вы можете использовать следующий сценарий -

os_name=$(cat /etc/os-release | awk -F '=' '/^NAME/{print $2}' | awk '{print $1}' | tr -d '"')

if [ "$os_name" == "Ubuntu" ]
then
        echo "system is ubuntu"
        os_versionid=$(cat /etc/os-release | awk -F '=' '/^VERSION_ID/{print $2}' | awk '{print $1}' | tr -d '"')

        case $os_versionid in
                "14.04" )
                        echo "os version is 14.04"
                        sudo apt-get update
                        ;;

                "16.04" )
                        echo "os version is 16.04"
                        sudo apt-get update
                        ;;

                "18.04" )
                        echo "os version is 18.04"
                        sudo apt update
                        ;;
        esac
elif [ "$os_name" == "CentOS" ]
then
        echo "system is centos"
        sudo yum update
else
        echo "system is $os_name"
fi
0
ответ дан 2 March 2020 в 13:00

Awk поддерживается почти в каждой системе nix, поэтому этого должно быть достаточно, чтобы нам не приходилось заботиться обо всех инструментах.

#!/bin/bash

DISTRO="$(awk -F= '/^NAME/{print tolower($2)}' /etc/os-release|awk 'gsub(/[" ]/,x) + 1')"

[[ "${DISTRO}" = "gentoo" || "${DISTRO}" = "ubuntu" ]] && \
awk 'BEGIN{print "'${DISTRO}'"}' || \
awk 'BEGIN{print "Unknown distro..."}'

Perl

#!/usr/bin/perl
use Linux::Distribution qw(distribution_name);
if(my $distro = distribution_name) { print "Distro: $distro\n"; } else { print "Unkown distro...n\n";}
-1
ответ дан 22 June 2020 в 01:04

Другие вопросы по тегам:

Похожие вопросы: