SSH 是 Linux 下进行远程连接的基本工具,不光可以登录,也可以远程操作。接下来我们详细讲解一些常用的情况。

1、执行简单的命令:

1)查看某台主机上的磁盘使用情况:

$ ssh root@1.113.195.138 "df -h"
***************************************************************************NOTICE TO UsersThis computer system is the private property of ...***************************************************************************Filesystem            Size  Used Avail Use% Mounted on
/dev/vda2              36G  3.2G   31G  10% /
tmpfs                  25G     0   25G   0% /dev/shm
/dev/vdb              296G  2.0G  279G   1% /data

可以看到会把ssh远程连接的信息,以及远程执行名的返回的信息都输出到了控制台上。

2)保存远程执行命令结果:

有时我们需要保存远程执行命令的结果,然后进行判断。有两种方法:

  • 赋值的方式:result=`ssh x@B ~/command.sh`
  • 追加到文件:ssh root@$ip "cmd" >> ./log

详情见:https://blog.csdn.net/liuxiao723846/article/details/55045988

3)一次执行多个命令:

在shell中单行语句一般要用到分号来区分代码块,多行的话用换行符来区分代码块,则无需用到分号。

$ if [ "$PS1" ]; then echo test is ok; fi
test is ok如果换做多行
$if [ "PS1" ]
> then echo "test is ok"
> fi
test is ok

所以,我们可以在ssh中用分好拼接多个命令

ssh root@$IP  "if [ -e /lib64/libpcre.so.1 ];then echo 'file exits...';else cd /lib64 && ln -s libpcre.so.0.0.1 libpcre.so.1;fi"

2、执行需要交互的命令:

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

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

3、执行本地脚本

通常我们遇到的不会是上面那种简单的问题,大多数时候我们需要把若干个命令放到一个脚本里,然后分发到远程去执行。大致有两种思路:

  • 使用scp将本地脚本文件拷贝到远端,然后再通过ssh执行远端的脚本;(弊端是脚本修改后,每次都需要scp)
  • 直接在本地执行脚本到远程;

一个scp的例子

for IP in ${IP_ARR[@]}
dossh root@$IP "rm -rf $MONITOR_TARGET_FILE" ssh root@$IP "mkdir -p /data/apps/scripts"scp $MONITOR_SOURCE_FILE root@$IP:$MONITOR_TARGET_FILEssh root@$IP 'echo "*/1 * * * * /usr/bin/python /data/apps/scripts/checkStatus.py' $BUSINESS_TYPE '>/dev/null 2>&1" >> /var/spool/cron/root'done

重点我们在如何在本地执行脚本到远程。

1)执行一个简单的脚本到远程:

$ cat test.sh
ls
pwd$ ssh root@10.153.195.138 < test.sh
anaconda-ks.cfg
/root

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

2)为脚本传递参数:

$ cat test.sh
echo $1
echo $2在本地执行结构如下:
$ sh test.sh a b
a
b通过重定向远程执行,会报错
$ ssh root@10.153.195.138 < test.sh a b
bash: a: command not found

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

$ ssh root@10.153.195.138 'bash -s' < test.sh a b
a
b

除此之外,我们还可以通过替换的方式传参,然后远程执行,例如:

cat ./rollback_remote.sh | sed -e "s/#module#/${MODULE_NAME}/g" -e "s/#runarg#/${RUN_ARG}/g" | ssh $IP

4、执行远程服务器上的脚本

除了执行本地的脚本,还有一种情况是脚本文件存放在远程服务器上,而我们需要远程的执行它!此时在远程服务器上用户 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

可以正确得到结果。

5、执行多行命令

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

$ ssh root@10.153.195.138 "
> ls
> pwd
> "
anaconda-ks.cfg
/root

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

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

$ name=test
$ ssh root@10.153.195.138 "
> echo $name
> "
test$ ssh root@10.153.195.138 '
echo $name
'

最后一行,并没有输出我们期望的 test。这里多少有些诡异,因为如果变量没有被解释的话,输出的应该是 $name 才对。但是这里却什么都没有输出。对于引用变量的写法,可以通过bash 指定了 -c 参数方式保证变量被正确解释:

$ ssh root@10.153.195.138 bash -c "'
echo $name
'"
test

