我必须在远程机器上运行本地shell脚本(windows/Linux)。
我在机器A和机器B上都配置了SSH。我的脚本在机器A上,它将在远程机器B上运行我的一些代码。
本地和远程计算机可以是基于Windows或Unix的系统。
是否有一种方法来运行这个使用plink/ssh?
我必须在远程机器上运行本地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
其他回答
如果你想这样执行命令 temp = ' ls - a ' echo $临时 ' '中的命令将导致错误。
下面的命令将解决这个问题 SSH user@host " ' temp = ' ls - a ' echo $临时 “‘
我用它在远程机器上运行一个shell脚本(在/bin/bash上测试):
ssh deploy@host . /home/deploy/path/to/script.sh
另外,如果想从目标主机获取变量,不要忘记转义变量。
这在过去曾让我陷入困境。
例如:
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}'"
正确地输出“hello”。
首先,使用scp将脚本复制到机器B
[user@machineA]$ scp /path/to/script user@machineB:/home/user/path
然后,运行脚本
[user@machineA]$ ssh user@machineB "/home/user/path/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
您不应该必须将脚本复制到远程服务器才能运行它。