SSH 远程执行任务

SSH 是 Linux 下进行远程链接的基本工具,可是若是仅仅用它来登陆那但是太浪费啦!SSH 命令但是完成远程操做的神器啊,借助它咱们能够把不少的远程操做自动化掉!下面就对 SSH 的远程操做功能进行一个小小的总结。shell

远程执行命令

若是咱们要查看一下某台主机的磁盘使用状况,是否是必需要登陆到目标主机上才能执行 df 命令呢?固然不是的,咱们可使用 ssh 命令在远程的主机上执行 df 命令,而后直接把结果显示出来。整个过程就像是在本地执行了一条命令同样:bash

$ ssh nick@xxx.xxx.xxx.xxx "df -h"

那么如何一次执行多条命令呢?其实也很简单,使用分号把不一样的命令隔起来就 OK 了:服务器

$ ssh nick@xxx.xxx.xxx.xxx "pwd; cat hello.txt"

第一条命令返回的结果: /home/nick
这说明用这种方式执行命令时的当前目录就是登录用户的家目录。
第二条命令返回 hello.txt 文件的内容。
注意,当命令多于一个时最好用引号括起来,不然在有的系统中除了第一个命令,其它都是在本地执行的。ssh

执行须要交互的命令

有时候咱们须要远程执行一些有交互操做的命令。工具

$ ssh nick@xxx.xxx.xxx.xxx "sudo ls /root"
$ ssh nick@xxx.xxx.xxx.xxx "top"

这两条命令虽然提示的失败缘由不一样,但它们有一个共同点:都须要与用户交互(须要 TTY)。因此它们失败的缘由也是相同的:
默认状况下,当你执行不带命令的 ssh 链接时,会为你分配一个 TTY。由于此时你应该是想要运行一个 shell 会话。
可是当你经过 ssh 在远程主机上执行命令时,并不会为这个远程会话分配 TTY。此时 ssh 会当即退出远程主机,因此须要交互的命令也随之结束。
好在咱们能够经过 -t 参数显式的告诉 ssh,咱们须要一个 TTY 远程 shell 进行交互!
添加 -t 参数后,ssh 会保持登陆状态,直到你退出须要交互的命令。spa

做为总结,咱们看看 -t 参数的官方解释:
"Force pseudo-terminal allocation.  This can be used to execute arbitrary screen-based programs on a remote machine, which can be very useful, e.g. when implementing menu services.  Multiple -t options force tty allocation, even if ssh has no local tty."
好吧,更强悍的是咱们竟然能够指定多个 -t 参数!3d

执行多行的命令

有时候咱们可能须要随手写几行简单的逻辑,这也没有问题,ssh 能轻松搞定!code

你能够用单引号或双引号开头,而后写上几行命令,最后再用相同的引号来结束。
那么若是须要在命令中使用引号该怎么办?
其实针对相似的状况有一条比较通用的规则,就是混合使用单双引号。这条规则在这里也是适用的:blog

当咱们在命令中引用了变量时会怎么样呢?ip

请注意上图中的最后一行,并无输出咱们指望的 nick。这里多少有些诡异,由于若是变量没有被解释的话,输出的应该是 $name 才对。可是这里却什么都没有输出。
对于引用变量的写法,能够经过下面的方式保证变量被正确解释:

注意,咱们在上图的命令中为 bash 指定了 -c 参数。

远程执行脚本

对于要完成一些复杂功能的场景,若是是仅仅能执行几个命令的话,简直是弱爆了。咱们可能须要写长篇累牍的 shell 脚本去完成某项使命!此时 SSH 依然是不辱使命的好帮手(哈哈,前面的内容仅仅是开胃菜啊!)。

执行本地的脚本

咱们在本地建立一个脚本文件 test.sh,内容为:

ls
pwd

而后运行下面的命令:

$ ssh nick@xxx.xxx.xxx.xxx < test.sh

经过重定向 stdin,本地的脚本 test.sh 在远程服务器上被执行。

接下来咱们我指望能为脚本 test.sh 传递一个参数,为了验证传入的参数,在 test.sh 文件的末尾添加两行:

echo $0
echo $1

而后尝试执行下面的命令:

$ ssh nick@xxx.xxx.xxx.xxx < test.sh helloworld
$ ssh nick@xxx.xxx.xxx.xxx < "test.sh helloworld"

下图显示了执行的结果:

看来上面的方法都没法为脚本传递参数。
要想在这种状况下(远程执行本地的脚本)执行带有参数的脚本,须要为 bash 指定 -s 参数:

$ ssh nick@xxx.xxx.xxx.xxx 'bash -s' < test.sh helloworld

在上图的最后两行,输出的是 "bash" 和 "helloworld" 分别对应 $0 和 $1。

执行远程服务器上的脚本

除了执行本地的脚本,还有一种状况是脚本文件存放在远程服务器上,而咱们须要远程的执行它!
此时在远程服务器上用户 nick 的家目录中有一个脚本 test.sh。文件的内容以下:

ls
pwd

执行下面的命令:

$ ssh nick@xxx.xxx.xxx.xxx "/home/nick/test.sh"

注意,此时须要指定脚本的绝对路径!

下面咱们也尝试为脚本传递参数。在远程主机上的 test.sh 文件的末尾添加两行:

echo $0
echo $1

而后尝试执行下面的命令:

$ ssh nick@xxx.xxx.xxx.xxx /home/nick/test.sh helloworld

真棒,最后两行 "/home/nick/test.sh" 和 "helloworld" 分别对应 $0 和 $1。

总结

本文经过 demo 演示了 ssh 远程操做的基本方式。这些基本用法将为咱们在更复杂的场景中完成各类艰巨的任务打下基础。

相关文章
相关标签/搜索