本篇介绍通过python的paramiko模块实现SSH和SFTP功能。

安装

很简单,直接使用pip安装就好,如果没有pip,需要先安装pip,下面代码也会列出pip的安装方法。

> yum -y install epel-release       # 安装epel
> yum install python-pip            # 安装pip
> pip install paramiko              # 安装paramiko

快速开始

paramiko的连接方式有两种,这里直接给出实例代码: 第一种方法,paramiko.SSHClient()函数

import paramiko

host = 'x.x.x.x'
port = 22
username = 'root'
password = None
timeout = 5
key = '/root/.ssh/id_rsa'

# 实现一个runcmd方法,远程执行命令,并返回结果。
def runcmd(ssh, cmd):
    _, stdout, _ = ssh.exec_command(cmd)
    return stdout.read().decode()

# 用with方法实现上下文管理,不用手动关闭连接。
with paramiko.SSHClient() as ssh:
    # 允许连接不在know_hosts文件中的主机
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    # 配置秘钥
    pkey = paramiko.RSAKey.from_private_key_file(key)
    ssh.connect(host, port, username, pkey)
    result = runcmd(ssh, 'hostname')
    print(result)
    with ssh.open_sftp() as sftp:
        # put上传文件
        sftp.put('1.txt', '1.txt')
        print(sftp.listdir())

第二种方法,paramiko.Transport()函数

import paramiko

host = 'x.x.x.x'
port = 22
username = 'root'
password = None
timeout = 5
pkey = '/root/.ssh/id_rsa'

def runcmd(ssh, cmd):
    _, stdout, _ = ssh.exec_command(cmd)
    return stdout.read().decode()

with paramiko.Transport((host, port)) as transport:
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    pkey = paramiko.RSAKey.from_private_key_file(key)
    transport.connect(username=username, pkey=pkey)
    ssh = paramiko.SSHClient()
    ssh._transport = transport
    result = runcmd(ssh, 'hostname')
    print(result)
    with paramiko.SFTPClient.from_transport(transport) as sftp:
        sftp.put('1.txt', '1.txt')
        print(sftp.listdir())

参考

上面只是简单的上手实例,paramiko还支持很多的方法,这里就不一一举例了,实际使用请一定要参考官方文档,文档写的很清楚。 paramiko官方API文档http://paramiko-docs.readthedocs.io