导航
首页
开发相关
后端技术
工具资源
随笔
其他
总结
留言板
ssh 远程执行命令
转载
发布于
2021-09-03 20:48:34
|
工具资源
| 浏览(
132
) | 评论(
0
)
<p style="text-align:left"><span style="font-size:10.5pt"><span style="background-color:white"><span style="font-family:DengXian"><span style="font-family:"PingFang SC",sans-serif"><span style="color:#333333">SSH </span></span><span style="font-family:"PingFang SC",sans-serif"><span style="color:#333333">是 Linux 下进行远程连接的基本工具,但是如果仅仅用它来登录那可是太浪费啦!SSH 命令可是完成远程操作的神器啊,借助它我们可以把很多的远程操作自动化掉!下面就对 SSH 的远程操作功能进行一个小小的总结。</span></span></span></span></span></p> <p style="text-align:left"><span style="font-size:10.5pt"><span style="background-color:white"><span style="font-family:DengXian"><strong><span style="font-size:21.0pt"><span style="font-family:"PingFang SC",sans-serif"><span style="color:#333333">远程执行命令</span></span></span></strong></span></span></span></p> <p style="text-align:left"><span style="font-size:10.5pt"><span style="background-color:white"><span style="font-family:DengXian"><span style="font-family:"PingFang SC",sans-serif"><span style="color:#333333">如果我们要查看一下某台主机的磁盘使用情况,是不是必须要登录到目标主机上才能执行 df 命令呢?当然不是的,我们可以使用 ssh 命令在远程的主机上执行 df 命令,然后直接把结果显示出来。整个过程就像是在本地执行了一条命令一样:</span></span></span></span></span></p> <pre> <code class="language-bash">ssh nick@xxx.xxx.xxx.xxx "df -h"</code></pre> <p style="text-align:left"><span style="font-size:10.5pt"><span style="background-color:white"><span style="font-family:DengXian"><span style="font-family:"PingFang SC",sans-serif"><span style="color:#333333">那么如何一次执行多条命令呢?其实也很简单,使用分号把不同的命令隔起来就 OK 了:</span></span></span></span></span></p> <pre> <code class="language-bash">ssh nick@xxx.xxx.xxx.xxx "pwd; cat hello.txt"</code></pre> <p style="text-align:left"><span style="font-size:10.5pt"><span style="background-color:white"><span style="font-family:DengXian"><span style="font-family:"PingFang SC",sans-serif"><span style="color:#333333">第一条命令返回的结果: /home/nick<br /> 这说明用这种方式执行命令时的当前目录就是登陆用户的家目录。<br /> 第二条命令返回 hello.txt 文件的内容。<br /> 注意,当命令多于一个时最好用引号括起来,否则在有的系统中除了第一个命令,其它都是在本地执行的。</span></span></span></span></span></p> <p style="text-align:left"><img src="//oss.mtjo.net/img/mtjo/e5740e14d7a9059420c0c4824f565361.png" style="height:71px; width:535px" /></p> <p style="text-align:left"><span style="font-size:10.5pt"><span style="background-color:white"><span style="font-family:DengXian"><strong><span style="font-size:21.0pt"><span style="font-family:"PingFang SC",sans-serif"><span style="color:#333333">执行需要交互的命令</span></span></span></strong></span></span></span></p> <p style="text-align:left"><span style="font-size:10.5pt"><span style="background-color:white"><span style="font-family:DengXian"><span style="font-family:"PingFang SC",sans-serif"><span style="color:#333333">有时候我们需要远程执行一些有交互操作的命令。</span></span></span></span></span></p> <pre> <code class="language-bash">ssh nick@xxx.xxx.xxx.xxx "sudo ls /root" ssh nick@xxx.xxx.xxx.xxx "top"</code></pre> <p style="text-align:left"><img src="//oss.mtjo.net/img/mtjo/b376961b21882f1b9f8edb102ccbfeaf.png" style="height:72px; width:487px" /></p> <p style="text-align:left"><span style="font-size:10.5pt"><span style="background-color:white"><span style="font-family:DengXian"><span style="font-family:"PingFang SC",sans-serif"><span style="color:#333333">这两条命令虽然提示的失败原因不同,但它们有一个共同点:都需要与用户交互(需要 TTY)。所以它们失败的原因也是相同的:<br /> 默认情况下,当你执行不带命令的 ssh 连接时,会为你分配一个 TTY。因为此时你应该是想要运行一个 shell 会话。<br /> 但是当你通过 ssh 在远程主机上执行命令时,并不会为这个远程会话分配 TTY。此时 ssh 会立即退出远程主机,所以需要交互的命令也随之结束。<br /> 好在我们可以通过 -t 参数显式的告诉 ssh,我们需要一个 TTY 远程 shell 进行交互!<br /> 添加 -t 参数后,ssh 会保持登录状态,直到你退出需要交互的命令。</span></span></span></span></span></p> <p style="text-align:left"><img src="//oss.mtjo.net/img/mtjo/7ef1b88901a958cf204ec0e55e9aae2e.png" style="height:69px; width:516px" /></p> <p style="text-align:left"><span style="font-size:10.5pt"><span style="background-color:white"><span style="font-family:DengXian"><span style="font-family:"PingFang SC",sans-serif"><span style="color:#333333">作为总结,我们看看 -t 参数的官方解释:<br /> "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."<br /> 好吧,更强悍的是我们居然可以指定多个 -t 参数!</span></span></span></span></span></p> <p style="text-align:left"><span style="font-size:10.5pt"><span style="background-color:white"><span style="font-family:DengXian"><strong><span style="font-size:21.0pt"><span style="font-family:"PingFang SC",sans-serif"><span style="color:#333333">执行多行的命令</span></span></span></strong></span></span></span></p> <p style="text-align:left"><span style="font-size:10.5pt"><span style="background-color:white"><span style="font-family:DengXian"><span style="font-family:"PingFang SC",sans-serif"><span style="color:#333333">有时候我们可能需要随手写几行简单的逻辑,这也没有问题,ssh 能轻松搞定!</span></span></span></span></span></p> <p style="text-align:left"><img src="//oss.mtjo.net/img/mtjo/4f082cc23b30efcfd383d7494cfad354.png" style="height:137px; width:363px" /></p> <p style="text-align:left"><span style="font-size:10.5pt"><span style="background-color:white"><span style="font-family:DengXian"><span style="font-family:"PingFang SC",sans-serif"><span style="color:#333333">你可以用单引号或双引号开头,然后写上几行命令,最后再用相同的引号来结束。<br /> 那么如果需要在命令中使用引号该怎么办?<br /> 其实针对类似的情况有一条比较通用的规则,就是混合使用单双引号。这条规则在这里也是适用的:</span></span></span></span></span></p> <p style="text-align:left"><img src="//oss.mtjo.net/img/mtjo/4900d6966c57eaf425adfc587fa0f560.png" style="height:170px; width:364px" /></p> <p style="text-align:left"><span style="font-size:10.5pt"><span style="background-color:white"><span style="font-family:DengXian"><span style="font-family:"PingFang SC",sans-serif"><span style="color:#333333">当我们在命令中引用了变量时会怎么样呢?</span></span></span></span></span></p> <p style="text-align:left"><img src="//oss.mtjo.net/img/mtjo/e23d41ae6f690b4d5b8bb16e4c8fb3e4.png" style="height:159px; width:371px" /></p> <p style="text-align:left"><span style="font-size:10.5pt"><span style="background-color:white"><span style="font-family:DengXian"><span style="font-family:"PingFang SC",sans-serif"><span style="color:#333333">请注意上图中的最后一行,并没有输出我们期望的 nick。这里多少有些诡异,因为如果变量没有被解释的话,输出的应该是 $name 才对。但是这里却什么都没有输出。<br /> 对于引用变量的写法,可以通过下面的方式保证变量被正确解释:</span></span></span></span></span></p> <p style="text-align:left"><img src="//oss.mtjo.net/img/mtjo/50d3693b6bbccb9cfb2e5299288a7f12.png" style="height:68px; width:444px" /></p> <p style="text-align:left"><span style="font-size:10.5pt"><span style="background-color:white"><span style="font-family:DengXian"><span style="font-family:"PingFang SC",sans-serif"><span style="color:#333333">注意,我们在上图的命令中为 bash 指定了 -c 参数。</span></span></span></span></span></p> <p style="text-align:left"><span style="font-size:10.5pt"><span style="background-color:white"><span style="font-family:DengXian"><strong><span style="font-size:21.0pt"><span style="font-family:"PingFang SC",sans-serif"><span style="color:#333333">远程执行脚本</span></span></span></strong></span></span></span></p> <p style="text-align:left"><span style="font-size:10.5pt"><span style="background-color:white"><span style="font-family:DengXian"><span style="font-family:"PingFang SC",sans-serif"><span style="color:#333333">对于要完成一些复杂功能的场景,如果是仅仅能执行几个命令的话,简直是弱爆了。我们可能需要写长篇累牍的 shell 脚本去完成某项使命!此时 SSH 依然是不辱使命的好帮手(哈哈,前面的内容仅仅是开胃菜啊!)。</span></span></span></span></span></p> <p style="text-align:left"><span style="font-size:10.5pt"><span style="background-color:white"><span style="font-family:DengXian"><strong><span style="font-size:16.0pt"><span style="font-family:"PingFang SC",sans-serif"><span style="color:#333333">执行本地的脚本</span></span></span></strong></span></span></span></p> <p style="text-align:left"><span style="font-size:10.5pt"><span style="background-color:white"><span style="font-family:DengXian"><span style="font-family:"PingFang SC",sans-serif"><span style="color:#333333">我们在本地创建一个脚本文件 test.sh,内容为:</span></span></span></span></span></p> <pre> <code class="language-bash">ls pwd</code></pre> <p style="text-align:left"><span style="font-size:10.5pt"><span style="background-color:white"><span style="font-family:DengXian"><span style="font-family:"PingFang SC",sans-serif"><span style="color:#333333">然后运行下面的命令:</span></span></span></span></span></p> <pre> <code class="language-bash">ssh nick@xxx.xxx.xxx.xxx < test.sh</code></pre> <p style="text-align:left"><img src="//oss.mtjo.net/img/mtjo/3dfbd3a4e58605c70971a05a2154c18c.png" style="height:290px; width:631px" /></p> <p style="text-align:left"><span style="font-size:10.5pt"><span style="background-color:white"><span style="font-family:DengXian"><span style="font-family:"PingFang SC",sans-serif"><span style="color:#333333">通过重定向 stdin,本地的脚本 test.sh 在远程服务器上被执行。</span></span></span></span></span></p> <p style="text-align:left"><span style="font-size:10.5pt"><span style="background-color:white"><span style="font-family:DengXian"><span style="font-family:"PingFang SC",sans-serif"><span style="color:#333333">接下来我们我期望能为脚本 test.sh 传递一个参数,为了验证传入的参数,在 test.sh 文件的末尾添加两行:</span></span></span></span></span></p> <pre> echo $0 echo $1</pre> <p style="text-align:left"><span style="font-size:10.5pt"><span style="background-color:white"><span style="font-family:DengXian"><span style="font-family:"PingFang SC",sans-serif"><span style="color:#333333">然后尝试执行下面的命令:</span></span></span></span></span></p> <pre> <code class="language-bash">ssh nick@xxx.xxx.xxx.xxx < test.sh helloworld ssh nick@xxx.xxx.xxx.xxx < "test.sh helloworld"</code></pre> <p style="text-align:left"><span style="font-size:10.5pt"><span style="background-color:white"><span style="font-family:DengXian"><span style="font-family:"PingFang SC",sans-serif"><span style="color:#333333">下图显示了执行的结果:</span></span></span></span></span></p> <p style="text-align:left"><img src="//oss.mtjo.net/img/mtjo/f13b6a8935c07ed68a6f6ae9410a0ab8.png" style="height:70px; width:554px" /></p> <p style="text-align:left"><span style="font-size:10.5pt"><span style="background-color:white"><span style="font-family:DengXian"><span style="font-family:"PingFang SC",sans-serif"><span style="color:#333333">看来上面的方法都无法为脚本传递参数。<br /> 要想在这种情况下(远程执行本地的脚本)执行带有参数的脚本,需要为 bash 指定 -s 参数:</span></span></span></span></span></p> <pre> ssh nick@xxx.xxx.xxx.xxx 'bash -s' < test.sh helloworld</pre> <p style="text-align:left"><img src="//oss.mtjo.net/img/mtjo/b223ff3aab020a7adc633b303b7b3126.png" style="height:119px; width:629px" /></p> <p style="text-align:left"><span style="font-size:10.5pt"><span style="background-color:white"><span style="font-family:DengXian"><span style="font-family:"PingFang SC",sans-serif"><span style="color:#333333">在上图的最后两行,输出的是 "bash" 和 "helloworld" 分别对应 $0 和 $1。</span></span></span></span></span></p> <p style="text-align:left"><span style="font-size:10.5pt"><span style="background-color:white"><span style="font-family:DengXian"><strong><span style="font-size:16.0pt"><span style="font-family:"PingFang SC",sans-serif"><span style="color:#333333">执行远程服务器上的脚本</span></span></span></strong></span></span></span></p> <p style="text-align:left"><span style="font-size:10.5pt"><span style="background-color:white"><span style="font-family:DengXian"><span style="font-family:"PingFang SC",sans-serif"><span style="color:#333333">除了执行本地的脚本,还有一种情况是脚本文件存放在远程服务器上,而我们需要远程的执行它!<br /> 此时在远程服务器上用户 nick 的家目录中有一个脚本 test.sh。文件的内容如下:</span></span></span></span></span></p> <pre> ls pwd</pre> <p style="text-align:left"><span style="font-size:10.5pt"><span style="background-color:white"><span style="font-family:DengXian"><span style="font-family:"PingFang SC",sans-serif"><span style="color:#333333">执行下面的命令:</span></span></span></span></span></p> <pre> <code class="language-bash">ssh nick@xxx.xxx.xxx.xxx "/home/nick/test.sh"</code></pre> <p style="text-align:left"><img src="//oss.mtjo.net/img/mtjo/54792dff23977521ab62b0cfc3ed9e39.png" style="height:104px; width:536px" /></p> <p style="text-align:left"><span style="font-size:10.5pt"><span style="background-color:white"><span style="font-family:DengXian"><span style="font-family:"PingFang SC",sans-serif"><span style="color:#333333">注意,此时需要指定脚本的绝对路径!</span></span></span></span></span></p> <p style="text-align:left"><span style="font-size:10.5pt"><span style="background-color:white"><span style="font-family:DengXian"><span style="font-family:"PingFang SC",sans-serif"><span style="color:#333333">下面我们也尝试为脚本传递参数。在远程主机上的 test.sh 文件的末尾添加两行:</span></span></span></span></span></p> <pre> echo $0 echo $1</pre> <p style="text-align:left"><span style="font-size:10.5pt"><span style="background-color:white"><span style="font-family:DengXian"><span style="font-family:"PingFang SC",sans-serif"><span style="color:#333333">然后尝试执行下面的命令:</span></span></span></span></span></p> <pre> <code class="language-bash">ssh nick@xxx.xxx.xxx.xxx /home/nick/test.sh helloworld</code></pre> <p style="text-align:left"><img src="//oss.mtjo.net/img/mtjo/78755251fbab16ff0a418a03f165dbbf.png" style="height:138px; width:621px" /></p> <p style="text-align:left"><span style="font-size:10.5pt"><span style="background-color:white"><span style="font-family:DengXian"><span style="font-family:"PingFang SC",sans-serif"><span style="color:#333333">真棒,最后两行 "/home/nick/test.sh" 和 "helloworld" 分别对应 $0 和 $1。</span></span></span></span></span></p> <p style="text-align:left"><span style="font-size:10.5pt"><span style="background-color:white"><span style="font-family:DengXian"><strong><span style="font-size:21.0pt"><span style="font-family:"PingFang SC",sans-serif"><span style="color:#333333">总结</span></span></span></strong></span></span></span></p> <p style="text-align:left"><span style="font-size:10.5pt"><span style="background-color:white"><span style="font-family:DengXian"><span style="font-family:"PingFang SC",sans-serif"><span style="color:#333333">本文通过 demo 演示了 ssh 远程操作的基本方式。这些基本用法将为我们在更复杂的场景中完成各种艰巨的任务打下基础。</span></span></span></span></span></p> <p style="text-align:justify"> </p>
本文转自
https://blog.csdn.net/liuxiao723846/article/details/82667482
,如有侵权,请联系删除。
点赞
3
打赏
微信赞赏
支付宝赞赏
发表评论
欢迎您:
发表评论
最新文章
推荐
点击排行
1
再给领克旧车机一次机会——雷达触发360全景、转向灯触发360全景、汽车事件联动车机、超速提示。。。一样都不能少
2
GO配置国内镜像
3
Java 线程的创建方式有哪些?
4
IOS、Mac中国法定节假日
5
卸载阿里云监控软件方法
6
iftop – 实时 Linux 网络带宽监控工具
7
免费申请和使用IntelliJ IDEA商业版License指南
8
ssh 远程执行命令
9
使用 systemd 限制系统资源的使用
10
如何更规范化编写Java 代码
1
再给领克旧车机一次机会——雷达触发360全景、转向灯触发360全景、汽车事件联动车机、超速提示。。。一样都不能少
2
Mac OS 最好用的鼠标手势软件 MacStroke
3
git 找回丢失的commit
4
小米路由器插件
5
Redis中的批量删除数据库中的Key
6
LINUX 安装多个版本JDK
7
免费申请和使用IntelliJ IDEA商业版License指南
8
精简 迅雷 for MAC
9
Dnsmasq 配置文件详解
10
Nginx深入详解之upstream分配方式
1
小米路由器插件
2
基于Android Webview的Hybrid App开发的前端优化
3
LINUX 安装多个版本JDK
4
Android Studio使用心得 - 常见问题
5
XDebug 调试PHP 配置
6
mysql主从复制
7
Git忽略规则及.gitignore规则不生效的解决办法
8
如何在一台机器上配置多个git的rsa
9
关于Android与pc通信时中文乱码的分析和解决
10
MacStroke
标签云
Linux
Java
Spring
Spring Boot
其他
IntelliJ IDEA
MacOS
工具
资源
JavaScript
Mac
网站信息
浏览总数:
629552
文章总数:
47
篇
标签总数:
11
个
分类总数:
6
个
留言数量:
10
条
关于本站
MTJO
明天见哦
Copyright © 2022. MTJO ·
桂ICP备16000489号-1
Powered by
MTJO