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 paramikoclient = 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' %rwith 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 paramikoclient = 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 paramikoprivate_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 osimport paramikogroup = [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 osimport paramikoclass 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])