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

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

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

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


当前回答

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

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

其他回答

这个bash脚本可以ssh到目标远程机器,并在远程机器上运行一些命令,在运行它之前不要忘记安装expect(在mac brew上安装expect)

#!/usr/bin/expect
set username "enterusenamehere"
set password "enterpasswordhere"
set hosts "enteripaddressofhosthere"
spawn ssh  $username@$hosts
expect "$username@$hosts's password:"
send -- "$password\n"
expect "$"
send -- "somecommand on target remote machine here\n"
sleep 5
expect "$"
send -- "exit\n"

从@cglotr扩展答案。为了编写内联命令使用printf,它对简单的命令很有用,它支持多行使用字符转义'\n'

例子:

printf "cd /to/path/your/remote/machine/log \n tail -n 100 Server.log" | ssh <user>@<host> 'bash -s'

看,别忘了加上bash -s

<hostA_shell_prompt>$ ssh user@hostB "ls -la"

这将提示您输入密码,除非您已经将hostA用户的公钥复制到用户.ssh目录的home目录下的authorized_keys文件。这将允许无密码身份验证(如果在ssh服务器的配置上接受作为身份验证方法)。

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

这在过去曾让我陷入困境。

例如:

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”。

这是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命令。瞧。