一、开发堡垒机之前,先来学习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 paramiko10 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.py15 sftp.put("aaa.txt","/tmp/test.py")16 17 #将/tmp/test.py下载到本地当前路径下的bbb.txt18 sftp.get("/tmp/test.py","bbb.txt")19 20 transport.close()