我必须在远程机器上运行本地shell脚本(windows/Linux)。

我在机器A和机器B上都配置了SSH。我的脚本在机器A上,它将在远程机器B上运行我的一些代码。

本地和远程计算机可以是基于Windows或Unix的系统。

是否有一种方法来运行这个使用plink/ssh?


当前回答

这是一个老问题,Jason的回答很好,但我想补充一点:

ssh user@host <<'ENDSSH'
#commands to run on remote host
ENDSSH

这也可以用于su和需要用户输入的命令。(注意此处的“转义”)

由于这个答案不断获得流量,我将为heredoc的美妙用法添加更多信息:

您可以使用这种语法嵌套命令,这是嵌套工作的唯一方式(以一种理智的方式)

ssh user@host <<'ENDSSH'
#commands to run on remote host
ssh user@host2 <<'END2'
# Another bunch of commands on another host
wall <<'ENDWALL'
Error: Out of cheese
ENDWALL
ftp ftp.example.com <<'ENDFTP'
test
test
ls
ENDFTP
END2
ENDSSH

实际上,您可以使用telnet、ftp等服务进行对话。但是记住,heredoc只是将stdin作为文本发送,它并不等待行间的响应

我刚刚发现,如果你使用<<-END!

ssh user@host <<-'ENDSSH'
    #commands to run on remote host
    ssh user@host2 <<-'END2'
        # Another bunch of commands on another host
        wall <<-'ENDWALL'
            Error: Out of cheese
        ENDWALL
        ftp ftp.example.com <<-'ENDFTP'
            test
            test
            ls
        ENDFTP
    END2
ENDSSH

(我认为这应该可行)

也看到 http://tldp.org/LDP/abs/html/here-docs.html

其他回答

ssh user@hostname ". ~/.bashrc;/cd path-to-file/;. filename.sh"

强烈建议使用环境文件(.bashrc/.bashprofile/.profile)。在远程主机上运行某些东西之前,因为目标主机和源主机的环境变量可能会延迟。

尝试运行ssh user@remote sh ./script. unix。

你可以使用runoverssh:

sudo apt install runoverssh
runoverssh -s localscript.sh user host1 host2 host3...

-s远程运行本地脚本


有用的标志: -g对所有主机使用全局密码(单密码提示) -n使用SSH代替sshpass,用于公钥认证

假设您的意思是希望从“本地”机器自动执行此操作,而不需要手动登录到“远程”机器,那么您应该查看名为Expect的TCL扩展,它正是为这种情况而设计的。我还提供了一个通过SSH登录/交互的脚本链接。

https://www.nist.gov/services-resources/software/expect

http://bash.cyberciti.biz/security/expect-ssh-login-script/

如果Machine A是一台Windows机器,您可以使用Plink (PuTTY的一部分)和-m参数,它将在远程服务器上执行本地脚本。

plink root@MachineB -m local_script.sh

如果Machine A是一个基于unix的系统,你可以使用:

ssh root@MachineB 'bash -s' < local_script.sh

您不应该必须将脚本复制到远程服务器才能运行它。