Python paramiko
一、开发堡垒机之前,先来学习Python的paramiko模块,该模块基于SSH用于连接远程服务器并执行相关操作。
二、SSHClient用于连接远程服务器并执行基本命令。
1、基于公钥密钥连接
1 #!/usr/bin/python 2 # -*- coding : utf-8 -*- 3 # 作者: Presley 4 # 时间: 2018-11-28 5 # 邮箱:1209989516@qq.com 6 # 这是我用来练习python paramiko的测试脚本 7 8 import paramiko 9 10 private_key = paramiko.RSAKey.from_private_key_file("/home/wohaoshuai/.ssh/id_rsa") #指定密钥文件路径 11 12 #创建SSH对象 13 ssh = paramiko.SSHClient() 14 15 #允许连接不在know_hosts文件中的主机 16 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #跳过询问yes或no步骤 17 18 #连接服务器 19 ssh.connect(hostname="192.168.10.44",port=22,username="wohaoshuai",key=private_key) 20 21 #执行命令 22 stdin,stdout,stderr = ssh.exec_command("df") 23 24 #获取命令结果 25 result,err = stdout.read() , stderr.read() 26 if not err: 27 print(result) 28 else:print(err) 29 #关闭连接 30 ssh.close()
2、基于用户名密码验证
1 #!/usr/bin/python 2 # -*- coding : utf-8 -*- 3 # 作者: Presley 4 # 时间: 2018-11-28 5 # 邮箱:1209989516@qq.com 6 # 这是我用来练习python paramiko的测试脚本 7 8 import paramiko 9 10 #创建SSH对象 11 ssh = paramiko.SSHClient() 12 13 #允许连接不在know_hosts文件中的主机 14 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #跳过询问yes或no步骤 15 16 #连接服务器 17 ssh.connect(hostname="192.168.10.44",port=22,username="root",password="123456") 18 19 #执行命令 20 stdin,stdout,stderr = ssh.exec_command("df") 21 22 #获取命令结果 23 result,err = stdout.read().decode("utf-8") , stderr.read().decode("utf-8") 24 if not err: 25 print(result) 26 else:print(err) 27 #关闭连接 28 ssh.close()
3、使用filter装逼
1 # -*- coding : utf-8 -*- 2 # 作者: Presley 3 # 时间: 2018-12-08 4 # 邮箱:1209989516@qq.com 5 # 这是我用来练习mysql操作的测试脚本 6 7 import paramiko 8 9 import paramiko 10 11 #创建SSH对象 12 ssh = paramiko.SSHClient() 13 14 #允许连接不在know_hosts文件中的主机 15 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #跳过询问yes或no步骤 16 17 #连接服务器 18 ssh.connect(hostname="192.168.10.44",port=22,username="root",password="123456") 19 20 #执行命令 21 stdin,stdout,stderr = ssh.exec_command("df") 22 23 #获取命令结果 24 25 result = list(filter(lambda x: x is not None,[stdout.read().decode("utf-8"),stderr.read().decode("utf-8")]))[0] #将后面列表中的两个值赋值给x,如果x不为None则留在列表中,否则就过滤掉 26 print(result) 27 # result,err = stdout.read().decode("utf-8") , stderr.read().decode("utf-8") 28 # if not err: 29 # print(result) 30 # else:print(err) 31 #关闭连接 32 ssh.close()
三、上传和下载文件
1 # -*- coding : utf-8 -*- 2 # 作者: Presley 3 # 时间: 2018-12-08 4 # 邮箱:1209989516@qq.com 5 # 这是我用来练习mysql操作的测试脚本 6 7 8 import paramiko 9 10 transport = paramiko.Transport(('192.168.10.44',22)) 11 transport.connect(username="root",password="123456") 12 sftp = paramiko.SFTPClient.from_transport(transport) 13 14 #将当前路径aaa.txt上传至服务器 /tmp/test.py 15 sftp.put("aaa.txt","/tmp/test.py") 16 17 #将/tmp/test.py下载到本地当前路径下的bbb.txt 18 sftp.get("/tmp/test.py","bbb.txt") 19 20 transport.close()