python之paramiko 远程执行命令

有时会需要在远程的机器上执行一个命令,并获得其返回结果。对于这种情况,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 %[email protected]%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.1.222‘
    port = 22
    username = ‘root‘
    password = ‘[email protected]‘
    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 ) > 0:
        print ‘ERROR:‘ + err_list[0]
        exit()

    for item in stdout.readlines():
        print item,
    ssh_close( sshd )

if __name__ == "__main__":
    main()

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

root      2540  2536  2 14:13 pts/4    00:01:21 java -Ddefault.client.encoding=UTF-8 -Dfile.encoding=UTF-8 -Duser.language=Zh -Duser.region=CN -Duser.timezone=GMT+08 cn.com.ctsi.csdp.resource.App
root      3442  3387  0  2016 ?        01:09:00 java -Ddefault.client.encoding=UTF-8 -Dfile.encoding=UTF-8 -Duser.language=Zh -Duser.region=CN -Duser.timezone=GMT+08 cn.com.ctsi.csdp.product.App
root      3451  3390  0  2016 ?        01:04:54 java -Ddefault.client.encoding=UTF-8 -Dfile.encoding=UTF-8 -Duser.language=Zh -Duser.region=CN -Duser.timezone=GMT+08 cn.com.ctsi.csdp.report.App
root      3452  3388  0  2016 ?        00:51:00 java -Ddefault.client.encoding=UTF-8 -Dfile.encoding=UTF-8 -Duser.language=Zh -Duser.region=CN -Duser.timezone=GMT+08 cn.com.ctsi.csdp.workflow.launcher.App
root      3892  3886  0  2016 ?        00:29:59 java -Ddefault.client.encoding=UTF-8 -Dfile.encoding=UTF-8 -Duser.language=Zh -Duser.region=CN -Duser.timezone=GMT+08 cn.com.ctsi.csdp.charge.App
root      4509  4507  0 15:09 ?        00:00:00 bash -c ps -ef|grep java
root      4519  4509  0 15:09 ?        00:00:00 grep java
root     12861 12857  0 Jan06 ?        00:09:06 java -Ddefault.client.encoding=UTF-8 -Dfile.encoding=UTF-8 -Duser.language=Zh -Duser.region=CN -Duser.timezone=GMT+08 cn.com.ctsi.csdp.workorder.App
root     16484 16480  0  2016 ?        00:45:27 java -Ddefault.client.encoding=UTF-8 -Dfile.encoding=UTF-8 -Duser.language=Zh -Duser.region=CN -Duser.timezone=GMT+08 cn.com.ctsi.csdp.billing.App
root     18699 18694  0 Jan06 ?        00:09:30 java -Ddefault.client.encoding=UTF-8 -Dfile.encoding=UTF-8 -Duser.language=Zh -Duser.region=CN -Duser.timezone=GMT+08 cn.com.ctsi.csdp.order.App
root     21902 21898  0 Jan05 ?        00:18:46 java -Ddefault.client.encoding=UTF-8 -Dfile.encoding=UTF-8 -Duser.language=Zh -Duser.region=CN -Duser.timezone=GMT+08 cn.com.ctsi.csdp.user.launcher.App

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

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

3、实例

1) 启动模块

# -*- coding: utf-8 -*-

import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(‘192.168.1.222‘, username = ‘root‘, password = ‘[email protected]‘, timeout = 5)
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= ‘[email protected]‘

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-8 -*-
import paramiko

serverIp = ‘192.168.55.243‘
serverUser = ‘root‘
serverPwd = ‘[email protected]‘

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 ,22))
    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-8 -*-
import paramiko

if __name__ == "__main__":
    hostname = ‘192.168.55.243‘
    port = 22
    username = ‘root‘
    password = ‘[email protected]‘
    cmd = "ps -ef|grep java"  

    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    #ssh.connect( hostname ,22, 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()
时间: 2024-08-30 11:39:26

python之paramiko 远程执行命令的相关文章

python 采用paramiko 远程执行命令

import sys import paramiko import config_reader from check_utils import standout_print, parse_remainsize_response_lines, error_out_print from time import time class RemoteModel: """ remote options model execute remote command ""&q

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

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

写部署脚本时,难免涉及到一些远程执行命令或者传输文件. 之前一直使用 "sh" 库,调用sh.ssh远程执行一些命令,sh.scp传输文件,但是实际使用中还是比较麻烦的,光是模拟用户登陆这一点,还需要单独定义方法模拟输入. 感受一下: 来自 "官方文档" 后来发现 "paramiko" 库更加优雅. http://pic.cnhubei.com/space.php?uid=4593&do=album&id=1083522http:

python 网络编程(远程执行命令与粘包)

远程执行命令 先来学习一个新模块 , 一会用到的.. 新模块: subprocess 执行系统命令 r = subprocess.Popen('ls',shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE) subprocess.Popen(a,b,c,d) a: 要执行的系统命令(str) b: shell = True 表示确定我当前执行的命令为系统命令 c: 表示正确信息的输出管道 d: 表示错误信息的输出管道 下边直接上代码,

python模块paramiko的上传下载和远程执行命令

#!/usr/bin/python # -*- coding: utf-8 -*- import paramiko,os,datetime server_ip = '192.168.1.123' server_user = 'root' server_passwd = '10241010' server_port = 22 #local_dir='C:\Python27' #remote_dir='/soft2/nba/' def ssh_connect(): ssh = paramiko.SS

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

python远程批量执行 我并不是一个专业的开发,我一直在学习linux运维,对于python也是接触不久,所以代码写的并不是很规范简洁. 前段时间一个同学找我一起做一个自动化运维平台,我对python的django还没有了解,并且对于HTML和JS这类开发学习还没有涉及,所以我说我做些后台的实现,前端就交给我的同学做.不扯淡了,下面说下我做批量执行的思路. 用到的模块:paramiko 功能:很简单就是批量执行命令,类似于ansible,本来想用Fabric,但是想一想还是用paramiko,

远程执行命令:paramiko

paramiko模块用于通过 ssh 登录到远程客户端主机并执行命令,常见用法如下: [[email protected] ~]$ yum install -y python-paramiko 通过用户名密码登录远程客户端主机并执行命令: #!/usr/bin/env python #-*- coding:utf-8 -*- import paramiko ssh = paramiko.SSHClient() # 创建一个ssh客户端对象 ssh.set_missing_host_key_pol

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

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

102 模拟ssh远程执行命令

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