如何在ssh上使用sudo运行任意复杂的命令?

Modified on: Tue, 12 Nov 2019 08:40:02 +0800

我有一个系统,我只能使用我的用户名(myuser)登录,但我需要以其他用户(scriptuser)的身份运行命令。到目前为止,我已经提出了以下命令来运行我需要的命令:

ssh -tq myuser@hostname "sudo -u scriptuser bash -c \"ls -al\""

但是,当我尝试运行更复杂的命令时,例如[[ -d "/tmp/Some directory" ]] && rm -rf "/tmp/Some directory"我很快引用了麻烦。我不知道如何将这个示例复杂命令传递给bash -c,当\"已经划定了我正在传递的命令的边界时(所以我不知道如何引用/ tmp / some目录,其中包含空格。

是否有一般性解决方案允许我传递任何命令,无论引用有多复杂/疯狂,或者这是否达到某种限制?还有其他可能的,可能更具可读性的解决方案吗?

作者:VoY

最佳答案

我有时使用的一个技巧是使用base64对命令进行编码,并将其传输到另一个站点上的bash:

MYCOMMAND=$(base64 -w0 script.sh)
ssh user@remotehost "echo $MYCOMMAND | base64 -d | sudo bash"

这将编码脚本,在安全字符串中包含任何逗号,反斜杠,引号和变量,并将其发送到其他服务器。 (-w0是禁用换行所必需的,默认情况下会在第76列发生)。另一方面,$(base64 -d)将解码脚本并将其提供给bash以便执行。

无论脚本有多复杂,我都没有遇到任何问题。通过转义解决问题,因为您不需要逃避任何事情。它不会在远程主机上创建文件,您可以轻松地运行非常复杂的脚本。


相关问答

添加新评论