共计 1705 个字符,预计需要花费 5 分钟才能阅读完成。
之前写过 SSH 实现内网机器无密码登录,这种方式可以实现免密登录,但是需要在每台终端上操作,确实有点麻烦。
后来想能否用脚本实现多台机器间免密登录,新增机器只需要修改文件,然后执行脚本。
后来找到一个脚本,我把脚本修改了部分内容,完整脚本如下:
#!/bin/bash
# ssh_batch.sh
# set -x
#####################################################
# generate ips.txt for ssh_batch.sh
# cat host-ips
# 172.30.0.10
# 172.30.0.11
# 172.30.0.12
IPS=./ips.txt
PASSWD=$1
if [ ! -n "$PASSWD" ]; then
PASSWD=123456
fi
# ssh-keygen
for IP in $(cat $IPS)
do
/usr/bin/expect << EOF
spawn ssh $IP "rm -rf /root/.ssh; echo 'StrictHostKeyChecking no' >> /etc/ssh/ssh_config; ssh-keygen -t rsa -N '' -f /root/.ssh/id_rsa -q"
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "$PASSWD\n" }
}
expect "*password*" {send "$PASSWD\n";}
expect eof
EOF
done
# copy id_rsa.pub
for IP in $(cat $IPS)
do
/usr/bin/expect << EOF
spawn scp root@$IP:/root/.ssh/id_rsa.pub /root/.ssh/id_rsa.pub.$IP
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "$PASSWD\n" }
}
expect "*password*" {send "$PASSWD\n"}
expect eof
EOF
cat /root/.ssh/id_rsa.pub.$IP >> /root/.ssh/authorized_keys
rm -f /root/.ssh/id_rsa.pub.$IP
done
## push authorized_keys
for COREIP in $(cat $IPS | sed -n '2,$p')
do
/usr/bin/expect << EOF
spawn scp /root/.ssh/authorized_keys root@$COREIP:/root/.ssh/authorized_keys
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "$PASSWD\n" }
}
expect "*password*" {send "$PASSWD\n"}
expect eof
EOF
done
脚本默认所有机器的密码一致,如果密码不为123456,则需要作为运行脚本时作为参数传递进去。
这里对上面的脚本做一个简单的解释。
-
首先定义了批量处理机器的所有 ip,和定义密码的变量。
-
使用 expect 命令进入所有的机器删除 .ssh 文件夹,并添加 ssh 配置 "StrictHostKeyChecking no",使下次 ssh 登录时不需要确认。然后使用 ssh-keygen 生成一对密钥。
-
将所有机器的 ip 拷贝生成一份 authorized_keys 文件。
-
将生成的 authorized_keys 拷贝到所有机器。
没有用到 ssh-copy-id
,其实它的原理就是将本机器的公钥放在需要免密登录的机器的 authorized_keys 文件中。
脚本执行
结果
可能遇到的问题:
当时我执行脚本后没有报错,且所有的机器都存在 authorized_keys 文件,但是免密登录不成功,也就是说还需要输入密码。
后来用机器查看日志,发现 Authentication refused: bad ownership or modes for directory /root
。
在不能免密登录的机器上执行:
chmod -R 0750 /root
提醒:本文发布于763天前,文中所关联的信息可能已发生改变,请知悉!