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

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

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

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


当前回答

这是YarekT的答案的扩展,将内联远程命令与从本地机器传递到远程主机的ENV变量相结合,这样你就可以在远程端参数化你的脚本:

ssh user@host ARG1=$ARG1 ARG2=$ARG2 'bash -s' <<'ENDSSH'
  # commands to run on remote host
  echo $ARG1 $ARG2
ENDSSH

我发现这非常有用,因为它将所有这些都保存在一个脚本中,因此非常易于阅读和维护。

为什么会这样?SSH支持以下语法:

SSH user@host remote_command

在bash中,我们可以在运行单行命令之前指定环境变量,如下所示:

ENV_VAR_1='value1' ENV_VAR_2='value2' bash -c 'echo $ENV_VAR_1 $ENV_VAR_2'

这使得在运行命令之前很容易定义变量。在本例中,echo是我们正在运行的命令。echo之前的所有内容都定义了环境变量。

因此,我们将这两个特征和YarekT的答案结合起来,得到:

ssh user@host ARG1=$ARG1 ARG2=$ARG2 'bash -s' <<'ENDSSH'…

在本例中,我们将ARG1和ARG2设置为本地值。发送user@host之后的所有内容作为remote_command。当远程计算机执行命令时,ARG1和ARG2被设置为本地值,这要归功于本地命令行计算,它定义了远程服务器上的环境变量,然后使用这些变量执行bash -s命令。瞧。

其他回答

我用它在远程机器上运行一个shell脚本(在/bin/bash上测试):

ssh deploy@host . /home/deploy/path/to/script.sh

如果你想这样执行命令 temp = ' ls - a ' echo $临时 ' '中的命令将导致错误。

下面的命令将解决这个问题 SSH user@host " ' temp = ' ls - a ' echo $临时 “‘

cat ./script.sh | ssh <user>@<host>

你可以使用runoverssh:

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

-s远程运行本地脚本


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

这是一个老问题,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