python2.0 s12 day8 _ 堡垒机前戏paramiko模块
2016-06-06 09:37
525 查看
堡垒机前戏 开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作 paramiko模块是做主机管理的,他模拟了一个ssh. 有两种形式连接形式, 一种通过用户名密码: ssh -p 22 root@hostname 一种是通过密钥的方式: ssh -p 22 -i ~/.ssh/dongjing-shanghai.pem root@kiri_pro01 再连接的的语法上,有两种: 一种是直接将连接的主机地址和端口直接传入 一种是先把主机地址,端口,用户名,密码封装到paramiko.Transport()实例中 SSHClient 通过用户名密码连接的实例代码如下: 直接调用ssh.connect() 方法
#!/usr/bin/env python3.5 #__author__:'ted.zhou' ''' 使用paramiko模块,实现SSHClient连接远程服务器 先使用用户名,密码方式 ''' import paramiko ssh = paramiko.SSHClient() # 创建SSH对象 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 这句很关键, 允许连接不在know_hosts文件中的主机 ssh.connect(hostname='127.0.0.1',port=7272,username='root',password='123') # 连接服务器 stdin,stdout,stderr = ssh.exec_command('df') # 执行命令 result = stdout.read() # 获取命令结果 ssh.close() # 关闭连接 print(result.decode()) # 打印结果
通过paramiko.Transport()封装:
#!/usr/bin/env python3.5 #__author__:'ted.zhou' ''' paramiko模块SSHClient通过用户名密码连接远程服务器, 使用语法Transport()封装 ''' import paramiko transport = paramiko.Transport(('127.0.0.1',7272)) # 实例化一个Transport()实例,传入主机的IP或者hostname 和 端口组合的元组,记住一定是元组。 transport.connect(username='root',password='123') # 调用connect方法,设置transport的连接方式用户名和密码, ssh = paramiko.SSHClient() ssh._transport = transport stdin,stdout,stderr = ssh.exec_command('df') result = stdout.read() print(result.decode()) 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的写法如下:
#!/usr/bin/env python3.5 #__author__:'ted.zhou' ''' 使用paramiko.SSHClient()的sshkey方式连接远程服务器 ''' import paramiko # python3.x中就不需要再加载私钥文件了. # private_key = paramiko.RSAKey.from_private_key_file('/Users/tedzhou/.ssh/id_rsa') ssh = paramiko.SSHClient() # 创建SSH对象 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 允许连接不在know_hosts文件中的主机 # 开始连接服务器 ssh.connect(hostname='kiri_pro01', port=22, username='root', key_filename='/Users/tedzhou/.ssh/dongjing-shanghai.pem') # 获取远程主机执行命令的结果 stdin,stdout,stderr = ssh.exec_command('ifconfig') result = stdout.read() print(result.decode()) ssh.close()
通过paramiko.Transport()封装: 注释:使用Transport方式连接远程服务器,python2.x和python3.x就一样了,具体代码如下:
#!/usr/bin/env python3.5 import paramiko private_key = paramiko.RSAKey.from_private_key_file('/Users/tedzhou/.ssh/dongjing-shanghai.pem') # '/Users/tedzhou/.ssh/dongjing-shanghai.pem' #封装transport transport = paramiko.Transport(('127.0.0.1',22)) #这里一定是元组 transport.connect(username='root',pkey=private_key) # 创建SSH连接 ssh = paramiko.SSHClient() ssh._transport = transport # 获取执行命令的结果 stdin,stdout,stderr = ssh.exec_command('df') result = stdout.read() print(result.decode()) transport.close()
通过上面例子中,发现使用paramiko.Transport()方法封装后,再调用SSHClinet()方法更好些,因为python2.x和python3.x语法一样 而且下面使用paramiko.SFTPClient()进行文件的上传和下载,使用的语法也是paramiko.Transport()方法 SFTPClient 用于连接远程服务器并执行上传下载 基于用户名密码上传下载
import paramiko transport = paramiko.Transport(('hostname',22)) transport.connect(username='wupeiqi',password='123') sftp = paramiko.SFTPClient.from_transport(transport) # 将location.py 上传至服务器 /tmp/test.py sftp.put('/tmp/location.py', '/tmp/test.py') # 将remove_path 下载到本地 local_path sftp.get('remove_path', 'local_path') transport.close()
基于公钥密钥上传下载
import paramiko private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa') transport = paramiko.Transport(('hostname', 22)) transport.connect(username='wupeiqi', pkey=private_key ) sftp = paramiko.SFTPClient.from_transport(transport) # 将location.py 上传至服务器 /tmp/test.py sftp.put('/tmp/location.py', '/tmp/test.py') # 将remove_path 下载到本地 local_path sftp.get('remove_path', 'local_path') transport.close()
相关文章推荐
- python爬虫神器PyQuery的使用方法
- python下调用pytesseract识别某网站验证码
- Windows平台下Python对文件路径的获取
- python序列化: json & pickle & shelve 模块
- androlyze(或是其他Python程序)出现No module named traitlets.config异常的解决方法
- 12步教你理解python装饰器(转)
- python函数递归和生成器
- 使用python对url编码解码
- python的get方式提交请求
- Python 的 Magic Methods 指南(转)
- 安装lxml时出现 Unable to find vcvarsall.bat
- GDB 运行PYTHON 脚本+python 转换GDB调用栈到流程图
- python网页提取
- python面试奇点----------->最简洁的条件判断语句
- Python前世今生
- python-day0002-搭建基于python的selenium web测试环境
- Python—模块
- Python 查找list中的某个元素的所有的下标
- Python 用户登录练习
- Python-2 循环输出