一、工具
- ssh-keygen 生成秘钥工具
- ssh-copy-id 复制公钥到远程工具
- pssh 远程执行命令工具
- pscp 复制文件到远程服务器工具
- pslurp 从远程复制文件到本机工具
- python 2.7
二、操作步骤
-
1、单向授权
选择一台总控机,在本机生成ssh秘钥
ssh-keygen -t rsa
同步秘钥到远程服务器,简历单向授信
ssh-copy-id -i ~/.ssh/id_rsa.pub -p22444 XXX@172.16.2.2 ssh-copy-id -i ~/.ssh/id_rsa.pub -p22444 XXX@172.16.2.3 //XXX 是你的用户名
因为这一步需要输入密码,所以暂时没有发现可以快速操作的方法,如有其他更好的方法,请指教。
已知方法中可以使用 && 连接多条命令,然后一直输入密码就行,格式如下ssh-copy-id -i ~/.ssh/id_rsa.pub -p22444 XXX@172.16.2.2 && ssh-copy-id -i ~/.ssh/id_rsa.pub -p22444 XXX@172.16.2.3 && ssh-copy-id -i ~/.ssh/id_rsa.pub -p22444 XXX@172.16.2.3
做完这一步,可以从总控机器单向免密登陆到远程服务器,测试命令:
pssh -h ips.txt -P 'date'
如果命令执行结果显示有机器失败,是因为安全策略的问题,需要登录一下出错的远程机器,并且输入"yes"就好。
-
2、每台机器生成秘钥
pssh -h ~/ips.txt -P 'ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa' -h ssh登陆的地址列表 -P 在远程机器上执行的命令
-
3、把所有的公钥放到一个文件中
拷贝远程生成的公钥到authorized_keys文件pslurp -L ~/tmp/ -h db-ips.txt ~/.ssh/id_rsa.pub id_rsa.pub -L 远程文件复制后存储在本机的目录 -h ssh登陆的地址列表 id_rsa.pub 表示远程文件复制过来后本地存放的名称
从远程拷贝过来的文件,加入了机器ip的文件夹,我写了一个python脚本,目的是把远程拷贝过来的id_rsa.pub文件内容都放在一个文件中。
新建一个python文件:vi copyToFile.py
复制下面的脚本内容到文件中,修改自己的秘钥输出路径和读取文件的路径,并保存。注释可能引起错误,使用的时候请删除
import os outFilePath='/tmp/authorized_keys' #秘钥输出的地址 readPath='/home/用户名/tmp' #读取文件的根路径,第三步中复制文件的路径 def all_path(dirname): result = [] for maindir, subdir, file_name_list in os.walk(dirname): for filename in file_name_list: apath = os.path.join(maindir, filename) if(filename=='id_rsa.pub'): result.append(apath) return result with open(outFilePath,'a') as outFile: for path in all_path(readPath): print("----------------write file---------------------") with open(path) as inFile: lines = inFile.readlines() for line in lines: outFile.write(str(line)) print(line) inFile.close() outFile.write("\n") print("----------------write over--------------------------") outFile.close()
运行python脚本
python copyToFile.py
警告:最重要的一步。不做这一步就会导致第一步的单向授信失效。
上面的python脚本没有拷贝本机的公钥。所以需要手动增加一下。cat ~/.ssh/id_rsa.pub >> /home/XXX/tmp/authorized_keys
-
4、替换本机的authorized_keys文件,并且把authorized_keys发送到每个机器
复制文件到本机的.ssh目录:cp /home/XXX/tmp/authorized_keys ~/.ssh/authorized_keys
发送到远程的机器:
pscp -h ips.txt ~/.ssh/authorized_keys ~/.ssh/ # 如果出现pscp: 未找到命令。是因为新版的pssh安装后,pscp命令变成了pscp.pssh pscp.pssh -h ips.txt ~/.ssh/authorized_keys ~/.ssh/