我正在一台没有 root 权限的机器上工作,但有一个允许的sudo
命令列表。这些命令之一是/bin/su - foouser
.这样我就可以输入sudo su - foouser
,并获得一个名为 foouser 的交互式 shell。然后我可以运行一些东西foouser
。
问题在于,这foouser
是一个共享用户/shell,用于生成某些重要的生产过程。我无法轻松地自定义它或按照我想要的方式设置它。而且我不应该一直在其中工作,这会分割我的终端,以及我以我自己身份登录的终端和我所在的终端之间的命令历史记录foouser
。
我真正想做的是有一种方法来运行单个命令foouser
,让它阻塞,将 stdout 和 stderr 打印到我的 shell,就像命令通常会做的那样,然后返回,我仍然以我自己的身份登录(并且不是foouser
)。例如,这可以封装在一个脚本中,以便as_foo bar
运行命令bar
as foouser
,打印 stdout 和 stderr,返回返回代码bar
,然后将我放回到 shell 中。
我可以要求系统管理员更改权限。例如,他们可以添加bar
到 sudo 列表,然后我可以使用(我认为)su -c
以我描述的方式运行 bar。但如果第二天我想跑步bar2
,我就必须再次和他们交谈。
有没有办法摆脱这个困境呢?这看起来相当愚蠢,因为我显然可以成为foouser
并运行任意数量的命令,因此我可以看到安全性方面没有任何区别。只是找不到任何明显方便的方法来实现这一点。
答案1
sudo su - foouser <command>
要求您至少具有有限的 root 访问权限才能su - foouser <command>
以 root 身份运行。
sudo -u foouser <command>
可以一步完成你想要的事情。但它要求系统管理员已授予您通过以下方式sudo
访问帐户的权限:foouser
ignacio ALL=(foouser) ALL
而不是这样:
ignacio ALL=(root) su - foouser
以这种方式配置sudo
将允许您定义例如您设想的别名:
as_foo='sudo -u foouser'
通过避免su -
,您也许能够继续使用自己的自定义设置:以sudo
这种方式使用仅更改用户身份,但保持HOME
其先前的值,读取任何 shell 启动脚本和其他自定义设置你的主目录而不是foouser
's。
(当然,这些脚本也必须可供其他用户读取,并且您可能运行的任何共享脚本最好foouser
明确引用 的主目录,而/home/foouser
不仅仅是$HOME
。)
但是,有一些sudo
设置可能会阻止该解决方案工作:如果always_set_home
在 sudoers 文件中设置了 sudo 选项,或者如果env_reset
设置了选项但未添加HOME
到env_keep
列表中,HOME
则无论如何都会重置。在这种情况下,请尝试-E
向sudo
命令添加选项以明确请求保留您的环境。
当您确实想要运行foouser
与登录时完全一样的环境设置foouser
(即相当于sudo su - foouser
)时,请添加该-i
选项以专门请求该选项。sudo -i -u foouser
100% 准确的替换也是如此sudo su - foouser
。
如果您发现某个系统的旧版本sudo
没有该-i
选项,请使用该-H
选项与 sudo 代替:它不是完美的替代品,但可能就足够了。这样的旧版本sudo
很可能也会存在一些安全敏感的已知错误,因此无论如何更新它都是值得的。
您可以使用sudo -l
as 您自己来查看您的 sudo 访问权限是如何定义的以及哪些 sudo 选项(也称为默认条目)对您有效。
答案2
将附加参数传递给su
.
sudo su - foouser sh -c 'echo $USER'