我知道我可以使用以下命令作为不同用户运行每个命令:
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
上面的方法有效,但有两件事:
- 我似乎无法传递 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 和备份用户共享一个公共的主要 UNIX 组。
- 使用 ssh 可以更改备份用户密码,并且您的脚本仍然可以工作。
- 如果您在概念验证分析之后使用共享组,您可以迁移到除 root 之外的帐户可以拥有并执行脚本的解决方案。这样做的好处是您不必共享 root 密码。
- 您可以在 ssh 命令中传递环境变量...例如: ssh bla@blah "export BORG_PASSPHRASE=\"SUPERSECRETPASSWORD\"; ./script.sh"