Shell脚本一键配置ssh免密登陆
Posted 电子取证及可信应用协创中心
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell脚本一键配置ssh免密登陆相关的知识,希望对你有一定的参考价值。
好久没正二八经的更新了,因为小编最近在忙着学习蛤,学业繁重!今天忙里偷闲,给大家写一篇如何配置主机之间进行ssh免密通信的文章。
至于为什么要配置主机之间免密登陆,大家可能也有这种感觉,就是如果管理多个服务器的时候,如果几个服务器之间需要相互通信,比如scp,一会连这个需要输入密码,一会连那个输入密码,输入来,输入去,一会头都搞大了!!!或者有时还有切换终端,好麻烦啊!!
正巧,最近小编手里有几个同学的阿里云试用的服务器,一会搞搞数据库啊,一会相互之间传个文件,这总不能总是输入密码吧?于是,还是简单一点,干脆配置一个ssh免密算了!!!初步查阅资料,发现配置的过程还有点繁琐,为了方便,写个脚本,一键自动化执行吧!
好了,废话不多说,直接上脚本!
配置环境
linux主机host1:10.0.0.137
linux主机host2:10.0.0.138
配置脚本共有5个,各个脚本功能如下
1、1_ssh_copy_host2.sh,复制host1生成的密钥信息到host2
#!/usr/bin/expect
#这个脚本的交互是用到expect,所以解释器是expect,需要安装
#yum -y install expect
#本脚本是 将host1上设置的公钥上传到 host2结点
set host1h "10.0.0.137"
set host2h "10.0.0.138"
set host1 "root"
set host2 "root"
set password1 "1234"
set password2 "1234"
set timeout -1
#首先ssh-copy上传密钥到 host2
spawn ssh-copy-id -o "StrictHostKeyChecking no" $host2@$host2h
expect "*password:"
send "$password2\r"
expect eof
2、2_scp_set_hosts_host2.sh,scp设置host2的文件到host2,并且设置host2的hostname及hosts信息
#!/usr/bin/expect
#本脚本 首先登陆host2 上,在host2去抓取host1上的文件传到host2 上,并执行命令,设置hosts等
set host1h "10.0.0.137"
set host2h "10.0.0.138"
set host1 "root"
set host2 "root"
set password1 "1234"
set password2 "1234"
set timeout -1
#需要ssh 到host2,不可以直接连接到host2,因为host2的hosts等没有设置
spawn ssh $host2@$host2h
expect "#*"
## 因为是在host2上 去抓取host1上的文件到host2上来,所以需要回答密码
send "scp $host1@$host1h:/root/host2_set_hosts.sh /root/host2_set_hosts.sh\r"
#需要回到yes/no
expect "(yes/no)?"
send "yes\r"
expect "*password:"
send "$password1\r"
# 接收指令,执行下面命令,修改host等,修改完毕后hostname变为host2,可以在host1上直接ssh host2
expect "#*"
send "chmod 777 /root/host2_set_hosts.sh\r"
expect "#*"
send "/usr/bin/bash /root/host2_set_hosts.sh\r"
expect "#*"
send "exit;\r"
expect eof
exit
3、3_first_ssh_host2.sh、设置完成后第一ssh连接host2,回答yes/no?
#!/usr/bin/expect
# 本脚本的功能是 实现第一次登陆host2 的验证 ,以后可以直接密码登陆
set timeout -1
# 下面进行重新连接,第二个配置文件已经配置完成 ssh host2,进行免密后第一次登陆,本次输入验证信息后,不需要再次输入
spawn ssh host2
#初次需要输入密码
expect "(yes/no)?"
send "yes\r"
expect "#*"
send "exit\r"
expect eof
4、host2_set_hosts.sh,用来设置host2的hostname及hosts信息
#修改hostname
hostnamectl set-hostname host2
#配置主机名
sed -i '$a NETWORKING=yes' /etc/sysconfig/network
sed -i '$a HOSTNAME=host2' /etc/sysconfig/network
#配置hosts文件
sed -i 's/^/#/' /etc/hosts
sed -i '$a10.0.0.137 host1' /etc/hosts
sed -i '$a10.0.0.138 host2 ' /etc/hosts
5、start.sh、配置host1的hosts信息,hostname信息,以及生成ssh公钥和私钥信息等
#!/usr/bin/bash
# 交互工具需要使用expect来交互完成 先安装
yum -y install expect
#设置host1的hostname
hostnamectl set-hostname host1
#配置主机名
sed -i '$a NETWORKING=yes' /etc/sysconfig/network
sed -i '$a HOSTNAME=host1' /etc/sysconfig/network
#配置hosts文件
sed -i 's/^/#/' /etc/hosts
sed -i '$a10.0.0.137 host1' /etc/hosts
sed -i '$a10.0.0.138 host2 ' /etc/hosts
#首先在host1上生成密钥
ssh-keygen -t dsa -P '' -f /root/.ssh/id_dsa
#调用expect解释器执行的shell去进行配置ssh免密交互
chmod 777 /root/1_ssh_copy_host2.sh
chmod 777 /root/2_scp_set_hosts_host2.sh
chmod 777 /root/3_first_ssh_host2.sh
/root/1_ssh_copy_host2.sh
/root/2_scp_set_hosts_host2.sh
/root/3_first_ssh_host2.sh
Now!Run the start.sh
让我们来看看结果???不再需要输入密码,成功!
以上是关于Shell脚本一键配置ssh免密登陆的主要内容,如果未能解决你的问题,请参考以下文章
Shell脚本自动化配置SSH免密登录和取消SSH免密配置脚本