如何通过 ssh 作为不同用户在远程传递参数来执行本地脚本?

如何通过 ssh 作为不同用户在远程传递参数来执行本地脚本?

我正在尝试使用 keytab 身份验证通过 ssh 在远程服务器上执行本地脚本。我能够以 sachin(获得票证的用户)身份通过 ssh 连接到远程,然后我以另一个用户 Remoteuser 的身份生成 bash 进程。到目前为止,一切都很好。这是命令

ssh -q -o BatchMode=yes -o StrictHostKeyChecking=no -l sachin sachin@remote_host 'sudo -u remoteuser /bin/bash' < ./hello.sh

当我尝试将参数传递给 hello.sh 时,问题就开始了。我尝试了以下方法

ssh -q -o BatchMode=yes -o StrictHostKeyChecking=no -l sachin sachin@remote_host 'sudo -u remoteuser /bin/bash' < ./hello.sh "hello"

我明白了

/bin/bash: hello: Permission denied.

但如果没有参数,脚本将以远程用户身份执行。因此,我认为不需要任何特殊许可。

hello.sh 是一个简单的 shell 脚本。

#!/bin/bash
echo $1

知道出了什么问题吗?

答案1

看起来您似乎希望"hello"将其作为参数传递给脚本,但您没有将其作为命令行参数提供给 shell。

相反,要将标准输入上的脚本传递给bash,请使用bash -s。这还允许您传递额外的命令行参数,例如bash -s "hello"

ssh ...options... 'sudo -u remoteuser /bin/bash -s "hello"' <./hello.sh

但请注意,这使得 shell 的标准输入流成为 shell 脚本,因此在脚本本身内部从标准输入读取数据变得很困难。

显然,另一个选择是将脚本传输到远程系统并在那里运行。


你的命令

ssh ...options... 'sudo -u remoteuser /bin/bash' <./hello.sh "hello"

ssh ...options... 'sudo -u remoteuser /bin/bash' "hello" <./hello.sh

线路上重定向的位置在这里并不重要。参见例如这个命令如何合法? "> 文件 1 < 文件 2 猫"

相关内容