目前我正在使用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