如何使用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,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.secureftp-test.com <<-'ENDFTP' test test ls ENDFTP END2 ENDSSH
(我认为这应该工作)
另外,如果你想从目标主机中提取它们,请不要忘记转义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/交互。
我试着运行一个远程脚本,如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”
这将工作,如果你已经给脚本的可执行权限。