Я знаю, что могу запустить каждую команду от имени другого пользователя с помощью:
su -s /bin/bash "command" - user
Но нужно выполнить несколько команд, и я искал более аккуратный способ сделать это, чем добавлять su в каждую строку.
Как мне сказать «все команды отсюда запускаются от имени пользователя X», а затем «прекратить выполнение команд от имени пользователя X» (и продолжить выполнение оставшейся части скрипта от имени пользователя root)?
Спасибо.
Вот блок, который я хотел бы запустить от имени другого пользователя (обновлено из ответа @Jetchisel):
#!/bin/bash
export BORG_PASSPHRASE="SUPERSECRETPASSWORD"
su - backup-user -s /bin/bash -c '
echo "$USER $(date +%F)" |& tee /pathto/_logs/test.log
borg info \
/pathto/repo \
|& tee -a /pathto/_logs/test.log
'
info_exit=$?{PIPESTATUS[0]}
if [ ${info_exit} = "0" ]; then
echo ">> test-SUCCESS <<"
elif [ ${info_exit} = "1" ]; then
echo ">> test WARNINGS <<"
else
echo ">> test FAILED <<"
fi
Вышеизложенное работает, за исключением двух моментов:
- Похоже, я не могу передать переменную окружения, которую Borg обычно выбирает автоматически: $BORG_PASSPHRASE. Может быть, это проблема с правами доступа между пользователями?
- Кажется, он не передает info=exit правильно. Для теста я полностью удалил Borg, сохранил echo, но неправильно написал 'ech', что не сработало. Но скрипт все равно сообщает об успешном завершении.
решение1
Вы можете попробовать -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
...
'
Просто нужно позаботиться о кавычках, если вам нужно заключить команды в одинарные кавычки.
решение2
Вы можете использовать функции в вашем скрипте 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
Поместите любые команды, которые вы хотите выполнить, внутрь функции, и соответствующий пользователь выполнит все эти команды.
ПРИМЕЧАНИЕ:Вы запустите скрипт как пользователь root, чтобы избежать проблем с паролем.
sudo su -c ./script.sh
решение3
Эх. Я новичок в stackexchange. Иначе это был бы комментарий, а не ответ. У меня нет репутации, чтобы комментировать. Так что, ребята. Не пинайте меня слишком сильно! Я рекомендую вам использовать ssh вместо su. И я рекомендую, чтобы root и backup-user разделяли общую основную группу UNIX.
- При использовании ssh пароль резервного пользователя может измениться, а ваш скрипт все равно будет работать.
- Если вы используете общую группу — позже — после анализа проверки концепции — вы можете перейти на решение, где учетная запись, отличная от root, может владеть и выполнять скрипт. Это имеет то преимущество, что вам не придется делиться паролем root.
- Вы можете передавать переменные окружения в команде ssh... Например: ssh bla@blah "export BORG_PASSPHRASE=\"SUPERSECRETPASSWORD\"; ./script.sh"