有时会需要在远程的机器上执行一个命令,并获得其返回结果。对于这种情况,python 可以很容易的实现。

1 工具

Python paramiko

1) Paramiko模块安装

  在Linux的Terminal中,直接输入pip install paramiko 命令安装。

2)确定paramiko安装成功

  在python命令行输入import paramiko,确认是否安装成功,没报错就没问题。

2 步骤

1 导入 paramiko 模块

#!/usr/bin/python
import paramiko

2 创建 ssh 连接函数

def ssh_connect( _host, _username, _password ):
try:
_ssh_fd = paramiko.SSHClient()
_ssh_fd.set_missing_host_key_policy( paramiko.AutoAddPolicy() )
_ssh_fd.connect( _host, username = _username, password = _password )
except Exception, e:
print( 'ssh %s@%s: %s' % (_username, _host, e) )
exit()
return _ssh_fd

3 创建命令执行函数

def ssh_exec_cmd( _ssh_fd, _cmd ):
return _ssh_fd.exec_command( _cmd )

4 创建关闭 ssh 函数

def ssh_close( _ssh_fd ):
_ssh_fd.close()

5 使用示例

def main():
hostname = '192.168.55.243'
port =
username = 'root'
password = 'P@ssw0rd'
cmd = "ps -ef|grep java" sshd = ssh_connect( hostname , username , password )
stdin, stdout, stderr = ssh_exec_cmd( sshd, cmd )
err_list = stderr.readlines() if len( err_list ) > :
print 'ERROR:' + err_list[]
exit() for item in stdout.readlines():
print item,
ssh_close( sshd ) if __name__ == "__main__":
main()

  如果执行脚本成功,会成功返回以下结果。

root           : pts/    :: java -Ddefault.client.encoding=UTF- -Dfile.encoding=UTF- -Duser.language=Zh -Duser.region=CN -Duser.timezone=GMT+ cn.com.ctsi.csdp.resource.App
root ? :: java -Ddefault.client.encoding=UTF- -Dfile.encoding=UTF- -Duser.language=Zh -Duser.region=CN -Duser.timezone=GMT+ cn.com.ctsi.csdp.product.App
root ? :: java -Ddefault.client.encoding=UTF- -Dfile.encoding=UTF- -Duser.language=Zh -Duser.region=CN -Duser.timezone=GMT+ cn.com.ctsi.csdp.report.App
root ? :: java -Ddefault.client.encoding=UTF- -Dfile.encoding=UTF- -Duser.language=Zh -Duser.region=CN -Duser.timezone=GMT+ cn.com.ctsi.csdp.workflow.launcher.App
root ? :: java -Ddefault.client.encoding=UTF- -Dfile.encoding=UTF- -Duser.language=Zh -Duser.region=CN -Duser.timezone=GMT+ cn.com.ctsi.csdp.charge.App
root : ? :: bash -c ps -ef|grep java
root : ? :: grep java
root Jan06 ? :: java -Ddefault.client.encoding=UTF- -Dfile.encoding=UTF- -Duser.language=Zh -Duser.region=CN -Duser.timezone=GMT+ cn.com.ctsi.csdp.workorder.App
root ? :: java -Ddefault.client.encoding=UTF- -Dfile.encoding=UTF- -Duser.language=Zh -Duser.region=CN -Duser.timezone=GMT+ cn.com.ctsi.csdp.billing.App
root Jan06 ? :: java -Ddefault.client.encoding=UTF- -Dfile.encoding=UTF- -Duser.language=Zh -Duser.region=CN -Duser.timezone=GMT+ cn.com.ctsi.csdp.order.App
root Jan05 ? :: java -Ddefault.client.encoding=UTF- -Dfile.encoding=UTF- -Duser.language=Zh -Duser.region=CN -Duser.timezone=GMT+ cn.com.ctsi.csdp.user.launcher.App

  在实际的开发中,每次更新模块的jar包时,都需要使用 ps -ef | grep java, 查看模块的进程号,然后使用使用命令 kill -9 进程号,处理掉进程,然后重新启动 模块。

下面尝试使用python脚本来代替手工输入代码。

3 实例

1) 启动模块

# -*- coding: utf- -*-

import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('192.168.55.243', username = 'root', password = 'P@ssw0rd', timeout = )
cmd = 'nohup /csdp/charge_launcher-1.0-release/bin/run.sh > /csdp/charge_launcher-1.0-release/bin/nohup.out 2>&1 & \r\n' password= 'P@ssw0rd' stdin, stdout, stderr = ssh.exec_command( cmd )
##stdin, stdout, stderr = ssh.exec_command('sudo -S %s\n' % cmd )
##stdin.write('%s\r\n' % password)
##stdin.flush()
print "------------------------"
##print stdout.readlines()
##print stderr.read() print "------------------------"
cmd = 'pwd'
stdin, stdout, stderr = ssh.exec_command(cmd )
print stdout.readlines() ssh.close()

2) 远程上传文件

