【转】ssh 远程执行命令

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

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

1、执行简单的命令:

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

$ ssh [email protected]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 3.2G 31G 10% /
tmpfs 25G 0 25G 0% /dev/shm
/dev/vdb 296G 2.0G 279G 1% /data

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

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

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

赋值的方式:result=`ssh [email protected] ~/command.sh`
追加到文件:ssh [email protected]$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中用分好拼接多个命令

1 ssh [email protected]$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 [email protected] "sudo ls /root"
$ ssh [email protected] "top"

这两条命令虽然提示的失败原因不同,但它们有一个共同点:都需要与用户交互(需要 TTY)。所以它们失败的原因也是相同的:
默认情况下,当你执行不带命令的 ssh 连接时,会为你分配一个 TTY。因为此时你应该是想要运行一个 shell 会话。
但是当你通过 ssh 在远程主机上执行命令时,并不会为这个远程会话分配 TTY。此时 ssh 会立即退出远程主机,所以需要交互的命令也随之结束。
好在我们可以通过 -t 参数显式的告诉 ssh,我们需要一个 TTY 远程 shell 进行交互!
添加 -t 参数后,ssh 会保持登录状态,直到你退出需要交互的命令。

3、执行本地脚本:

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

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

1 for IP in ${IP_ARR[@]}
2 do
3 ssh [email protected]$IP "rm -rf $MONITOR_TARGET_FILE"
4 ssh [email protected]$IP "mkdir -p /data/apps/scripts"
5 scp $MONITOR_SOURCE_FILE [email protected]$IP:$MONITOR_TARGET_FILE
6 ssh [email protected]$IP ‘echo "*/1 * * * * /usr/bin/python /data/apps/scripts/checkStatus.py‘ $BUSINESS_TYPE ‘>/dev/null 2>&1" >> /var/spool/cron/root‘
7
8 done

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

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

1 $ cat test.sh
2 ls
3 pwd
4
5 $ ssh [email protected]10.153.195.138 < test.sh
6 anaconda-ks.cfg
7 /root

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

2)为脚本传递参数:

 1 $ cat test.sh
 2 echo $1
 3 echo $2
 4
 5 在本地执行结构如下:
 6 $ sh test.sh a b
 7 a
 8 b
 9
10 通过重定向远程执行,会报错
11 $ ssh [email protected]10.153.195.138 < test.sh a b
12 bash: a: command not found

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

1 $ ssh [email protected]10.153.195.138 ‘bash -s‘ < test.sh a b
2 a
3 b

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

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

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

除了执行本地的脚本,还有一种情况是脚本文件存放在远程服务器上,而我们需要远程的执行它!此时在远程服务器上用户 nick 的家目录中有一个脚本 test.sh。文件的内容如下:

1 ls
2 pwd
3 执行下面的命令即可(注:一定是绝对路径):
4 $ ssh [email protected] "/home/nick/test.sh"

下面我们也尝试为脚本传递参数。在远程主机上的 test.sh 文件的末尾添加两行:

1 echo $0
2 echo $1
3 然后尝试执行下面的命令:
4
5 $ ssh [email protected] /home/nick/test.sh helloworld

可以正确得到结果。

5、执行多行命令:

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

1 $ ssh [email protected]10.153.195.138 "
2 > ls
3 > pwd
4 > "
5 anaconda-ks.cfg
6 /root

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

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

1 $ name=test
2 $ ssh [email protected]10.153.195.138 "
3 > echo $name
4 > "
5 test
6
7 $ ssh [email protected]10.153.195.138 ‘
8 echo $name
9 ‘

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

1 $ ssh [email protected]10.153.195.138 bash -c "‘
2 echo $name
3 ‘"
4 test

原文地址:https://www.cnblogs.com/HYanqing/p/11687378.html

时间: 2024-10-09 01:56:34

【转】ssh 远程执行命令的相关文章

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

经过不懈的搜索终于找到ssh远程执行命令使用明文密码使用sshpass. 例子: sshpass -p "sequoiadb" ssh [email protected] "ls /" sshpass在centos无法直接安装 cd /etc/yum.repos.d/ wget http://download.opensuse.org/repositories/home:Strahlex/CentOS_CentOS-6/home:Strahlex.repo yum

day8-套接字sock 实现SSH远程执行命令功能

复习 #面向对象编程#类:#对象#实例化 :从一个类到产生一个对象的过程    #对象 = 类名()   #__init__初始化方法,是为了给一个具体的对象放一些初识的属性#在类中:    # 静态属性 直接定义在类中的属性,使用静态属性:类名.对象名都可以调用    # 动态属性 就是方法 就是定义在类中的函数 默认传一个self# class Person:#     money = 100# sister = Person()# father = Person()# Person.mon

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

