day9-堡垒机前戏:paramiko模块
堡垒机前戏
开发堡垒机之前,先来学习Python的paramiko模块,该模块基于SSH用于连接远程服务器并执行相关操作。它的主要作用是做批量管理。
下载安装
pip3 install pycrypto #由于 paramiko 模块内部依赖pycrypto,所以先下载安装pycrypto pip3 install paramiko
SSHClient
功能:用于连接远程服务器并执行基本命令
远程连接验证方式分为两种:
(1)基于用户名密码连接
(2)基于公钥秘钥连接
通过是用paramiko远程操作,其实本质也分为两种:
(1)只用SSHClient
(2)自己创建一个transport
1.基于用户名密码连接
import paramiko
# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='elephant', port=22, username='huwei', password='9999')
# 执行命令
stdin, stdout, stderr = ssh.exec_command('df')
# 获取命令结果
result = stdout.read() # 输出的结果是bytes类型的
# 关闭连接
ssh.close()
解析:stdin:标准输入,输入的命令;stdout:标准输出,输入命令的执行结果;stderr:标准错误,执行命令报错的返回结果
SSHClient封装Transport
import paramiko
transport = paramiko.Transport(('hostname', 22)) #创建实例
transport.connect(username='huwei', password='huwei123') #建立连接
ssh = paramiko.SSHClient()
ssh._transport = transport
stdin, stdout, stderr = ssh.exec_command('df')
print stdout.read() #输出为bytes类型的
transport.close()
2.基于公钥密钥连接
import paramiko
private_key = paramiko.RSAKey.from_private_key_file('id_rsa') # 私钥文件的路径
# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='192.168.165.160', port=22, username='huwei', pkey=private_key)
# 执行命令
stdin, stdout, stderr = ssh.exec_command('df')
# 获取命令结果
result = stdout.read()
print(result.decode())
# 关闭连接
ssh.close()
SSHClient 封装Transport
import paramiko
private_key = paramiko.RSAKey.from_private_key_file('id_rsa')
transport = paramiko.Transport(('192.168.165.160', 22))
transport.connect(username='huwei', pkey=private_key)
ssh = paramiko.SSHClient()
ssh._transport = transport
stdin, stdout, stderr = ssh.exec_command('df')
transport.close()
SFTPClient
功能:用于连接远程服务器并执行上传下载
1.基于用户名密码上传下载
import paramiko
transport = paramiko.Transport(('192.168.165.160', 22))
transport.connect(username='huwei', password='huwei123')
sftp = paramiko.SFTPClient.from_transport(transport)
# 将mac.txt 上传至服务器 /tmp/test
# 必须要起文件名
sftp.put('/mac.txt', '/tmp/test')
# 将test 下载到本地132.txt
sftp.get('/tmp/test', '/Users/huwei/PycharmProjects/s14/module_4/132.txt')
transport.close()
2.基于公钥密钥上传下载
import paramiko
private_key = paramiko.RSAKey.from_private_key_file('id_rsa') #私钥文件路径
transport = paramiko.Transport(('192.168.165.160', 22))
transport.connect(username='huwei‘, pkey=private_key )
sftp = paramiko.SFTPClient.from_transport(transport)
# 将mac.txt上传至服务器 /tmp/test
sftp.put('mac.txt, '/tmp/test)
# 将test下载到本地132.txt
sftp.get('/tmp/test', '/Users/huwei/PycharmProjects/s14/module_4/132.txt')
transport.close()
注意:Linux主机上的公钥验证文件authorized_keys权限必须修改为属主可读(无其他属组,其他权限),否则连接将会报错。

浙公网安备 33010602011771号