以 root 身份运行的 BASH 脚本,以另一个用户身份运行的分组命令的整洁方法?

以 root 身份运行的 BASH 脚本,以另一个用户身份运行的分组命令的整洁方法?

我知道我可以使用以下命令作为不同用户运行每个命令:

su -s /bin/bash "command" - user

但是有几个命令需要运行,我正在寻找一种比在每一行都加上 su 更简洁的方法。

我怎么能说“这里的所有命令都以 userX 身份运行”,然后“停止以 userX 身份运行命令”(并继续以 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 和备份用户共享一个公共的主要 UNIX 组。

  1. 使用 ssh 可以更改备份用户密码,并且您的脚本仍然可以工作。
  2. 如果您在概念验证分析之后使用共享组,您可以迁移到除 root 之外的帐户可以拥有并执行脚本的解决方案。这样做的好处是您不必共享 root 密码。
  3. 您可以在 ssh 命令中传递环境变量...例如: ssh bla@blah "export BORG_PASSPHRASE=\"SUPERSECRETPASSWORD\"; ./script.sh"

相关内容