Linux之22——ssh命令
SSH 是 Linux 下进⾏远程连接的基本⼯具,但是如果仅仅⽤它来登录那可是太浪费啦!SSH 命令可是完成远程操作的神器啊,借助它我们可以把很多的远程操作⾃动化掉!下⾯就对 SSH 的远程操作功能进⾏⼀个⼩⼩的总结。
远程执⾏命令
如果我们要查看⼀下某台主机的磁盘使⽤情况,是不是必须要登录到⽬标主机上才能执⾏ df 命令呢?当然不是的,我们可以使⽤ ssh 命令在远程的主机上执⾏ df 命令,然后直接把结果显⽰出来。整个过程就像是在本地执⾏了⼀条命令⼀样:
$ ssh x.xxx "df -h"
那么如何⼀次执⾏多条命令呢?其实也很简单,使⽤分号把不同的命令隔起来就 OK 了:
$ ssh x.xxx "pwd; "
第⼀条命令返回的结果: /home/nick
这说明⽤这种⽅式执⾏命令时的当前⽬录就是登陆⽤户的家⽬录。
第⼆条命令返回 ⽂件的内容。
注意,当命令多于⼀个时最好⽤引号括起来,否则在有的系统中除了第⼀个命令,其它都是在本地执⾏的。
执⾏需要交互的命令
有时候我们需要远程执⾏⼀些有交互操作的命令。
$ ssh x.xxx "sudo ls /root"
$ ssh x.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 才对。但是这⾥却什么都没有输出。
对于引⽤变量的写法,可以通过下⾯的⽅式保证变量被正确解释:
注意,我们在上图的命令中为 bash 指定了 -c 参数。
远程执⾏脚本
linuxshell脚本怎么运行
对于要完成⼀些复杂功能的场景,如果是仅仅能执⾏⼏个命令的话,简直是弱爆了。我们可能需要写长篇累牍的 shell 脚本去完成某项使命!此时SSH 依然是不辱使命的好帮⼿(哈哈,前⾯的内容仅仅是开胃菜啊!)。
执⾏本地的脚本
我们在本地创建⼀个脚本⽂件 test.sh,内容为:
ls
pwd
然后运⾏下⾯的命令:
$ ssh x.xxx < test.sh
通过重定向 stdin,本地的脚本 test.sh 在远程服务器上被执⾏。
接下来我们我期望能为脚本 test.sh 传递⼀个参数,为了验证传⼊的参数,在 test.sh ⽂件的末尾添加两⾏:
echo $0
echo $1
然后尝试执⾏下⾯的命令:
$ ssh x.xxx < test.sh helloworld
$ ssh x.xxx < "test.sh helloworld"
下图显⽰了执⾏的结果:
看来上⾯的⽅法都⽆法为脚本传递参数。
要想在这种情况下(远程执⾏本地的脚本)执⾏带有参数的脚本,需要为 bash 指定 -s 参数:
$ ssh x.xxx'bash -s' < test.sh helloworld
在上图的最后两⾏,输出的是 "bash" 和 "helloworld" 分别对应 $0 和 $1。
执⾏远程服务器上的脚本
除了执⾏本地的脚本,还有⼀种情况是脚本⽂件存放在远程服务器上,⽽我们需要远程的执⾏它!
此时在远程服务器上⽤户 nick 的家⽬录中有⼀个脚本 test.sh。⽂件的内容如下:
ls
pwd
执⾏下⾯的命令:
$ ssh x.xxx "/home/nick/test.sh"
注意,此时需要指定脚本的绝对路径!
下⾯我们也尝试为脚本传递参数。在远程主机上的 test.sh ⽂件的末尾添加两⾏:
echo $0
echo $1
然后尝试执⾏下⾯的命令:
$ ssh x.xxx /home/nick/test.sh helloworld
真棒,最后两⾏ "/home/nick/test.sh" 和 "helloworld" 分别对应 $0 和 $1。
总结
本⽂通过 demo 演⽰了 ssh 远程操作的基本⽅式。这些基本⽤法将为我们在更复杂的场景中完成各种艰巨的任务打下基础。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。