python paramiko

  • 主要介绍了python paramiko简介和使用方法,让你全面了解python的远程服务器连接和文件上传,ssh远程执行命令等
  • paramiko 遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接,可以实现远程文件的上传,下载或通过ssh远程执行命令。
  • 项目地址:https://github.com/paramiko/paramiko
  • 官方文档:http://docs.paramiko.org/
  • 文档转载:http://www.codexiu.cn/python/blog/127/ (根据自己需要有删改)

一、安装

  • root@ubuntu:~/paramiko# pip install paramiko
  • 运行脚本若报错’ValueError: Multibackend cannot be initialized with no backends. If you are seeing this error when trying to use default_backend() please try uninstalling and reinstalling cryptography’.可重新安装cryptography.

二、上传文件到远程服务器

  • 原理:通过SFTPClient类根据SSH传输协议的sftp会话,实现远程文件上传、下载等操作。实现远程文件上传、下载。
    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
    任务:10. 1.101.18710.1.101.186发送文件。

    10.1.101.187 目录/root/paramiko 有三个文件 paramikosend.py test test.tar

    10.1.101.186 目录/root/paramiko 开始为空文件夹

    执行python paramikosend.py,代码如下

    root@ubuntu:~/paramiko# cat paramikosend.py
    import paramiko,datetime,os
    hostname = '10.1.101.186'
    username = 'root'
    password = '123456'
    port = 22
    local_dir = '/root/paramiko'
    remote_dir = '/root/paramiko'
    try:
    t=paramiko.Transport((hostname,port))
    t.connect(username=username,password=password)
    sftp = paramiko.SFTPClient.from_transport(t)
    files = os.listdir(local_dir)
    for f in files:
    sftp.put(os.path.join(local_dir,f),os.path.join(remote_dir,f))
    t.close()
    except Exception:
    print "connect error!"

三、从远程服务器下载文件

  • 原理:通过SFTPClient类根据SSH传输协议的sftp会话,实现远程文件上传、下载等操作。实现远程文件上传、下载。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    任务:现在10.1.101.186的/root/paramiko/temp186目录有两个文件,将其下载到10.1.101.187的/root/paramiko/temp187目录。

    执行 python paramikoget.py ,代码如下:

    root@ubuntu:~/paramiko# cat paramikoget.py
    import paramiko,datetime,os
    hostname = '10.1.101.186'
    username = 'root'
    password = '123456'
    port = 22
    local_dir = '/root/paramiko/temp187'
    remote_dir = '/root/paramiko/temp186'
    try:
    t=paramiko.Transport((hostname,port))
    t.connect(username=username,password=password)
    sftp = paramiko.SFTPClient.from_transport(t)
    files = sftp.listdir(remote_dir) #这里需要注意,列出远程文件必须使用sftp,而不能用os
    for f in files:
    sftp.get(os.path.join(remote_dir,f),os.path.join(local_dir,f))
    t.close()
    except Exception:
    print "connect error!"

四、执行命令测试

  • 原理:通过SSHClient类执行命令。SSHClient类是SSH服务会话的高级表示,封装了传输、通道以及SFTPClient的校验、建立方法,通常用于执行命令。
    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
    29
    30
    31
    32
    33
    34
    任务:通过10.1.101.187连接到10.1.101.186,然后进入目录/root/paramiko,创建一个目录lxy。
    执行python paramikocommand.py,代码如下:

    root@ubuntu:~/paramiko# cat paramikocommand.py
    #!/usr/bin/python
    import paramiko
    hostname = '10.1.101.186'
    username = 'root'
    password = '123456'
    port = 22
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(hostname=hostname,port=port,username=username,password=password)
    stdin, stdout, stderr = ssh.exec_command("cd /root/paramiko;mkdir lxy")
    print stdout.readlines()
    ssh.close()

    Note: 命令中也可以带参数:

    #!/usr/bin/python

    import paramiko
    hostname = '10.1.101.186'
    username = 'root'
    password = '123456'
    port = 22
    name='testcmd'

    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(hostname=hostname,port=port,username=username,password=password)
    stdin, stdout, stderr = ssh.exec_command("cd /root/paramiko;mkdir %s" %name)
    print stdout.readlines()
    ssh.close()

五、python远程执行操作的其他开源模块

  • fabric:fabric是封装了paramiko模块来实现ssh来传输文件的。
  • pexpect:也可以实现ssh 登录到某个用户指定的主机上,运行某个用户指定的命令

六、与输入的CMD命令进行交互

  • stdin.write部分是用于交互情况下,通过该命令可以执行交互。注意这里可能会引起歧义,这里的交互并不是ssh连接过程中出现的让输入yes的交互,因为paramiko模块在连接过程中会自动处理好yes确认。这里的交互是指后面的cmd需要的执行的程序可能出现交互的情况下,可以通过该参数进行交互。
    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
    29
    30
    31
    32
    33
    34
    代码如下:
    stdin.write("Y\n") #简单交互,输入 'Y'

    使用示例:
    #!/usr/bin/env python

    import sys
    import paramiko


    def sshclient(ip, username, password, cmd):

    myclient = paramiko.SSHClient()

    myclient.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    myclient.connect(ip, port=22, username=username, password=password, timeout=5)

    stdin, stdout, stderr = myclient.exec_command(cmd)

    stdin.write("y\n")

    print stdout.readlines()

    myclient.close()


    if len(str(sys.argv[1])) <= 14:
    cmd = 'cd /test && python3 upload.py -f %s ' % sys.argv[1]
    else:
    cmd = 'cd /test && python3 upload_by_id.py -f %s' % sys.argv[1]

    sshclient('hostname', 'username', 'password', cmd=cmd)