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

Если я правильно понимаю, /var/log/paul/events.log принадлежит root; тем не менее, у вас есть скрипт, запущенный как пользователь rsyslog, который не может перемещать /var/log/paul/events.log.

sudo chown -R root.rsyslog /var/log/paul/
sudo chmod 0775 /var/log/paul
sudo chmod g+s /var/log/paul

Теперь новые файлы в / var / log / paul всегда принадлежат по rsyslog. Другим решением для использования является ACL.

1
задан 24 April 2017 в 11:12

9 ответов

Вам не нужен 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 else yum.

25
ответ дан 24 May 2018 в 08:17

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

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

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
ответ дан 24 May 2018 в 08:17
  • 1
    Несмотря на то, что это решение явно превосходит низкоуровневые хрупкие неуправляемые решения (например, lsb_release, /etc/os-release), это решение имеет особый недостаток, заключающийся в том, что Chef - суперкомпьютер Infrastructure в качестве кода (IaC ) framework не , установленный по умолчанию на большинстве платформ и требующий использования своего собственного языка, специфичного для домена (DSL). Короче говоря, большинство пользователей, вероятно, просто хотят отложить до Python , который установлен , установленный по умолчанию на большинстве платформ (включая Ubuntu) и хорошо взаимодействует с командами оболочки. – Cecil Curry 17 August 2017 в 06:22

Вот простой ответ, который я нахожу, работает во всех версиях 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
5
ответ дан 24 May 2018 в 08:17
  • 1
    на моем ubuntu нет / etc / lsb-release – noonex 14 November 2016 в 12:17
  • 2
    Я не буду использовать -1, но этот ответ неверен хотя бы в одном случае: /etc/lsb-release существует в CloudLinux (CentOS) 6.8, поэтому он вернет оба yum и apt-get. – dhaupin 28 November 2016 в 20:56
 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
ответ дан 24 May 2018 в 08:17

Следующий скрипт должен указать, является ли это 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
ответ дан 24 May 2018 в 08:17
  • 1
    Это, вероятно, можно упростить с помощью инструмента lsb_release, который должен считывать те же файлы. lsb_release -i сообщает в этом случае Distributor ID: Ubuntu или Distributor ID: CentOS. – chronitis 2 May 2014 в 14:31
  • 2
    @chronitis: да, конечно, это может быть – jobin 2 May 2014 в 14:32
  • 3
    Я не думаю, что он доступен по умолчанию на Centos, хотя – Sylvain Pineau 2 May 2014 в 14:33

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

if [  -n "$(uname -a | grep Ubuntu)" ]; then
    sudo apt-get update && sudo apt-get upgrade 
else
    yum update
fi  
2
ответ дан 24 May 2018 в 08:17

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

if [ "$(. /etc/os-release; echo $NAME)" = "Ubuntu" ]; then
  apt-get install updates 
else
  yum update
fi
1
ответ дан 24 May 2018 в 08:17

Я бы использовал 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
ответ дан 24 May 2018 в 08:17

Использование этой команды работает в 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.

0
ответ дан 24 May 2018 в 08:17

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

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