通过SSH执行远程主机的命令或脚本时,经常会出现找不到自定义环境变量的问题.但是,如果通过SSH登录远程主机,然后再执行相同的命令或脚本,那么此时执行又是成功的.两种相似的方法,得到的结果却截然不同,看起来很诡异的现象,根本原因在于这两种方式使用的bash模式不同! 1. 通过SSH登录后再执行命令和脚本这种方式会使用Bash的interactive + login shell模式,这里面有两个概念需要解释:interactive和login. login故名思义,即登陆,login shell

102 模拟ssh远程执行命令

目录 一.subprocess模块 1.1 使用方法 二.模拟实现SSH远程执行命令 服务器 客户端 一.subprocess模块 subprocess 模块允许你去创建一个新的进程让其执行另外的程序,并与它进行通信,获取标准的输入.标准输出.标准错误以及返回码等.更多查看官网:https://docs.python.org/2/library/subprocess.html?highlight=subprocess#frequently-used-arguments 可以通过subproces

100 模拟ssh远程执行命令

目录 一.subprocess模块 1.1 使用方法 二.模拟实现SSH远程执行命令 服务器 客户端 一.subprocess模块 subprocess 模块允许你去创建一个新的进程让其执行另外的程序,并与它进行通信,获取标准的输入.标准输出.标准错误以及返回码等.更多查看官网:https://docs.python.org/2/library/subprocess.html?highlight=subprocess#frequently-used-arguments 可以通过subproces

python 实现ssh远程执行命令 上传下载文件

使用密码远程执行命令 [[email protected] script]# cat daramiko_ssh.py  #!/usr/bin/env python #_*_coding:utf-8 _*_ __author__ = 'gaogd' import paramiko import sys,os host = sys.argv[1] user = 'root' password = 'ddfasdsasda2015' cmd = sys.argv[2] s = paramiko.SSH

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

前天正在跟前端的同事调试功能.服务器开好,模拟的玩家登录好,就在倒计时.这时突然运营的同事跑过来说要统计几个服务器玩家的一些情况,也就是需要从几个服的数据库导出部分玩家的数据.好吧,我看了一下时间,11:47.心想,跟前端调试完,去吃个饭再午休一下那就下午再给吧.没想对方来一句"就导个数据库而已,要这么久么?",而且还是直接跟我上司说的.我嚓,好吧,我导.可问题来了,平时的统计是由php做的,批量部署这些是由运维做的.服务端完全没有对应的工具.而且服务器是在阿里云上的,数据库的用户是限

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

前天正在跟前端的同事调试功能.服务器开好,模拟的玩家登录好,就在倒计时.这时突然运营的同事跑过来说要统计几个服务器玩家的一些情况,也就是需要从几个服的数据库导出部分玩家的数据.好吧,我看了一下时间,11:47.心想,跟前端调试完,去吃个饭再午休一下那就下午再给吧.没想对方来一句"就导个数据库而已,要这么久么?",而且还是直接跟我上司说的.我嚓,好吧,我导.可问题来了,平时的统计是由php做的,批量部署这些是由运维做的.服务端完全没有对应的工具.而且服务器是在阿里云上的,数据库的用户是限

通过ssh远程执行命令导入定时任务报错----解决过程

今天在服务器中通过ssh远程执行批量导入定时任务时发生了一个问题:总结如下,远程服务器已设置好ssh秘钥登录,登录用户为普通用户,但已设置好拥有免密sudo权限ssh 1.1.1.1 "sudo su -c "echo '30 5 * * 5 /bin/sh /root/log.sh > /dev/null 2>&1'>>/var/spool/cron/root""没有报错,但是远程机器上并没有定时任务命令没错,第一直觉就是觉得可能是

ssh 远程执行命令

SSH 是 Linux 下进行远程连接的基本工具,但是如果仅仅用它来登录那可是太浪费啦!SSH 命令可是完成远程操作的神器啊,借助它我们可以把很多的远程操作自动化掉!下面就对 SSH 的远程操作功能进行一个小小的总结. 远程执行命令 如果我们要查看一下某台主机的磁盘使用情况,是不是必须要登录到目标主机上才能执行 df 命令呢?当然不是的,我们可以使用 ssh 命令在远程的主机上执行 df 命令,然后直接把结果显示出来.整个过程就像是在本地执行了一条命令一样: $ ssh [email prote