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