Python 的 paramiko 模块基于 SSH 连接远程服务器并执行操作
SSHClient
基于用户名密码连接
示例:
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy) # 自动将IP添加到 known_hosts 中
ssh.connect(hostname='', port=22, username='root', password='password')
stdin, stdout, stderr = ssh.exec_command('ls') # 输入、输出、错误信息 / 执行的命令
result = stdout.read() # 获取输出结果
if not result:
result = stderr.read() # 获取错误信息
print(result)
ssh.close() # 关闭连接
如果 不使用ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy)
,且 known_hosts 中没有主机信息就会报错:
paramiko.ssh_exception.SSHException: Server 'localhost' not found in known_hosts
基于密钥对连接
通过用户名密码连接有许多问题,可以通过公钥私钥连接
连接前需要提前生成密钥对
示例:
import paramiko
private_key = paramiko.RSAKey.from_private_key_file('/Users/teihiroshibon/.ssh/id_rsa') # 私钥文件地址
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy)
ssh.connect(hostname='127', port=22, username='root', pkey=private_key)
stdin, stdout, stderr = ssh.exec_command('ifconfig')
result = stdout.read()
if not result:
result = stderr.read()
print(result)
ssh.close()
SFTPClient
基于用户名密码连接
示例:
import paramiko
import os
transport = paramiko.Transport(('localhost', 22))
transport.connect(username='root', password='password')
sftp = paramiko.SFTPClient.from_transport(transport)
"""
upload
前面是要上传的文件,后面是上传的目标目录
"""
sftp.put('test.py', '/root/upload.py')
"""
download
前面是要下载的文件,后面是下载的目标目录
"""
sftp.get('/data/test/url_view.py', 'download.py')
transport.close()
基于密钥对连接
示例:
import paramiko
private_key = paramiko.RSAKey.from_private_key_file('/Users/teihiroshibon/.ssh/id_rsa')
transport = paramiko.Transport(('localhost', 22))
transport.connect(username='root', pkey=private_key)
sftp = paramiko.SFTPClient.from_transport(transport)
"""upload"""
sftp.put('event.py', '/data/test/upload.py')
"""download"""
sftp.get('/data/test/url_view.py', 'download.py')
transport.close()