ssh 远程执行命令相关推荐

  1. 解决SSH远程执行命令找不到环境变量的问题

    解决SSH远程执行命令找不到环境变量的问题 参考文章: (1)解决SSH远程执行命令找不到环境变量的问题 (2)http://www.cnblogs.com/zhenyuyaodidiao/p/928 ...

  2. day26-3 模拟ssh远程执行命令

    目录 模拟ssh远程执行命令 服务器 客户端 模拟ssh远程执行命令 实现在客户端输入执行命令后,返回执行命令的信息.如输入dir,显示当前目录下的所有文件和文件夹 服务器 import socket ...

  3. 【linux】ssh 远程执行命令

    1.概述 转载并且补充:ssh 远程执行命令 SSH 是 Linux 下进行远程连接的基本工具,但是如果仅仅用它来登录那可是太浪费啦!SSH 命令可是完成远程操作的神器啊,借助它我们可以把很多的远程操 ...

  4. SSH远程执行命令环境变量问题

    SSH命令格式 usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec][-D [bind_address:] ...

  5. linux 带环境变量 远程执行,SSH远程执行命令环境变量问题

    SSH命令格式 usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec] [-D [bind_address: ...

  6. ssh远程执行命令 linux,Linux下使用SSH远程执行命令方法收集

    说明:可以做SSH免密登录之后执行,这样可以省去每次执行输入密码的提示. 对于简单的命令: 如果是简单执行几个命令,则: ssh user@remoteNode "cd /home ; ls ...

  7. 关于ssh远程执行命令出现xxx: command not found问题

    最初是在虚拟机搭建Hadoop3.x集群,使用命令ssh hadoop001 jps,出现: bash: jps: command not found 但是单独测试jps命令和先ssh登录再测试jps ...

  8. 【linux】ssh 远程执行命令自动输入密码方式

    ssh 远程执行命令自动输入密码方式 场景: 由于多台机必须要登陆执行命令,需要使用密钥一台台登录,所以每次登陆机器的时候都需要手动输入域账号密码.密码太长且复杂,手动输入容易输错,故使用脚本来做这个 ...

  9. 远程启动hadoop,ssh远程执行命令报错!hdfs命令不存在!

    1.任务:远程启动hadoop集群. #!/usr/bin/env bash HADOOP_HOME=/root/hadoop/hadoop-3.3.2 if [ $# -lt 1 ] thenech ...

  10. ssh mysql 导出excel_使用ssh远程执行命令批量导出数据库到本地(转)

    前天正在跟前端的同事调试功能.服务器开好,模拟的玩家登录好,就在倒计时.这时突然运营的同事跑过来说要统计几个服务器玩家的一些情况,也就是需要从几个服的数据库导出部分玩家的数据.好吧,我看了一下时间,1 ...

最新文章

  1. SpringMVC-Mybatis学习总结整理(下)
  2. 字节跳动教育裁员:赔付方式N+2
  3. 从零开始一个http服务器(五)-模拟cgi
  4. Android禁止ViewPager的左右滑动
  5. VC6里面的中文名字或者注释复制乱码解决
  6. Spring源码:spring-tx 事务
  7. gThumb 3.1.2 发布,支持 WebP 图像
  8. 如何在不支持双面打印的打印机上实现双面打印
  9. SIM900A 通过RS232串口进行短信的发送。
  10. iphone 竖屏的视频转换为横屏
  11. 使用GPUpassthrough方法发布带有GPU显卡的虚拟桌面
  12. [初学笔记] pause 语句 的运用,.m文件中按任意键继续程序或者延迟秒数继续程序
  13. JavaWeb重点笔记
  14. vue openlayer 添加风场效果
  15. 在线进行去除图片水印
  16. 三、使用Arduino控制WS2812B灯
  17. yunfile高级会员帐号获取器V1.0绿色版
  18. 敲完第一万行代码我发现一个秘密
  19. Ardunio开发实例-水银倾斜开关模块
  20. PAT Queueing at Bank(字符串处理)

热门文章

  1. “IOT+三维仿真”搭建医疗机构智慧消防“防”“消”一体化解决方案
  2. MongoDB系列之适用场景和不适用场景
  3. 对网红“故宫火锅店” 包容中要保持警惕
  4. 附下载|《金融行业应用解决方案白皮书》上新
  5. 【SequoiaDB|巨杉数据库】数据库核心特性
  6. cubasefx轨道_Cubase中调音台的功能——效果器的插入、EQ的调节、FX轨道的创建以及调音推子的使用简介...
  7. Win10 PowerShell命令大全
  8. linux qtcreator输入中文,linux下QtCreator无法输入中文的情况
  9. three.js 添加字体
  10. 小程序之onHide()和onUnload()