当前位置 主页 > 服务器问题 > win服务器问题汇总 >

    详解SSH 远程执行任务的方法

    栏目:win服务器问题汇总 时间:2019-10-08 13:25

    SSH 是 Linux 下进行远程连接的基本工具,但是如果仅仅用它来登录那可是太浪费啦!SSH 命令可是完成远程操作的神器啊,借助它我们可以把很多的远程操作自动化掉!下面就对 SSH 的远程操作功能进行一个小小的总结。

    远程执行命令

    如果我们要查看一下某台主机的磁盘使用情况,是不是必须要登录到目标主机上才能执行 df 命令呢?当然不是的,我们可以使用 ssh 命令在远程的主机上执行 df 命令,然后直接把结果显示出来。整个过程就像是在本地执行了一条命令一样:

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

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

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

    第一条命令返回的结果: /home/nick

    这说明用这种方式执行命令时的当前目录就是登陆用户的家目录。

    第二条命令返回 hello.txt 文件的内容。

    注意,当命令多于一个时最好用引号括起来,否则在有的系统中除了第一个命令,其它都是在本地执行的。

    执行需要交互的命令

    有时候我们需要远程执行一些有交互操作的命令。

    $ 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 会保持登录状态,直到你退出需要交互的命令。

    作为总结,我们看看 -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 参数!

    执行多行的命令

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

    你可以用单引号或双引号开头,然后写上几行命令,最后再用相同的引号来结束。

    那么如果需要在命令中使用引号该怎么办?

    其实针对类似的情况有一条比较通用的规则,就是混合使用单双引号。这条规则在这里也是适用的:

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

    请注意上图中的最后一行,并没有输出我们期望的 nick。这里多少有些诡异,因为如果变量没有被解释的话,输出的应该是 $name 才对。但是这里却什么都没有输出。