协慌网

登录 贡献 社区

如何使用 SSH 在远程计算机上运行 shell 脚本?

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

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

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

有没有办法使用 plink / ssh 运行?

答案

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

plink root@MachineB -m local_script.sh

如果机器 A 是基于 Unix 的系统,您可以使用:

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

您不必将脚本复制到远程服务器以运行它。

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

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

这也可以与 su 和需要用户输入的命令一起使用。 (注意'逃脱的 heredoc)

编辑:由于这个答案不断得到流量,我会添加更多的信息到 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.secureftp-test.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.secureftp-test.com <<-'ENDFTP'
            test
            test
            ls
        ENDFTP
    END2
ENDSSH

(我认为这应该有效)

另请参阅http://tldp.org/LDP/abs/html/here-docs.html

另外,如果要从目标主机中获取变量,请不要忘记转义变量。

这让我过去了。

例如:

user@host> ssh user2@host2 "echo \$HOME"

打印出 / home / user2

user@host> ssh user2@host2 "echo $HOME"

打印 / home / user

另一个例子:

user@host> ssh user2@host2 "echo hello world | awk '{print \$1}'"

正确打印出 “你好”。