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

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

Я знаю, что могу запустить каждую команду от имени другого пользователя с помощью:

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

Вышеизложенное работает, за исключением двух моментов:

  1. Похоже, я не могу передать переменную окружения, которую Borg обычно выбирает автоматически: $BORG_PASSPHRASE. Может быть, это проблема с правами доступа между пользователями?
  2. Кажется, он не передает 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.

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

Связанный контент