paramiko模块
paramiko模块功能
基于SSH用于连接远程服务器并执行相关操作
SSHClient类
用于连接远程服务器并执行基本命令,
有两种连接方式,一种是基于用户名密码的连接,另一种是基于公钥密钥的连接,两种方式都能封装transport的功能进行连接。
1、基于用户名密码连接:
1.1、普通连接方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import paramiko# 创建SSH对象ssh = paramiko.SSHClient()# 允许连接不在know_hosts文件中的主机ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 连接服务器ssh.connect(hostname='192.168.136.8', port=22, username='root', password='123456')# 执行命令stdin, stdout, stderr = ssh.exec_command('ls')# 获取命令结果result = stdout.read()print result# 关闭连接ssh.close() |
SSHClient()自己创建t=transport对象,然后用t.connect连接等等操作。
1.2、手动封装Transport功能:
1 2 3 4 5 6 7 8 9 10 11 12 | import paramikotransport = paramiko.Transport(('hostname', 22))transport.connect(username='root', password='123456')ssh = paramiko.SSHClient()ssh._transport = transport # SSHClient 封装 Transportstdin, stdout, stderr = ssh.exec_command('df')print stdout.read()transport.close() |
手动创建transport对象。
为什么要采用这种方式?因为后面的sftpclient只能用transport方式,为了避免代码重复,都用一种方式。
2、基于公钥密钥连接:
2.1、普通连接方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import paramiko private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa') # 创建SSH对象ssh = paramiko.SSHClient()# 允许连接不在know_hosts文件中的主机ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 连接服务器ssh.connect(hostname='c1.salt.com', port=22, username='root', key=private_key) # 执行命令stdin, stdout, stderr = ssh.exec_command('df')# 获取命令结果result = stdout.read() # 关闭连接ssh.close() |
2.2、手动封装Transport功能:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import paramikoprivate_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')transport = paramiko.Transport(('hostname', 22))transport.connect(username='root', pkey=private_key)ssh = paramiko.SSHClient()ssh._transport = transportstdin, stdout, stderr = ssh.exec_command('df')transport.close()SSHClient 封装 Transport |
SFTPClient类
用于连接远程服务器并执行上传下载文件,只能用transport封装的模式执行。
1、基于用户名密码连接:
1 2 3 4 5 6 7 8 9 10 11 12 | import paramiko transport = paramiko.Transport(('hostname',22))transport.connect(username='root',password='123') sftp = paramiko.SFTPClient.from_transport(transport)# 将location.py 上传至服务器 /tmp/test.pysftp.put('/tmp/location.py', '/tmp/test.py')# 将remove_path 下载到本地 local_pathsftp.get('remote_path', 'local_path') transport.close() |
2、基于公钥密钥连接:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import paramiko private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa') transport = paramiko.Transport(('hostname', 22))transport.connect(username='root', pkey=private_key ) sftp = paramiko.SFTPClient.from_transport(transport)# 将location.py 上传至服务器 /tmp/test.pysftp.put('/tmp/location.py', '/tmp/test.py')# 将remove_path 下载到本地 local_pathsftp.get('remote_path', 'local_path') transport.close() |
模拟haproxy更改配置文件
实现思路:
1、本地生成文件 uuid.ha
2、上传文件至服务器 uuid.ha
3、ha.cfg --> ha.cfg.bak
4、uuid.ha --> ha.cfg
5、 reload
传文件用paramiko模块的SFTPClient,命令操作()用paramiko模块的SSHClient,为了避免重复连接,所以都用Transport方式连接。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | import paramikoimport uuid#两个方法都用一个连接,减少连接开销class Haproxy(object): def __init__(self): self.host='192.168.136.8' self.port=22 self.username='root' self.pwd='123456' def create_file(self): file_name=str(uuid.uuid4()) #uuid('9fb01137-e13d-4ea8-b16e-d7861c2b8d9a')==>'9fb01137-e13d-4ea8-b16e-d7861c2b8d9a' with open(file_name,'wb')as f: f.write('test') return file_name def run(self): self.connect() self.upload() self.rename() self.close() def connect(self): transport=paramiko.Transport((self.host,self.port)) transport.connect(username=self.username,password=self.pwd) self.__transport=transport def close(self): self.__transport.close() def upload(self): file_name=self.create_file() sftp=paramiko.SFTPClient.from_transport(self.__transport) sftp.put(file_name,'/tmp/ttt.py') def rename(self): ssh = paramiko.SSHClient() ssh._transport=self.__transport stdin,stdout,stderro=ssh.exec_command('mv /tmp/ttt.py /tmp/nnn.py') result=stdout.read() print resultobj=Haproxy()obj.run() |

浙公网安备 33010602011771号