Paramiko的简单使用

paramiko模块被用来连接远程主机,并执行命令,它的本质上是利用ssh.下面是利用paramiko连接远程主机并执行简单命令,上传下载文件的简单实例:

基于密码连接,远程执行命令

import paramiko

# 创建ssh对象
ssh = paramiko.SSHClient()

#允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 连接服务器
ssh.connect(hostname='192.168.16.85', port=22, username='root',password='123456')

# 执行命令
stdin, stdout, stderr = ssh.exec_command('df -h')

# 获取命令结果 
result = stdout.read()

# 关闭连接
ssh.close()

print(result.decode('utf-8')) 

基于密码的上传下载

import paramiko

transport = paramiko.Transport(('192.168.16.85', 22))
transport.connect(username='root', password='123456')
sftp = paramiko.SFTPClient.from_transport(transport)

# 将远程服务器上的文件下载到本地
sftp.get('/data/remote.text', 'local.text')
# 将本地文件上传到远程服务器
sftp.put('local.txt', '/data/remote.py')
transport.close() 

通过私钥字符串连接,并执行命令

基于密钥连接有一点需要注意,如果密码是加密的,需要传入password参数,它将被用来解密密钥文件

import paramiko
from io import StringIO
# key中保存rsa字符串
key = """"""

private_key = paramiko.RSAKey(file_obj=StringIO(key))
ssh = paramiko.SSHClient()

#允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 连接服务器, 如果密钥是加密的,需要指定password参数
ssh.connect(hostname='192.168.16.85', port=22, username='root',pkey=private_key)

# 执行命令
stdin, stdout, stderr = ssh.exec_command('df -h')

# 获取命令结果
result = stdout.read()

# 关闭连接
ssh.close()

基于密钥上传下载

import paramiko

private_key = paramiko.RSAKey.from_private_key_file(r'c:/users/id_rsa')
transport = paramiko.Transport(('192.168.16.85',22))
transport.connect(username='root', pkey=private_key)
sftp = paramiko.SFTPClient.from_transport(transport)

# 将远程服务器上的文件下载到本地
sftp.get('/data/remote.text', 'local.text')
# 将本地文件上传到远程服务器
sftp.put('local.txt', '/data/remote.py')
transport.close()  

 

将paramiko基本功能封装到类中:使用上下文

import paramiko

class SSHProxy(object):

    def __init__(self, hostname, port, username, private_key_path):
        self.hostname = hostname
        self.port = port
        self.username = username
        self.private_key_path = private_key_path

        self.transport = None

    def open(self):
        private_key = paramiko.RSAKey.from_private_key_file(self.private_key_path)
        self.transport = paramiko.Transport((self.hostname, self.port))
        self.transport.connect(username=self.username, pkey=private_key)

    def close(self):
        self.transport.close()

    def command(self, cmd):
        ssh = paramiko.SSHClient()
        ssh._transport = self.transport
        stdin, stdout, stderr = ssh.exec_command(cmd)
        result = stdout.read()
        ssh.close()
        return result

    def upload(self, local_path, remote_path):
        sftp = paramiko.SFTPClient.from_transport(self.transport)
        sftp.put(local_path, remote_path)
        sftp.close()

    def __enter__(self):
        self.open()
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.close()


if __name__ == '__main__':
    with SSHProxy('192.168.1.1', 22, 'root', '/Users/.ssh/id_rsa') as ssh:
        # v1 = ssh.command('sudo ifconfig')
        # print(v1)
        ssh.upload('your.tar', '/data/your.tar')  

 

上一篇:Django 中的F类

下一篇:python 异常