当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何使用SSH在远程计算机上运行shell脚本?》经验,为你挑选了9个好方法。

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

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

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

有没有办法使用plink/ssh运行?



1> Jason R. Coo..:

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

plink root@MachineB -m local_script.sh

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

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

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


对于需要`sudo`的脚本,运行`ssh root @ MachineB'echo"rootpass"| sudo -Sv && bash -s'@Agostino,你可以添加这样的参数:`ssh root @ MachineB ARG1 ="arg1"ARG2 ="arg2"'bash -s'使用`-s`选项有什么好处?[本手册页](http://linux.die.net/man/1/sh)让我相信,当它完成处理选项时,它将处理标准输入,无论是否使用`-s`.
@ bradley.ayers如果你已经以root身份登录,在什么情况下你需要sudo?
@ bradley.ayers记得以'space'开始命令以跳过历史记录(PS你需要'HISTCONTROL = ignoreboth或ignorespace`才能使它工作)
看来$ PATH环境变量没有应用?
我希望在远程计算机上设置$ PATH。最后,我喜欢这个解决方案,在〜/ .bashrc的顶部附近添加了export语句。
简要说明一下:对`bash`使用`--login`选项,使其表现得像普通的登录shell(例如,设置路径的方式类似于在〜/ .bash-profile等中定义的路径)。像`ssh root @ MachineB'bash -ls'<local_script.sh`一样使用它

2> Yarek T..:

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


请注意,在终结符周围使用单引号(`<<'ENDSSH'`),字符串不会被扩展,变量将不会被评估.如果要扩展,也可以使用`<< ENDSSH`或`<<"ENDSSH"`.
如果您尝试使用<< - 'END'语法,请确保使用TAB而不是空格缩进您的heredoc结束分隔符.请注意,从stackexchange复制/粘贴将为您提供空间.将它们更改为选项卡,缩进功能应该有效.
您可以通过添加以下行来进行临时调整:#$(sleep 5)
请注意,我有一个`伪终端将不会被分配,因为stdin不是终端.消息.必须使用带有`-t -t`参数的ssh来避免这种情况.请参阅[SO上的主题](http://stackoverflow.com/questions/7114990/pseudo-terminal-will-not-be-allocated-because-stdin-is-not-a-terminal)
当您需要自动化FTP等交互式命令时,可以使用`Expect`。

3> dogbane..:

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

这让我过去了.

例如:

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}'"

正确打印出"你好".


但请注意以下事项:`ssh user2 @ host'bash -s'echo $ HOME/home/user2 exit`

4> chubbsondubs..:

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


如果任何env var值包含空格,请使用:`ssh user @ host"ARG1 = \"$ ARG1 \"ARG2 = \"$ ARG2 \""'bash -s'<<'ENDSSH'...

5> Vinko Vrsalo..:
$ ssh user@hostB "ls -la"

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


我不认为这回答了这个问题.该示例显示如何运行远程命令,但不显示如何在远程计算机上执行本地脚本.
投票给你了.这是一个有效的解决方案.显然,密钥必须受到保护,但它们也可以像服务器端的密码一样无效.

6> Jason R. Coo..:

我已经开始使用Fabric进行更复杂的操作.Fabric需要Python和其他几个依赖项,但仅限于客户端计算机上.服务器只需要一个ssh服务器.我发现这个工具比传递给SSH的shell脚本更强大,值得设置的麻烦(特别是如果你喜欢用Python编程).Fabric处理在多个主机(或某些角色的主机)上运行脚本,有助于促进幂等操作(例如在配置脚本中添加一行,但如果它已经存在则不行),并允许构造更复杂的逻辑(例如Python)语言可以提供).



7> 小智..:

试试跑步ssh user@remote sh ./script.unx.


仅当脚本位于远程的默认(主)目录中时,此方法才有效.我认为问题是如何运行本地存储在遥控器上的脚本.

8> George Jempt..:

假设您想要从"本地"机器自动执行此操作,而无需手动登录"远程"机器,您应该查看名为Expect的TCL扩展,它专为此类情况而设计.我还提供了一个用于通过SSH登录/交互的脚本的链接.

https://www.nist.gov/services-resources/software/expect

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



9> Is Ma..:

我使用此脚本在远程计算机上运行shell脚本(在/ bin / bash上测试):

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

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有