工作中由于服务器主机很多,如果手动的一台一台去添加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))
#############################################################################################
转载于:https://blog.51cto.com/xiaofengmo/1769885