我正在尝试使用 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 猫"