工作中由于服务器主机很多,如果手动的一台一台去添加ssh认证,效率太低了,而此脚本正是为了解决此问题
此脚本的实现的功能:
1、实现了(密码、ssh认证)单一主机登录和批量主机登录
2、实现了(密码、ssh认证)单一主机上传文件和批量主机上传文件(下载文件的原理和此一样)
3、主机批量添加ssh认证(这才是我的主要目的)
脚本的不足:
1、只能循环主机名
2、所有的主机的账号和密码都是一样的,不够灵活
有需求的朋友可以修改下代码,可以把主机、账号密码存放在一个文件中,循环读取文件
下面贴上代码吧
如下代码有错
欢迎各位纠正
有错才有进步
你们的指点是我进步的源泉
#!/usr/bin/python #coding:utf-8 #需要安装paramiko模块 #yum install python-paramiko -y import paramiko,os class SSH2: def __init__(self,hostname=None,username=None,password=None,key_file=None,port=22,timeout=30): self.h = hostname self.u = username self.p = password self.t = timeout self.port = int(port) self.key_file = key_file #使用密码登录 def ssh2_pass(self,command=None): paramiko.util.log_to_file('/tmp/paramiko.log') ssh2 = paramiko.SSHClient() ssh2.load_system_host_keys() ssh2.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh2.connect(hostname=self.h,username=self.u,password=self.p,port=self.port,timeout=self.t) stdin,stdout,stderr = ssh2.exec_command(command) print '{0}\t{1}'.format(self.h,command) print stdout.read() ssh2.close() #使用key密钥登录 def ssh2_key(self,command=None): paramiko.util.log_to_file('/tmp/paramiko.log') key = paramiko.RSAKey.from_private_key_file(self.key_file) ssh2 = paramiko.SSHClient() ssh2.load_system_host_keys() ssh2.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh2.connect(hostname=self.h,username=self.u,pkey=key,port=self.port,timeout=self.t) stdin,stdout,stderr = ssh2.exec_command(command) print '{0}\t{1}'.format(self.h,command) print stdout.read() ssh2.close() #使用密码上传文件 def sftp_pass_put(self,localpath=None,remotepath=None): t = paramiko.Transport((self.h,self.port)) t.connect(username=self.u,password=self.p) sftp = paramiko.SFTPClient.from_transport(t) sftp.put(localpath=localpath,remotepath=remotepath) print self.h,localpath t.close() #使用key密钥上传文件 def sftp_key_put(self,localpath=None,remotepath=None): key = paramiko.RSAKey.from_private_key_file(self.key_file) t = paramiko.Transport((self.h,self.port)) t.connect(username=self.u,pkey=key) sftp = paramiko.SFTPClient.from_transport(t) sftp.put(localpath=localpath,remotepath=remotepath) print self.h,localpath t.close() if __name__ == '__main__': ###################使用密码登录主机############################################################# #远程服务器IP地址 #hostname = '192.168.31.102' #远程服务器的账号和密码 #username = 'xiaomo' #password = 'xiaomo' #SSH = SSH2(hostname=hostname,username=username,password=password,port=22) #SSH.ssh2_pass(command='df -h') ###################使用密钥登录主机############################################################# #远程服务器IP地址 #hostname = '192.168.31.102' #远程服务器的账号 #username = 'xiaomo' #指定密钥文件的位置 #key_file = '/home/xiaomo/.ssh/id_rsa' #SSH = SSH2(hostname=hostname,username=username,key_file=key_file,port=22) #SSH.ssh2_pass(command='df -h') ###################使用密码上传文件############################################################# #远程服务器IP地址 #hostname = '192.168.31.102' #远程服务器的账号和密码 #username = 'xiaomo' #password = 'xiaomo' #本地文件绝对路径 #密钥需要自己ssh-keygen生成 #local = '/home/xiaomo/.ssh/id_rsa.pub' #远程服务器文件绝对路径 #remote = '/tmp/id_rsa.pub' #SSH = SSH2(hostname=hostname,username=username,password=password,port=22) #SSH.sftp_pass_put(localpath=local,remotepath=remote) #SSH.ssh2_pass(command='ls -l {0}'.format(remote)) ###################使用密钥上传文件############################################################# #远程服务器IP地址 #hostname = '192.168.31.102' #远程服务器的账号 #username = 'xiaomo' #指定密钥文件的位置 #key_file = '/home/xiaomo/.ssh/id_rsa' #本地文件绝对路径 #local = '/home/xiaomo/.ssh/id_rsa.pub' #远程服务器文件绝对路径 #remote = '/tmp/id_rsa.pub' #SSH = SSH2(hostname=hostname,username=username,port=22,key_file=key_file) #SSH.sftp_key_put(localpath=local,remotepath=remote) #SSH.ssh2_key(command='ls -l {0}'.format(remote)) #####################使用密码批量添加用户认证############################################################ #hostname = ['192.168.31.101','192.168.31.102','192.168.31.103'] #远程服务器的账号和密码 #username = 'xiaomo' #password = 'xiaomo' #本地文件绝对路径 #local = '/home/xiaomo/.ssh/id_rsa.pub' #远程服务器文件绝对路径 #remote = '/tmp/id_rsa.pub' #批量上传密钥文件并添加认证 #如果.ssh目录或authorized_keys文件事先存在,请确认权限是否正确 #for h in hostname: # SSH = SSH2(hostname=h,username=username,password=password,port=22,timeout=30) # #/home/xiaomo/.ssh/是远程服务器的用户目录 # SSH.ssh2_pass(command='(umask 077; test -d /home/xiaomo/.ssh || mkdir /home/xiaomo/.ssh)') # SSH.sftp_pass_put(localpath=local,remotepath=remote) # SSH.ssh2_pass(command='(umask 077;cat {0} >> /home/xiaomo/.ssh/authorized_keys && rm -f {0})'.format(remote)) # SSH.ssh2_pass(command='cat /home/xiaomo/.ssh/authorized_keys') ##################使用密钥批量上传文件################################################################### #hostname = ['192.168.31.101','192.168.31.102','192.168.31.103'] #远程服务器的账号 #username = 'xiaomo' #指定密钥文件的位置 #key_file = '/home/xiaomo/.ssh/id_rsa' #本地文件绝对路径 #local = '/home/xiaomo/.ssh/id_rsa.pub' #远程服务器文件绝对路径 #remote = '/tmp/id_rsa.pub' #for h in hostname: # SSH = SSH2(hostname=h,username=username,port=22,key_file=key_file) # SSH.sftp_key_put(localpath=local,remotepath=remote) # SSH.ssh2_key(command='ls -l {0}'.format(remote)) #############################################################################################