堡垒机前戏
开发堡垒机之前,先来学习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() 方法
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)) # 实例化一个Transport()实例,传入主机的IP或者hostname 和 端口组合的元组,记住一定是元组。
11 transport.connect(username='root',password='123') # 调用connect方法,设置transport的连接方式用户名和密码,
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()