通过两个脚本在远程服务器上执行命令

通过两个脚本在远程服务器上执行命令

目前我正在使用SSHPass脚本连接到远程服务器:

sshpass -p PASSWORD ssh -o StrictHostKeyChecking=no [email protected]

要远程执行任何命令,我使用:

sshpass -p PASSWORD ssh -o StrictHostKeyChecking=no [email protected] "COMMAND"

我计划将连接步骤分离在一个脚本中(conn.sh),将命令分离在另一个脚本中(cmd.sh)。

我尝试过这个方法:

命令:

#!/bin/bash
ls -ltr

conn.sh:

#!/bin/bash    
sshpass -p PASSWORD ssh -o StrictHostKeyChecking=no [email protected] "$1"

在对两个脚本执行“chmod a+x”后执行:

./conn.sh cmd.sh

但它给了我错误:

cmd.sh: command not found

我甚至尝试$1用路径替换cmd.sh,但它给了我这个错误:

sh: /home/myhome/cmd.sh: No such file or directory

答案1

失败的原因是当你运行类似

ssh user@remote command

不仅在远程计算机上运行command,​​还会在远程计算机上搜索。因此,当您运行 时./conn.sh cmd.sh,您正在连接到远程,然后尝试运行一个名为的脚本cmd.sh 在遥控器上。由于没有这样的脚本(它存储在您的本地机器上),所以执行失败,您会看到该错误。

您可以通过将以下内容更改为conn.sh

#!/bin/bash
sshpass -p PASSWORD ssh -o StrictHostKeyChecking=no [email protected] \
 bash -s < "$1"

然后运行

./conn.sh /local/path/to/cmd.sh

这将在远程计算机上打开一个 bash shell。-s告诉 bash 从标准输入读取命令,并将< "$1"给出的第一个参数conn.sh作为该 bash shell 的输入。

你确定你需要这样做吗?你所描述的几乎肯定是XY问题cmd.sh。简单的解决方案是在远程服务器上创建。然后你可以做

./conn.sh /remote/path/to/cmd.sh

相关内容