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

我如何在远程机器上运行一个shell脚本?

我在计算机A和B上都configuration了SSH。我的脚本在计算机A上执行任务。

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

plink root@MachineB -m local_script.sh 

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

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

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

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

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

这也可以用于需要用户input的su和命令。 (注意'逃脱heredoc)

编辑:由于这个答案不断获得stream量,我会添加更多的信息,这个奇妙的使用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,f​​tp等一些服务进行对话。但是请记住,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

另外,如果你想从目标主机中提取它们,请不要忘记转义variables。

这已经把我抓出去了。

例如:

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

打印出/ home / user2

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

打印/家庭/用户

另一个例子:

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

正确打印“你好”。

这是YarekT将内联远程命令与从本地机器传递到远程主机的ENVvariables相结合的答案的扩展,因此您可以在远程端参数化您的脚本:

 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中,我们可以指定环境variables来在单行上运行命令之前进行定义,如下所示:

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

这使得在运行命令之前定义variables变得很容易。 在这种情况下,echo是我们正在运行的命令。 echo之前的所有内容定义了环境variables

所以我们结合这两个特征和YarekT的答案来得到:

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

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

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

这将提示你input密码,除非你已经将你的hostA用户的公钥复制到了用户.ssh目录的home的authorized_keys文件中。 这将允许进行无密码身份validation(如果在ssh服务器的configuration中作为auth方法接受)

我已经开始使用Fabric进行更复杂的操作。 Fabric需要Python和其他一些依赖项,但只能在客户机上运行。 该服务器只需要一个SSH服务器。 我觉得这个工具比传递给SSH的shell脚本function强大得多,而且值得设置的麻烦(特别是如果你喜欢用Python编程的话)。 Fabric在多个主机(或某些特定angular色的主机)上处理运行脚本,有助于促进幂等操作(比如向configuration脚本添加一行,但如果已经存在的话),并允许构build更复杂的逻辑(如Python语言可以提供)。

假设你的意思是你想从一个“本地”机器自动完成这个工作,而不需要手动login到“远程”机器,你应该查看一个名为Expect的TCL扩展,它就是为这种情况devise的。 这是下面的主页看起来有点蹩脚,但不要让你劝阻你; 我还提供了一个脚本的链接,用于通过SSH进行login/交互。

http://expect.nist.gov/

http://bash.cyberciti.biz/security/expect-ssh-login-script/

我试着运行一个远程脚本,如ssh user @ remote sh script.unx

script.unx在远程机器上运行几个命令,但它说

突击队找不到,它看起来像远程脚本不读取环境variables

任何想法?

尝试运行ssh user @ remote sh ./script.unx

首先,使用scp将脚本复制到机器B.

[user @ machineA] $ scp / path / to / script user @ machineB:/ home / user / path

然后,运行脚本

[user @ machineA] $ ssh user @ machineB“/ home / user / path / script”

这将工作,如果你已经给脚本的可执行权限。

Interesting Posts