Сценарий BASH, работающий от имени пользователя root, удобный способ сгруппировать команды, запускаемые от имени другого пользователя?

Если вы знаете разницу между вашими хостами для разработки и рабочими хостами или если существует простое соглашение об именах (e. г. dev.example.comпротив prod.example.com), это может быть так же просто, как:

for host in $(</home/completelistlistcheck.txt); do
    case "$(ssh $host hostname)" in
        *dev*)
            env="development"
            break
            ;;
        *prod*)
            env="production"
            break
            ;;
        *)
            env="non-categorized"
            break
            ;;
    esac
    echo "$host is a $env host."
done

Если на каждом хосте есть файл, содержимое которого вам нужно проанализировать, используйте cat /path/to/fileвместо hostnameв команде, запускаемой через ssh.

1
12.04.2020, 05:34
3 ответа

Вы можете попробовать флаг -c

 OPTIONS
       -c, --command=command
            Pass command to the shell with the -c option.

Что-то вроде

su - "$user" -s /bin/bash -c 'command1;command1;command3;.....'

Или используйте новые строки вместо ;для разделения команд.

su - "$user" -s /bin/bash -c '
  command1
  command2
  command3
 ...
'

Просто нужно позаботиться о заключении в кавычки, если вам нужно заключать команды в одинарные кавычки.

1
28.04.2021, 23:18

Вы можете использовать функции в вашем bash-скрипте вместе с набором текста , чтобы легко добиться этого;

#!/bin/bash

function1 () {
  echo "this is function1"
 }
function2 () {
  echo "this is function2"
}

su -c "$(typeset -f function1); function1" user1
su -c "$(typeset -f function2); function2" user2


exit 0

Поместите любые команды, которые вы хотите запустить, внутрь функции, и соответствующий пользователь будет выполнять все эти команды.

NOTE: you will run the script as root to easily avoid any password issues

sudo su -c./script.sh
-1
24.05.2021, 22:24

Эх. Я новичок в stackexchange. В противном случае это был бы комментарий, а не ответ. У меня нет представителя, чтобы комментировать. Итак, ребята. Полегче со мной! Я рекомендую вам использовать ssh вместо su. И я рекомендую, чтобы пользователь root и резервный -совместно использовали общую первичную группу UNIX.

  1. С помощью ssh пароль резервного -пользователя может измениться, и ваш скрипт по-прежнему будет работать.
  2. Если вы используете общую группу -позже -после проверки -из -концептуального анализа -, вы можете перейти на решение, в котором учетная запись, отличная от root, может владеть и выполнять сценарий. Это имеет то преимущество, что вам не нужно делиться корневым паролем.
  3. Вы можете передавать переменные среды в команду ssh... Например, :ssh bla@blah "export BORG _PASSPHRASE=\"SUPERSECRETPASSWORD\";./script.sh"
-1
25.05.2021, 05:05

Теги

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