我有一个系统,我只能使用我的用户名(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目录,其中包含空格。
是否有一般性解决方案允许我传递任何命令,无论引用有多复杂/疯狂,或者这是否达到某种限制?还有其他可能的,可能更具可读性的解决方案吗?
我有时使用的一个技巧是使用base64对命令进行编码,并将其传输到另一个站点上的bash:
MYCOMMAND=$(base64 -w0 script.sh)
ssh user@remotehost "echo $MYCOMMAND | base64 -d | sudo bash"
这将编码脚本,在安全字符串中包含任何逗号,反斜杠,引号和变量,并将其发送到其他服务器。 (-w0
是禁用换行所必需的,默认情况下会在第76列发生)。另一方面,$(base64 -d)
将解码脚本并将其提供给bash以便执行。
无论脚本有多复杂,我都没有遇到任何问题。通过转义解决问题,因为您不需要逃避任何事情。它不会在远程主机上创建文件,您可以轻松地运行非常复杂的脚本。