python利用paramiko连接远程服务器执行命令的方法

作者:KEL-1 时间:2021-07-19 01:07:34 

python中的paramiko模块是用来实现ssh连接到远程服务器上的库,在进行连接的时候,可以用来执行命令,也可以用来上传文件。

1、得到一个连接的对象

在进行连接的时候,可以使用如下的代码:


def connect(host):
 'this is use the paramiko connect the host,return conn'
 ssh = paramiko.SSHClient()
 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
 try:
#    ssh.connect(host,username='root',allow_agent=True,look_for_keys=True)
   ssh.connect(host,username='root',password='root',allow_agent=True)
   return ssh
 except:
   return None

在connect函数中,参数是一个主机的IP地址或者是主机名称,在执行这个方法之后,如果成功的连接到服务器,那么就会返回一个sshclient对象。

第一步是建立一个SSHClient的对象,然后设置ssh客户端允许连接不在know_host文件中的机器,然后就尝试连接服务器,在连接服务器的时候,可以使用两种方式:一种方式是使用秘钥的方式,也就是参数look_for_keys,这里用设置密码寻找,也可以直接使用密码的方式,也就是直接使用参数password,从而最后返回一个连接的对象。

2、 获取设置的命令

在进行paramiko连接之后,那么必须要得到需要执行的命令,如下代码所示:


def command(args,outpath):
 'this is get the command the args to return the command'
 cmd = '%s %s' % (outpath,args)
 return cmd

在参数中,一个是args,一个outpath,args表示命令的参数,而outpath表示为可执行文件的路径,例如/usr/bin/ls -l。在其中outpath也就是/usr/bin/ls ,而参数为-l

这个方法主要是用来组合命令,将分开的参数作为命令的一部分进行组装。

3、 执行命令

在连接过后,可以进行直接执行命令,那么就有了如下的函数:


def exec_commands(conn,cmd):
 'this is use the conn to excute the cmd and return the results of excute the command'
 stdin,stdout,stderr = conn.exec_command(cmd)
 results=stdout.read()
 return results

在此函数中,传入的参数一个为连接的对象conn,一个为需要执行的命令cmd,最后得到执行的结果,也就是stdout.read(),最后返回得到的结果

4、 上传文件

在使用连接对象的时候,也可以直接进行上传相关的文件,如下函数:


def copy_moddule(conn,inpath,outpath):
 'this is copy the module to the remote server'
 ftp = conn.open_sftp()
 ftp.put(inpath,outpath)
 ftp.close()
 return outpath

此函数的主要参数为,一个是连接对象conn,一个是上传的文件名称,一个上传之后的文件名称,在此必须写入完整的文件名称包括路径。

做法主要是打开一个sftp对象,然后使用put方法进行上传文件,最后关闭sftp连接,最后返回一个上传的文件名称的完整路径

5、 执行命令得到结果

最后就是,执行命令,得到返回的结果,如下代码:


def excutor(host,outpath,args):
 conn = connect(host)
 if not conn:
   return [host,None]
 exec_commands(conn,'chmod +x %s' % outpath)
 cmd =command(args,outpath)
 result = exec_commands(conn,cmd)
 print '%r' % result
 result = json.loads(result)
 return [host,result]

首先,进行连接服务器,得到一个连接对象,如果连接不成功,那么返回主机名和None,表示没有连接成功,如果连接成功,那么修改文件的执行权限,从而可以执行文件,然后得到执行的命令,最后,进行执行命令,得到结果,将结果用json格式表示返回,从而结果能得到一个美观的json格式,最后和主机名一起返回相关的信息

6、 测试代码

测试代码如下:


if __name__ == '__main__':
 print json.dumps(excutor('192.168.1.165','ls',' -l'),indent=4,sort_keys=True)
 print copy_module(connect('192.168.1.165'),'kel.txt','/root/kel.1.txt')
 exec_commands(connect('192.168.1.165'),'chmod +x %s' % '/root/kel.1.txt')

