我必须在远程机器上运行 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
(我认为这应该有效)
另外,如果要从目标主机中获取变量,请不要忘记转义变量。
这让我过去了。
例如:
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}'"
正确打印出 “你好”。