我们平时用ssh命令的大部分情况都是先登录到目标机器,然后再执行各种命令,但有时我们登录目标机器只是为了执行一条命令,比如top查看下当前服务器状态,然后就退出了,在这种情况下,要登录目标机器再执行命令这种模式就显得有些麻烦了。
那有更好的方式吗?当然有!
先看下ssh命令的具体格式:
ssh [options] destination [command]
方括号代表可选,由上可见,options和command都是可选的,也就是说,我们在使用ssh命令时可以不指定这些部分,其实这也是我们平时使用ssh命令时用的最多的一种情况,即ssh user@host直接登录到目标机器。
那如果我们提供command参数会有什么效果呢?
下面我们来实验看下:
$ ssh u3@h3 pwd
/home/u3
$
由上可见,ssh直接帮我们在目标机器上执行了该命令,并把其输出打印到了我们当前的终端,好方便。
简单总结下:
如果我们没有提供command参数,ssh默认的command其实就是shell(bash或zsh等),ssh会执行对应的shell命令,为我们提供一个shell环境,这样我们就可以在目标机器上执行各种命令了。
如果我们提供了command参数,ssh就会执行我们指定的command,然后再将输出发送回我们的终端。
下面我们再多看几个例子。
1. 查看目标机器上home目录硬盘使用情况:
$ ssh u3@h3 du -sh '$HOME'
3.0G /home/u3
2. 查看目标机器的内存使用情况:
$ ssh u3@h3 free -h
total used free shared buff/cache available
Mem: 1.9G 913M 111M 15M 966M 878M
Swap: 472M 268K 472M
3. 用top命令查看目标机器当前的系统状态:
$ ssh u3@h3 top
TERM environment variable not set.
嗯,咋回事,这次怎么失败了呢?
其实这又涉及到了ssh的另外一个知识点。
当我们没有指定command参数时,ssh执行的command是shell,且是在交互模式(interacitve)下执行的,当我们指定了command参数时,ssh执行的是我们的command,且是在非交互模式下执行的。
所谓交互模式,就是可以有多次的输入或输出。
根据这些信息,我们应该就可以知道,为什么上面的top命令执行不成功了吧。
top命令是动态输出内容的,而且可以通过一些方法改变其输出规则(top命令示例学习),即它是有输入的,是可交互的,所以它必须在交互模式下才能执行,而上面又提到,如果我们指定了command参数,该command默认是在非交互模式下执行的,所以,上面的top命令就执行失败了。
那如何告知ssh要启用交互模式呢?只要加个-t参数就行了。
再试下上面的top命令,看这次是不是就可以了。
$ ssh -t u3@h3 top
ssh远程命令这个技巧在我们维护很多服务器或写批量处理脚本等情况时非常有用,其再结合linux下的输入输出重定向等功能,经常可以用来实现一些原本你觉得很难实现的功能。
ssh远程命令的知识就介绍到这吧,希望能对大家有所帮助。
完。
本文分享自 Linux内核及JVM底层相关技术研究 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!