Python学习—paramiko模块实
- 2020 年 1 月 8 日
- 筆記
paramiko模块
paramiko模块提供了ssh及sft进行远程登录服务器执行命令和上传下载文件的功能。这是一个第三方的软件包,使用之前需要安装。
import paramiko # ssh root@ip # 创建一个ssh对象 client = paramiko.SSHClient() #如果第一次连接陌生的IP,自动选择yes确认连接 client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接服务器 client.connect(hostname='111.231.215.66',port=22,username='手动屏蔽帐号',password='手动屏蔽密码') # 执行操作 stdin,stdout,stderr = client.exec_command('hostname') # 获取命令执行结果 host = stdout.read().decode('utf-8').strip() print(host) while True: command = input("[root@%s]# " %host) if command == 'exit()': break else: r = client.exec_command(command)[1].read().decode('utf-8') print(r) # 关闭连接 client.close()

例子1:
连接文件 主机信息.txt 中的所有主机

不能连接返回连接失败,成功连接,返回其主机名 把连接情况写入文件。
import paramiko client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) def ssh_info(ip,port=22,user='root',passwd='westos'): try: client.connect(hostname=ip,port=port,username=user,password=passwd) r = client.exec_command('hostname')[1].read().decode('utf-8') except: print('连接失败......') return '连接失败......' else: client.close() print('连接成功......','n主机名:%s' %r) return '连接成功......'+'n主机名:%s' %r with open('连接状况.txt','w') as f,open('主机信息.txt') as p: for line in p: line = line.strip() ip, port, user, passwd = line.split(':') s = ' 正在连接%s '.center(30, '+') % ip f.write(s+'n') f.write(ssh_info(ip,port,user,passwd)+'n')

例子2:
基于公钥私钥的批量连接
import paramiko client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) def ssh_info(ip,pkey,port=22,user='root'): try: print(' 正在连接%s '.center(30, '+') % ip) client.connect(hostname=ip,port=port,username=user,pkey=pkey) r = client.exec_command('hostname')[1].read().decode('utf-8') except: print('连接失败......') else: client.close() print('连接成功......','n主机名:%s' %r) pkey = paramiko.RSAKey.from_private_key_file('id_rsa') for i in range(254): ip = '172.25.254.'+str(i+1) ssh_info(ip,pkey)
例子3:
基于公钥私钥的上传下载
import paramiko private_key = paramiko.RSAKey.from_private_key_file('id_rsa') transport = paramiko.Transport(('172.25.254.39', 22)) transport.connect(username='root',pkey=private_key) sftp = paramiko.SFTPClient.from_transport(transport) #上川下载 sftp.put('/tmp/kiosk', '/mnt/kiosk2') sftp.get('/mnt/kiosk2', '/home/kiosk/Desktop/day18/kiosk') transport.close()
paramiko综合练习实例1
import os import paramiko group = [file.rstrip('.conf') for file in os.listdir('host')] print('主机组'.center(30,'+')) for i,g in enumerate(group): print('t',str(i+1),'t',g) choice = input('选择操作组:') print('主机'.center(30,'+')) host_info_list = [] # 存储文件中主机信息 file = 'host/'+choice+'.conf' with open(file) as f: for line in f: line =line.split(':') print('t',line[0]) host_info_list.append(line) def do_cmd(cmd,hostname,port=22, username='root', password='westos'): print('连接主机 ',hostname) try: client.connect(hostname, port, username, password) stdin, stdout, stderr = client.exec_command(cmd) result = stdout.read().decode('utf-8').strip() except: print('连接失败......') else: client.close() print(result) def get_put(cmd,hostname,port=22, username='root', password='westos'): print('连接主机 ', hostname) try: transport = paramiko.Transport((hostname, int(port))) transport.connect(username=username, password=password) sftp = paramiko.SFTPClient.from_transport(transport) except: print('连接失败......') else: # 上川下载 if cmd[0] == 'put': sftp.put(cmd[1], cmd[2]) print('上传成功......') elif cmd[0] == 'get': sftp.get(cmd[1], cmd[2]) print('下载成功......') else: print('暂时没有这个命令的操作......',cmd[0]) transport.close() while True: cmd = input('>>>: ') cmd = cmd.split() if cmd == []: continue elif len(cmd) == 1: client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) for host in host_info_list: do_cmd(cmd[0],host[0],host[1],host[2],host[3]) else: for host in host_info_list: get_put(cmd,host[0],host[1],host[2],host[3])
paramiko封装实例1:
import os import paramiko class SSH_host: def __init__(self,ip,port,u,p,cmd): self.ip = ip self.port = port self.username = u self.passwd = p self.cmd = cmd def cmd(self): print('连接主机 ',self.ip) client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: client.connect(self.ip, self.port, self.username, self.passwd) stdin, stdout, stderr = client.exec_command(self.cmd[0]) result = stdout.read().decode('utf-8').strip() except: print('连接失败......') else: print(result) client.close() def get(self): print('连接主机 ', self.ip) try: transport = paramiko.Transport((self.ip, self.port)) transport.connect(self.username, self.passwd) sftp = paramiko.SFTPClient.from_transport(transport) except: print('连接失败......') else: sftp.get(self.cmd[1], self.cmd[2]) print('下载成功......') transport.close() def put(self): print('连接主机 ', self.ip) try: transport = paramiko.Transport((self.ip, self.port)) transport.connect(self.username, self.passwd) sftp = paramiko.SFTPClient.from_transport(transport) except: print('连接失败......') else: sftp.put(self.cmd[1], self.cmd[2]) print('上传成功......') transport.close() if __name__ == "__main__": group = [file.rstrip('.conf') for file in os.listdir('host')] print('主机组'.center(30,'+')) for i,g in enumerate(group): print('t',str(i+1),'t',g) choice = input('选择操作组:') print('主机'.center(30,'+')) host_info_list = [] # 存储文件中主机信息 file = 'host/'+choice+'.conf' with open(file) as f: for line in f: line =line.split(':') print('t',line[0]) host_info_list.append(line) while True: cmd = input('>>>: ') cmd = cmd.split() for host in host_info_list: link = SSH_host(host[0], int(host[1]), host[2], host[3], cmd) if cmd == []: continue else: if hasattr(link, cmd[0]): print(cmd[0])
