一、堡垒机前戏
开发堡垒机之前,先来学习Python的paramiko模块,该模块基于SSH用于连接远程服务器并执行相关操作
模块安装
C:Program FilesPython 3.5Scripts>pip3.5.exe install paramiko 如果报错pip install --upgrade pip 更新下pip继续上步安装就哦了
ssh客户端
创建用于连接远程服务器的客户端并执行基本命令
#!/usr/bin/env python # -*- coding:utf-8 -*- #-Author-Lian import paramiko # 创建SSH对象 ssh = paramiko.SSHClient() # 允许连接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接服务器 ssh.connect(hostname="192.168.20.219",port=22,username="root",password="zyw@123") # 执行命令 stdin,stdout,stderr = ssh.exec_command("df") # 获取命令结果 result = stdout.read() # 打印输出 print(result.decode()) # 关闭连接 ssh.close() # 程序输出 # Filesystem 1K-blocks Used Available Use% Mounted on # /dev/mapper/VolGroup-lv_root # 48966472 2169976 44302444 5% / # tmpfs 502176 0 502176 0% /dev/shm # /dev/sda1 487652 28375 433677 7% /boot
基于公钥密钥连接
#!/usr/bin/env python # -*- coding:utf-8 -*- #-Author-Lian 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.20.219",port=22,username="root",pkey=private_key) # 执行命令 stdin,stdout,stderr = ssh.exec_command("df") # 获取命令结果 result = stdout.read() # 打印输出 print(result.decode()) ssh.close() # 程序输出 # Filesystem 1K-blocks Used Available Use% Mounted on # /dev/mapper/VolGroup-lv_root # 48966472 2169976 44302444 5% / # tmpfs 502176 0 502176 0% /dev/shm # /dev/sda1 487652 28375 433677 7% /boot
sftp客户端
创建用于连接远程服务器的客户端并并进行上传、下载
#!/usr/bin/env python # -*- coding:utf-8 -*- #-Author-Lian import paramiko transport = paramiko.Transport(("192.168.20.219",22)) transport.connect(username="root",password="zyw@123") sftp = paramiko.SFTPClient.from_transport(transport) # 上传文件 sftp.put("location.py","/tmp/test.py") # 下载文件 sftp.get("location.py","/tmp/test.py") transport.close()
#!/usr/bin/env python # -*- coding:utf-8 -*- #-Author-Lian import paramiko private_key = paramiko.RSAKey.from_private_key_file("id_rsa") transport = paramiko.Transport(("192.168.20.219",22)) transport.connect(username="root",pkey=private_key) sftp = paramiko.SFTPClient.from_transport(transport) # 上传文件 sftp.put("location.py","/tmp/test.py") # 下载文件 #sftp.get("location.py","/tmp/test.py") transport.close()
创建密钥
[root@bogon tmp]# ssh-keygen -t rsa
上面的命令在服务端linux上执行的,用root登录的,会在/root/.ssh/目录下生产id.rsa(私钥)、id.rsa.pub(公钥)。把id.rsa拷贝到客户端(本次测试的是windows),id.rsa.pub改名为authorized_keys依然放到目录/root/.ssh/目录下
私钥放到客户端,公钥放到要免密码登录的服务器上,多台就放置到多台上!!!这个我之前竟然忘了啊啊啊啊啊啊!!!