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')