我需要将我的应用程序部署到lovelyplace
由织物脚本。不幸的是,服务器的设置很糟糕,但我对此无能为力 - 我必须忍受它。
我可以使用一个非 root 用户来处理普通的事情,我们将她命名为alice
。然后还有一个用户,我们就叫他吧bob
。bob
具有root权限。准备服务器的管理员将所有东西安装到只能以 root 身份操作的地方,因此bob
几乎我所做的一切都需要它。
alice
我只有的帐户密码。我没有 的密码bob
,但我被告知我可以通过打字sudo su - bob
然后做一些事情来使用他的力量。确实如此 - 在 shell 中我可以执行此操作(没有密码提示!),然后我登录bob
并可以执行任何操作。但是,我需要在脚本中以非交互方式执行此操作。就像是sudo su - bob && whoami
。
但我想不出任何其他方法来获得bob
的力量:
例如sudo su -c whoami bob
结果[sudo] password for alice:
然后Sorry, user alice is not allowed to execute '/bin/bash' as bob on lovelyplace.
我尝试了许多组合su
,sudo
等等,但结果总是相同的 - 密码提示,然后拒绝。
我需要想出办法以编程方式以身份登录服务器alice
,然后以身份执行内容bob
。我需要一个类似于 的非交互式衬里sudo whoami
,它将打印出来bob
。否则我无法通过脚本部署我的应用程序。
有什么建议如何sudo su - bob
在脚本中模仿这种奇怪的现象吗?
更新: bob
不具有与 root 相同的权限。他无法读取 sudoers 等,因此他拥有比 更高的权限alice
,但显然没有那么多权限来调整 root 设置。
答案1
您应该能够将要运行的命令传递到命令的标准输入sudo su - bob
(从而传递到它创建的 shell):
sudo su - bob <<ENDCOMMANDS
echo "Running as:"
whoami
echo "done now...
ENDCOMMANDS
答案2
看起来你的服务器上的特权功夫是一件非常有趣的工作。有两件事你可以尝试,但我们只能猜测爱丽丝和鲍勃可能会做什么,可能不会做什么,YMMV。
为什么它必须是一个以 alice 身份运行的脚本?因为它是一些自动访问?好吧,如果有一些 cron 守护进程,您可以为 bob 提供一个 cron 作业,它定期执行一些 bash 脚本。如果 alice 可以写入该 bash 脚本,那么您是否找到了一种以 bob 身份执行脚本而不需要 su(do) 的方法?巫毒。但它确实稍微软化了安全性......
我从未尝试过的另一种方法是沿着后台 shell 的路线,将 stdin 和 out 绑定到管道。应该可以发送sudo su - bob\n
到标准输入管道,并且应该使后台 shell 执行该命令。发送到后台 shell 的每个后续命令都应作为 bob 执行。粗略的草图是这样的:
mkdir -p /tmp/backshell
mkfifo /tmp/backshell/stdin
mkfifo /tmp/backshell/stdout
mkfifo /tmp/backshell/stderr
bash -l >/tmp/backshell/stdout 2>/tmp/backshell/stderr </tmp/backshell/stdin &
cat /tmp/backshell/stdout &
cat /tmp/backshell/stderr >&2 &
echo "sudo su - bob" >> /tmp/backshell/stdin
echo "whoami" >> /tmp/backshell/stdin
然而,它有一个缺陷,即在第一个之后,echo
标准输入管道被关闭,因此后壳也被关闭。因此,您必须找到一种方法来防止标准输入管道被关闭,或者使用更复杂的东西来实现它。我认为 python 是一个非常好的子 shell 模块并与它们交互。