python2.0 s12 day8 _ 堡垒机前戏paramiko模块
Posted zhming
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python2.0 s12 day8 _ 堡垒机前戏paramiko模块相关的知识,希望对你有一定的参考价值。
堡垒机前戏
开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作
paramiko模块是做主机管理的,他模拟了一个ssh.
有两种形式连接形式,
一种通过用户名密码: ssh -p 22 [email protected]
一种是通过密钥的方式: ssh -p 22 -i ~/.ssh/dongjing-shanghai.pem [email protected]_pro01
再连接的的语法上,有两种:
一种是直接将连接的主机地址和端口直接传入
一种是先把主机地址,端口,用户名,密码封装到paramiko.Transport()实例中
SSHClient
通过用户名密码连接的实例代码如下:
直接调用ssh.connect() 方法
1 #!/usr/bin/env python3.5 2 #__author__:‘ted.zhou‘ 3 ‘‘‘ 4 使用paramiko模块,实现SSHClient连接远程服务器 5 先使用用户名,密码方式 6 ‘‘‘ 7 import paramiko 8 9 ssh = paramiko.SSHClient() # 创建SSH对象 10 11 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 这句很关键, 允许连接不在know_hosts文件中的主机 12 ssh.connect(hostname=‘127.0.0.1‘,port=7272,username=‘root‘,password=‘123‘) # 连接服务器 13 stdin,stdout,stderr = ssh.exec_command(‘df‘) # 执行命令 14 result = stdout.read() # 获取命令结果 15 ssh.close() # 关闭连接 16 17 print(result.decode()) # 打印结果
通过paramiko.Transport()封装:
1 #!/usr/bin/env python3.5 2 #__author__:‘ted.zhou‘ 3 ‘‘‘ 4 paramiko模块SSHClient通过用户名密码连接远程服务器, 5 使用语法Transport()封装 6 ‘‘‘ 7 8 import paramiko 9 10 transport = paramiko.Transport((‘127.0.0.1‘,7272)) # 传入主机的IP或者hostname 和 端口组合的元组,记住一定是元组 11 transport.connect(username=‘root‘,password=‘123‘) 12 13 ssh = paramiko.SSHClient() 14 ssh._transport = transport 15 16 stdin,stdout,stderr = ssh.exec_command(‘df‘) 17 result = stdout.read() 18 19 print(result.decode()) 20 transport.close()
通过sshkey方式连接的实例:
python2.x写法和python3.x不同
python2.x 代码如下:
直接调用ssh.connect() 方法 #!/usr/bin/env python3.5 #__author__:‘ted.zhou‘ ‘‘‘ 使用paramiko.SSHClient()的sshkey方式连接远程服务器 ‘‘‘ import paramiko # 加载密钥文件 private_key = paramiko.RSAKey.from_private_key_file(‘/Users/tedzhou/.ssh/id_rsa‘) # print(type(private_key)) ssh = paramiko.SSHClient() # 创建SSH对象 # ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 允许连接不在know_hosts文件中的主机 # 开始连接服务器,这里注意再python2.x中是这么写,3.x中报错,应该写成 key_file = ‘/Users/tedzhou/.ssh/id_rsa‘ ssh.connect(hostname=‘127.0.0.1‘,port=7272,username=‘root‘,key=private_key) # 获取远程主机执行命令的结果 stdin,stdout,stderr = ssh.exec_command(‘ifconfig‘) result = stdout.read() print(result.decode()) ssh.close()
python3.x的写法如下:
1 #!/usr/bin/env python3.5 2 #__author__:‘ted.zhou‘ 3 ‘‘‘ 4 使用paramiko.SSHClient()的sshkey方式连接远程服务器 5 6 ‘‘‘ 7 import paramiko 8 9 # python3.x中就不需要再加载私钥文件了. 10 # private_key = paramiko.RSAKey.from_private_key_file(‘/Users/tedzhou/.ssh/id_rsa‘) 11 ssh = paramiko.SSHClient() # 创建SSH对象 12 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 允许连接不在know_hosts文件中的主机 13 # 开始连接服务器 14 ssh.connect(hostname=‘kiri_pro01‘, port=22, username=‘root‘, key_filename=‘/Users/tedzhou/.ssh/dongjing-shanghai.pem‘) 15 # 获取远程主机执行命令的结果 16 stdin,stdout,stderr = ssh.exec_command(‘ifconfig‘) 17 result = stdout.read() 18 print(result.decode()) 19 ssh.close()
通过paramiko.Transport()封装:
注释:使用Transport方式连接远程服务器,python2.x和python3.x就一样了,具体代码如下:
1 #!/usr/bin/env python3.5 2 3 import paramiko 4 private_key = paramiko.RSAKey.from_private_key_file(‘/Users/tedzhou/.ssh/dongjing-shanghai.pem‘) 5 # ‘/Users/tedzhou/.ssh/dongjing-shanghai.pem‘ 6 #封装transport 7 transport = paramiko.Transport((‘127.0.0.1‘,22)) #这里一定是元组 8 transport.connect(username=‘root‘,pkey=private_key) 9 10 # 创建SSH连接 11 ssh = paramiko.SSHClient() 12 ssh._transport = transport 13 14 # 获取执行命令的结果 15 stdin,stdout,stderr = ssh.exec_command(‘df‘) 16 17 result = stdout.read() 18 19 print(result.decode()) 20 21 transport.close()
通过上面例子中,发现使用paramiko.Transport()方法封装后,再调用SSHClinet()方法更好些,因为python2.x和python3.x语法一样
而且下面使用paramiko.SFTPClient()进行文件的上传和下载,使用的语法也是paramiko.Transport()方法
SFTPClient
用于连接远程服务器并执行上传下载
基于用户名密码上传下载
1 import paramiko 2 3 transport = paramiko.Transport((‘hostname‘,22)) 4 transport.connect(username=‘wupeiqi‘,password=‘123‘) 5 6 sftp = paramiko.SFTPClient.from_transport(transport) 7 # 将location.py 上传至服务器 /tmp/test.py 8 sftp.put(‘/tmp/location.py‘, ‘/tmp/test.py‘) 9 # 将remove_path 下载到本地 local_path 10 sftp.get(‘remove_path‘, ‘local_path‘) 11 12 transport.close()
基于公钥密钥上传下载
1 import paramiko 2 3 private_key = paramiko.RSAKey.from_private_key_file(‘/home/auto/.ssh/id_rsa‘) 4 5 transport = paramiko.Transport((‘hostname‘, 22)) 6 transport.connect(username=‘wupeiqi‘, pkey=private_key ) 7 8 sftp = paramiko.SFTPClient.from_transport(transport) 9 # 将location.py 上传至服务器 /tmp/test.py 10 sftp.put(‘/tmp/location.py‘, ‘/tmp/test.py‘) 11 # 将remove_path 下载到本地 local_path 12 sftp.get(‘remove_path‘, ‘local_path‘) 13 14 transport.close()
以上是关于python2.0 s12 day8 _ 堡垒机前戏paramiko模块的主要内容,如果未能解决你的问题,请参考以下文章