原文:https://blog.csdn.net/liuxiao723846/article/details/82667482

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

1、执行简单的命令:

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

$ ssh root@1.113.195.138 "df -h"
***************************************************************************
NOTICE TO Users This computer system is the private property of ... *************************************************************************** Filesystem Size Used Avail Use% Mounted on
/dev/vda2 36G .2G 31G % /
tmpfs 25G 25G % /dev/shm
/dev/vdb 296G .0G 279G % /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[@]}
do
ssh root@$IP "rm -rf $MONITOR_TARGET_FILE"
ssh root@$IP "mkdir -p /data/apps/scripts"
scp $MONITOR_SOURCE_FILE root@$IP:$MONITOR_TARGET_FILE
ssh 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 $
echo $ 在本地执行结构如下:
$ 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 $
echo $
然后尝试执行下面的命令: $ 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. 利用scp 远程上传下载文件/文件夹和ssh远程执行命令

    利用scp传输文件 1.从服务器下载文件scp username@servername:/path/filename /tmp/local_destination例如scp codinglog@192 ...

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

    通过SSH执行远程主机的命令或脚本时,经常会出现找不到自定义环境变量的问题.但是,如果通过SSH登录远程主机,然后再执行相同的命令或脚本,那么此时执行又是成功的.两种相似的方法,得到的结果却截然不同, ...

  3. 网络编程 - 1.简单的套接字通信/2.加上通信循环/3.bug修复/4.加上链接循环/5.模拟ssh远程执行命令

    1.简单的套接字通信 服务端 ''' 服务端 接电话 客户端 打电话 1.先启动服务端 2.服务端有两种套接字 1.phone 用来干接收链接的 2.conn 用来干收发消息的 ''' import ...

  4. ssh远程执行命令使用明文密码

    经过不懈的搜索终于找到ssh远程执行命令使用明文密码使用sshpass. 例子: sshpass -p "sequoiadb" ssh root@localhost "l ...

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

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

  6. 模拟ssh远程执行命令,粘包问题,基于socketserver实现并发的socket

    06.27自我总结 1.模拟ssh远程执行命令 利用套接字编来进行远程执行命令 服务端 from socket import * import subprocess server = socket(A ...

  7. 网络编程之模拟ssh远程执行命令、粘包问题 、解决粘包问题

    目录 模拟ssh远程执行命令 服务端 客户端 粘包问题 什么是粘包 TCP发送数据的四种情况 粘包的两种情况 解决粘包问题 struct模块 解决粘包问题 服务端 客户端 模拟ssh远程执行命令 服务 ...

  8. [转帖]ssh 远程执行命令

    ssh 远程执行命令 https://www.cnblogs.com/youngerger/p/9104144.html SSH 是 Linux 下进行远程连接的基本工具,但是如果仅仅用它来登录那可是 ...

  9. 使用ssh远程执行命令批量导出数据库到本地

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

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

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

随机推荐

  1. party lamps(dfs优化+规律枚举)

    Problem description: To brighten up the gala dinner of the IOI'98 we have a set of N coloured lamps ...

  2. 传奇装备锻造升级UPGRADEITEMEX功能详解

    装备升级功能可以指定升级物品及属性,按指定机率得到结果.需要升级的装备物品必须放在身上.命令格式UPGRADEITEMEX 物品位置(0-12) 属性位置(0-14) 成功机率(0-100) 点数机率 ...

  3. servlet常用对象

    Cookie对象 浏览器缓存技术,只存储在浏览器中 cookie的大小在4kb左右,每个浏览器在同一域名下能存放cookie数量是有限的 优缺点:提高网页的效率,减轻服务器的负载;安全性较差. 1 创 ...

  4. HTML前端入门归纳——样式

    本人一直在从事.net的开发,界面都是采用的WPF,近期花了一个多月进行HTML前端的学习,在这里呢进行学习总结和归纳. 本系列将主要分为4个模块: 控件 样式 布局 JavaScript 根据多年W ...

  5. CTF_论剑场 名侦探柯南

    首先看一下是一个压缩包然后下载 解压后会发现一个图片和另一个压缩包 打开图片 发现是这个 用HxD分析一下这张图片通过搜索 zip jpg...... 然后会发现这张图片里有一个png 图片 所以判断 ...

  6. 树链剖分 (ZQU1607)

    这道题与模板之间,多了个确定哪个为根的操作: 这道题有技巧,并不需要真正去建立以某个节点为根的树 关于路径的操作,无论以哪个点为根,得出的答案无影响: 关于对子节点进行操作的,有几种情况, 当查询节点 ...

  7. 线段树+扫描线 NAIPC 2019 Intersecting Rectangles

    你看看你有多菜,一点线段树的小小的运用,就不会写了: 题意:如果矩阵有交集,输出1,否则输出0(不包含内嵌): 思路:本题求交集,还得不包括内嵌的情况: 做过一道是求面积的题.跟这道类似,但在这里定义 ...

  8. github,gitlab的区别

    链接:https://blog.csdn.net/Xiamen_XiaoHong/article/details/83655447 总而言之:gitlab最优

  9. windows 动态库导出

    以下内容来自博客:https://blog.csdn.net/fengbingchun/article/details/78825004 __declspec是Microsoft VC中专用的关键字, ...

  10. 题解【洛谷P3385】【模板】负环

    题目描述 暴力枚举/\(SPFA\)/\(Bellman-ford\)/奇怪的贪心/超神搜索 寻找一个从顶点1所能到达的负环,负环定义为:一个边权之和为负的环. 输入输出格式 输入格式 第一行一个正整 ...