一、paramiko
1、利用paramiko连接远端服务器
import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(hostname='192.168.72.132',port=22,username='root',password='start33333') stdin,stdout,stderr = ssh.exec_command('ls -l') #句柄 print stdout.read() ssh.close()
import paramiko transport = paramiko.Transport(('192.168.72.132',22)) transport.connect(username='root',password='start33333') ssh = paramiko.SSHClient() ssh._transport=transport stdin,stdout,stderr = ssh.exec_command('ls -l') print stdout.read() transport.close()
2、sftp
import paramiko transport = paramiko.Transport(('192.168.72.132',22)) transport.connect(username='root',password='start33333') sftp = paramiko.SFTPClient.from_transport(transport) sftp.put('123','/tmp/111') sftp.get('remote_path','locate_path') transport.close()
3、paramiko实现修改远程机器配置文件
步骤:a、本地生成文件uuid.ha;b、uuid上传到服务器; c、备份 ha.cnf--->ha.cnf.bak; d、uuid.ha--->ha.cnf; f、reload
上述步骤应该一部完成,使用sftpclient和sshclient命令操作;
import paramiko import uuid class Haproxy(object): def __init__(self): self.host = '192.168.72.220' self.port =22 self.username = 'root' self.pwd = 'start33333' def create_file(self): file_name = str(uuid.uuid4()) with open(file_name,'w') as f: f.write('Charles') 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,'/home/Charles/123.py') def rename(self): ssh = paramiko.SSHClient() ssh._transport=self.__transport stdin,stdout,stderr = ssh.exec_command('mv /home/Charles/123.py /home/Charles/456.py') result = stdout.read() ssh.close() ha = Haproxy() ha.run()
4、paramiko实现持续性连接
import paramiko tran = paramiko.Transport(('192.168.72.220',22)) tran.start_client() tran.auth_password('Charles','start33333') #给予密码的认证 chan = tran.open_session() #打开一个通道 chan.get_pty() chan.invoke_shell() #激活器 import sys,select,socket while True: #监视用户的输入和服务器的返回数据 #sys.stdin处理用户的输入 #chan是之前创建的通道,用户接受服务器的返回信息 readable,writeable,error = select.select([chan,sys.stdin,],[],[],1) if chan in readable: try: x = chan.recv(1024) if len(x) == 0: print ' ***EOF ', break sys.stdout.write(x) sys.stdout.flush() except socket.timeout: pass if sys.stdin in readable: inp = sys.stdin.readline() chan.sendall(inp) chan.close() tran.close()
#上述代码存在的问题,按tab键不能补全,只有回车键发挥发送数据; #解决方式:1、改变默认终端;由行--->stdin变为按字符--->stdin;2、点击一次,向终端发送一次;即远程登录之后,改为原始模式,退出到本地之后,改为标准模式; import paramiko tran = paramiko.Transport(('192.168.72.220',22)) tran.start_client() tran.auth_password('Charles','start33333') chan = tran.open_session() chan.get_pty() chan.invoke_shell() import select import sys import socket import termios import tty oldtty = termios.tcgetattr(sys.stdin) try: # 为tty设置新属性 # 默认当前tty设备属性: # 输入一行回车,执行 # CTRL+C 进程退出,遇到特殊字符,特殊处理。 # 这是为原始模式,不认识所有特殊符号 # 放置特殊字符应用在当前终端,如此设置,将所有的用户输入均发送到远程服务器 tty.setraw(sys.stdin.fileno()) chan.settimeout(0.0) while True: r, w, e = select.select([chan, sys.stdin], [], [], 1) if chan in r: try: x = chan.recv(1024) if len(x) == 0: print ' *** EOF ', break sys.stdout.write(x) sys.stdout.flush() except socket.timeout: pass if sys.stdin in r: x = sys.stdin.read(1) if len(x) == 0: break chan.send(x) finally: termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty) chan.close() tran.close()
5、paramiko实现连续性连接服务器之记录操作日志
#!/usr/bin/env python # _*_ coding:utf-8 _*_ import paramiko tran = paramiko.Transport(('192.168.72.132',22)) tran.start_client() tran.auth_password('root','start33333') chan = tran.open_session() chan.get_pty() chan.invoke_shell() import select import sys import socket import termios import tty oldtty = termios.tcgetattr(sys.stdin) try: tty.setraw(sys.stdin.fileno()) chan.settimeout(0.0) f = open('record','a') #记录操作日志的文件 while True: r, w, e = select.select([chan, sys.stdin], [], [], 1) if chan in r: try: x = chan.recv(1024) if len(x) == 0: print ' *** EOF ', f.close() #返回为空,没有返回时关闭文件 break sys.stdout.write(x) sys.stdout.flush() except socket.timeout: pass if sys.stdin in r: x = sys.stdin.read(1) if len(x) == 0: break if x == ' ': pass else: f.write(x) chan.send(x) finally: termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty) chan.close() tran.close()
以上操作都是在linux机器上完成的,也可以在windows平台上完成,具体在那种平台上执行,可以参考paramiko源码包中的demo文件夹下的demo.py和interactive.py文件设置;
6、paramiko实现堡垒机的功能(利用demo.py和interactive.py实现)
#将上述两个文件拷贝到本地 #!/usr/bin/env python # _*_ coding:utf-8 _*_ import os,sys msg = """