一.原理:ssh免密的原理简单说就是通过ssh-keygen生成一对密钥对,然后把公钥拷贝到对端服务器,然后用私钥就可以打开对端的公钥,就能免密码连接对端
二.使用步骤:
步骤1:生成密钥对
ssh-keygen -f ~/.ssh/id_rsa_tom -P ""
-t 指定要创建的密钥类型,有rsa1(SSH1),dsa(SSH2),ecdsa(SSH2),rsa(SSH2)等类型,默认是rsa类型
-f 选项指定生成的私钥的文件名,建议生成的时候指定一个非id_rsa的名字,因为别人重新生成了默认的密钥对,就会把原先同名的密钥对覆盖掉,原先的免密配对也就失效了
-P 指定二次加密的密码
使用 ssh-kengen 会在~/.ssh/目录下生成两个文件,不指定文件名和密钥类型的时候,默认生成的两个文件是:
id_rsa #私钥
id_rsa.pub #公钥
步骤2:把密码拷贝到远端
ssh-copy-id -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa_tom.pub root@10.0.0.31
-o StrictHostKeyChecking=no ssh连接时不会提示是否连接的交互
-i 指定要传输的公钥
步骤3:步骤2输入后,还是要交互的方式输入远端的root用户的密码,如果不想交互的方式输入密码,就需要用到sshpass
yum -y install sshpass
sshpass -p "1" ssh-copy-id -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa_tom.pub root@10.0.0.31
sshpass -p:后面跟的就是远端主机的root用户密码
三.如果有多台机器需要拷贝,可以使用脚本进行拷贝
cat copykey.sh
#!/bin/bash
#author: tom
#desc: 生成密钥对,批量拷贝公钥到远端机器
#1.定义变量
private_key="/root/.ssh/id_rsa_tom"
public_key="/root/.ssh/id_rsa_tom.pub"
log_file="/server/scripts/copysshkey/copy.log"
hosts="/server/scripts/copysshkey/hosts.txt" #hosts.txt文件里内容为多行,每行都是IP:密码
#2.生成密钥对
echo "-------------------------------执行开始时间`date +%F-%T`" >> ${log_file}
if [ -f $private_key -a -f $public_key ];then
echo "密钥对和公钥都已经存在" >> ${log_file}
else
#防止出现公钥或私钥缺失的情况发生
rm -rf $private_key $public_key
ssh-keygen -f $private_key -P ""
echo "新生成密钥对" >> ${log_file}
fi
#3.拷贝公钥到远端
while read line
do
ip=`echo ${line}|awk -F':' '{print $1}'`
passwd=`echo ${line}|awk -F':' '{print $2}'`
sshpass -p ${passwd} ssh-copy-id -o StrictHostKeyChecking=no -i ${public_key} root@${ip} &> /dev/null
if [ $? -eq 0 ];then
echo "------------------------------------" >> ${log_file}
echo "拷贝到 ${ip} 成功" >> ${log_file}
#验证免密是否成功,注意ssh -n,不加-n,while在第一个循环后会停止循环
checkResult=`ssh -n ${ip} -i ${private_key} hostname -I|awk '{print $1}'`
echo "验证连接获取IP: $checkResult" >> ${log_file}
else
echo "拷贝到 ${ip} 失败" >> ${log_file}
fi
done < ${hosts}
echo "-------------------------------执行结束时间`date +%F-%T`" >> ${log_file}