# -*- coding: utf- -*-
import paramiko serverIp = '192.168.55.243'
serverUser = 'root'
serverPwd = 'P@ssw0rd' localFile = 'user-1.0-release.jar'
localpath = r'D:\workspace\csdp201512041\csdp-ningxia\csdp_user\user\target' + os.sep + localFile remotepath = '/csdp/user_launcher-1.0-dev/lib/' + localFile def ftpModuleFile():
t = paramiko.Transport(( serverIp ,))
t.connect(username = serverUser , password = serverPwd)
sftp = paramiko.SFTPClient.from_transport(t)
# remotepath='/csdp/user_launcher-1.0-dev/user-1.0-release.jar'
# localpath= r'D:\workspace\csdp201512041\csdp-ningxia\csdp_user\user\target\user-1.0-release.jar'
sftp.put(localpath,remotepath)
t.close()
print(":) 成功上传%s文件。" % remotepath) if __name__ == '__main__':
ftpModuleFile()

3) 执行远程linux命令

# -*- coding: utf- -*-
import paramiko if __name__ == "__main__":
hostname = '192.168.55.243'
port =
username = 'root'
password = 'P@ssw0rd'
cmd = "ps -ef|grep java" ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#ssh.connect( hostname ,, username , password )
ssh.connect(hostname,username=username,password=password,allow_agent=False,look_for_keys=False)
stdin, stdout, stderr = ssh.exec_command(cmd )
list = stdout.readlines()
print( list ) ssh.close()

Python学习总结 06 paramiko 远程执行命令的更多相关文章

  1. Python之路 - Socket实现远程执行命令

    Python之路 - Socket实现远程执行命令 os模块实现

  2. 使用paramiko远程执行命令、下发文件

    写部署脚本时,难免涉及到一些远程执行命令或者传输文件. 之前一直使用sh库,调用sh.ssh远程执行一些命令,sh.scp传输文件,但是实际使用中还是比较麻烦的,光是模拟用户登陆这一点,还需要单独定义 ...

  3. python之paramiko 远程执行命令

    有时会需要在远程的机器上执行一个命令,并获得其返回结果.对于这种情况,python 可以很容易的实现. 1 .工具 Python paramiko 1) Paramiko模块安装 在Linux的Ter ...

  4. Python中使用subprocess模块远程执行命令

    使用subprocess模块执行远程命令 服务端代码 1 import socket 2 import subprocess 3 4 sh_server = socket.socket() 5 sh_ ...

  5. paramiko远程执行命令成功

  6. 【Python】模块学习之使用paramiko连接Linux,远程执行命令,上传下载、文件

    本文主要介绍paramiko远程执行linux命令,及在服务器上进行文件的上传.下载 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. ...

  7. Python Paramiko实现sftp文件上传下载以及远程执行命令

    一.简介 Paramiko模块是基于Python实现的SSH远程安全连接,用于SSH远程执行命令.文件传输等功能. 安装模块 默认Python没有自带,需要手动安装: pip3 install par ...

  8. python之实现批量远程执行命令(堡垒机)

    python远程批量执行 我并不是一个专业的开发,我一直在学习linux运维,对于python也是接触不久,所以代码写的并不是很规范简洁. 前段时间一个同学找我一起做一个自动化运维平台,我对pytho ...

  9. 远程执行命令:paramiko

    paramiko模块用于通过 ssh 登录到远程客户端主机并执行命令,常见用法如下: [root@localhost ~]$ yum install -y python-paramiko 通过用户名密 ...

随机推荐

  1. HDU_1241 Oil Deposits(DFS深搜)

    Problem Description The GeoSurvComp geologic survey company is responsible for detecting underground ...

  2. C 语言 printf格式控制详解

    闲来无事,整理了一下C语言printf() 的格式控制语句. PS:详细来源于网络. printf的格式控制的完整格式: %  -  0  m.n  l或h  格式字符 下面对组成格式说明的各项加以说 ...

  3. mysql5.5提示Deprecated: mysql_query(): The mysql extension is deprecated

    解决方法1:在php程序代码里面设置报警级别 <?php error_reporting = E_ALL & ~E_DEPRECATED 方法2:禁止php报错 display_erro ...

  4. 网站访问架构cdn与负载均衡

    曾经见到知乎上有人问“为什么像facebook这类的网站需要上千个工程师维护?”,下面的回答多种多样,但总结起来就是:一个高性能的web系统需 要从无数个角度去考虑他,大到服务器的布局,小到软件中某个 ...

  5. js键盘控制div移动,解决停顿问题

    问题版本代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 <html> &l ...

  6. bootstrap中的动态加载出来的图片轮播中的li标签中的class="active"的动态添加移除

    //该方法是在slide改变时立即触发该事件, $('#myCarousel').on('slide.bs.carousel', function () { $("#myCarousel o ...

  7. ThinkPHP Uploadify 图片上载

    从官方网站下载的Uploadify最新版本:http://www.uploadify.com/download/ jQuery库是1.7.1版本. 下载好的Uploadify目录下面的文件有: 用到的 ...

  8. ExecuteNonQuery&& ExecuteQuery 区别

    前些日子作一些数据项目的时候 在ADO.NET 中处理 ExecuteNonQuery()方法时,总是通过判断其返回值是否大于0来判断操作时候成功 .但是实际上并不是这样的,好在处理的数据操作多时 修 ...

  9. dotnet core多平台开发体验

    前言 随着net core rc2的发布,园子里面关于net core的入门文章也也多了起来,但是大多数都是在一个平台上面来写几个简单的例子,或者是在解释代码本身,并没有体现说在一个平台上面创建一个项 ...

  10. ruby特性

    1. ruby类结构 每个类都是Class类的对象 所有类都继承自BasicObject类(Module类不能实例化) 2. 单例方法 单例方法可以不定义在类中,只为某个对象定义方法,所以称为单例方法 ...