Я знаю, что команды проверяют название машины Linux, работающей на моей машине. Например:
cat /etc/version
cat /etc/issue
Как я получаю вывод от терминала и выдерживаю сравнение, чтобы видеть, является ли это UBUNTU или CENTOS, и выполните следующие команды?
apt-get install updates
или
yum update
cat /etc/issue
К сожалению, нет никакого безошибочного, простого способа получить имя распределения. Большинство главных дистрибутивов двигает систему, где они используют /etc/os-release
хранить эту информацию. Большинство современных дистрибутивов также включает lsb_release
инструменты, но они не всегда устанавливаются по умолчанию. Так, вот некоторые подходы, которые можно использовать:
Использовать /etc/os-release
awk -F= '/^NAME/{print $2}' /etc/os-release
Используйте lsb_release
инструменты при наличии
lsb_release -d | awk -F"\t" '{print $2}'
Используйте более сложный сценарий, который должен работать на значительное большинство дистрибутивов:
# 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
Проанализируйте информацию о версии 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 до моего вопроса здесь.
Вы не должны колотить, чтобы сделать такую задачу, и я предложил бы использовать высокоуровневый подход, чтобы не иметь дело с файлами как /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
.
Вот простой ответ, что я нахожу работы через все версии 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
Используйте Шеф-повар для этих задач.;-)
В Шеф-поваре, можно использовать 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
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
установлен.
Проверьте на Ubuntu на имя ядра:
if [ -n "$(uname -a | grep Ubuntu)" ]; then
sudo apt-get update && sudo apt-get upgrade
else
yum update
fi
Следующий сценарий должен сказать, является ли это 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 update
fi
Я использовал бы 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
Используя эту команду работает в 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.
Для этой цели в Стандартную базу 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 /
.
Команда 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
#!/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..."}'
#!/usr/bin/perl
use Linux::Distribution qw(distribution_name);
if(my $distro = distribution_name) { print "Distro: $distro\n"; } else { print "Unkown distro...n\n";}