第一步测试命令执行,第二步测试上传文件,第三部测试修改上传文件的权限。

完整代码如下:


#!/usr/bin/env python
import json
import paramiko

def connect(host):
 'this is use the paramiko connect the host,return conn'
 ssh = paramiko.SSHClient()
 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
 try:
#    ssh.connect(host,username='root',allow_agent=True,look_for_keys=True)
   ssh.connect(host,username='root',password='root',allow_agent=True)
   return ssh
 except:
   return None

def command(args,outpath):
 'this is get the command the args to return the command'
 cmd = '%s %s' % (outpath,args)
 return cmd

def exec_commands(conn,cmd):
 'this is use the conn to excute the cmd and return the results of excute the command'
 stdin,stdout,stderr = conn.exec_command(cmd)
 results=stdout.read()
 return results

def excutor(host,outpath,args):
 conn = connect(host)
 if not conn:
   return [host,None]
 #exec_commands(conn,'chmod +x %s' % outpath)
 cmd =command(args,outpath)
 result = exec_commands(conn,cmd)
 result = json.dumps(result)
 return [host,result]

def copy_module(conn,inpath,outpath):
    'this is copy the module to the remote server'
    ftp = conn.open_sftp()
    ftp.put(inpath,outpath)
    ftp.close()
    return outpath

if __name__ == '__main__':
    print json.dumps(excutor('192.168.1.165','ls',' -l'),indent=4,sort_keys=True)
    print copy_module(connect('192.168.1.165'),'kel.txt','/root/kel.1.txt')
    exec_commands(connect('192.168.1.165'),'chmod +x %s' % '/root/kel.1.txt')

主要就是使用python中的paramiko模块通过ssh连接linux服务器,然后执行相关的命令,并且将文件上传到服务器。

来源:http://blog.csdn.net/kellyseeme/article/details/51352305

标签:paramiko,连接,远程服务器,执行命令
0
投稿

猜你喜欢

  • 分析运行中的 Python 进程详细解析

    2021-09-19 14:47:30
  • 利用Python自带PIL库扩展图片大小给图片加文字描述的方法示例

    2022-11-30 20:40:01
  • Mac系统重置PostgreSQL密码的方法示例代码

    2024-01-28 13:46:30
  • python操作数据库获取结果之fetchone和fetchall的区别说明

    2024-01-26 22:59:47
  • 学会python自动收发邮件 代替你问候女友

    2023-07-08 17:01:49
  • Python实现mysql数据库更新表数据接口的功能

    2024-01-18 01:07:43
  • python GUI库图形界面开发之PyQt5 Qt Designer工具(Qt设计师)详细使用方法及Designer ui文件转py文件方法

    2023-05-17 00:32:46
  • python为Django项目上的每个应用程序创建不同的自定义404页面(最佳答案)

    2022-07-26 19:08:11
  • 解决Python字典查找报Keyerror的问题

    2021-05-07 00:53:55
  • python处理图片之PIL模块简单使用方法

    2023-06-25 21:42:05
  • BootStrapTable 单选及取值的实现方法

    2024-05-02 16:11:45
  • Python将多份excel表格整理成一份表格

    2022-06-11 13:54:50
  • 浅析MySQL数据库授权原则

    2009-12-15 09:21:00
  • 在Mac OS上安装Go语言编译器的方法

    2024-05-22 17:48:40
  • 解决pytorch 交叉熵损失输出为负数的问题

    2022-04-29 10:17:33
  • 详解Go语言中new和make关键字的区别

    2024-05-21 10:19:20
  • 微信小程序 image组件binderror使用例子与js中的onerror区别

    2024-04-19 09:42:56
  • MySQL窗口函数OVER使用示例详细讲解

    2024-01-16 15:56:56
  • (X)HTML的文档结构

    2008-06-30 12:25:00
  • Python pytorch实现绘制一维热力图

    2022-04-03 21:09:14
  • asp之家 网络编程 m.aspxhome.com