Linux_Shell 服务器互通脚本, 第一次通信 自动记入 know_hosts


我们在管理服务器的时候,往往在 /etc/hosts 配置其他机器的ip地址实现机器间互通,通过 ssh 跳转不需要输入其他的信息。


Tips: 如果对于强限制的服务器还需要在iptables 做这几台机器的互信。


iptables 配置示例如下, 这种是做了强限制,只有做了ACCEPT的机器,端口 才能跟当前机器连接:

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
# sshd
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 2222 -j ACCEPT
# SiteMonitor
-A INPUT -s 192.168.3.13/32 -j ACCEPT
-A INPUT -s 192.168.3.14/32 -j ACCEPT
-A INPUT -s 192.168.3.18/32 -j ACCEPT
-A INPUT -s 192.168.3.19/32 -j ACCEPT
-A INPUT -s 192.168.3.55/32 -j ACCEPT
-A INPUT -s 192.168.3.61/32 -j ACCEPT
-A INPUT -s 192.168.3.62/32 -j ACCEPT
-A INPUT -s 192.168.3.110/32 -j ACCEPT
-A INPUT -s 192.168.3.123/32 -j ACCEPT
-A INPUT -s 192.168.3.133/32 -j ACCEPT
-A INPUT -s 192.168.3.134/32 -j ACCEPT
-A INPUT -s 192.168.3.138/32 -j ACCEPT
-A INPUT -s 192.168.3.140/32 -j ACCEPT
-A INPUT -s 192.168.3.141/32 -j ACCEPT
-A INPUT -s 192.168.3.160/32 -j ACCEPT
-A INPUT -s 192.168.3.161/32 -j ACCEPT
-A INPUT -s 192.168.3.162/32 -j ACCEPT
-A INPUT -s 192.168.3.163/32 -j ACCEPT

# mz office ip
#-A INPUT -s 156.100.229.2 -j ACCEPT
-A INPUT -s 133.100.229.2 -j ACCEPT
# mz zabbix server
-A INPUT -s 233.122.89.174/32 -p tcp -m state --state NEW -m tcp --dport 10050 -j ACCEPT
#
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT


在 /etc/hosts 做互信  (相互间信任通信 )

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.3.13  d13 d13.mzhen.cn D13.mzhen.cn
192.168.3.14  d14 d14.mzhen.cn D14.mzhen.cn
192.168.3.18  slave7.druid.hadoop d18 d18.mzhen.cn D18.mzhen.cn 2985.mzhen.cn
192.168.3.19  d19 d19.mzhen.cn D19.mzhen.cn
192.168.3.55  d55 d55.mzhen.cn D55.mzhen.cn
192.168.3.61  slave3.druid.hadoop d61 d61.mzhen.cn D61.mzhen.cn 
192.168.3.62  slave4.druid.hadoop d62 d62.mzhen.cn D62.mzhen.cn 
192.168.3.110 d110 d110.mzhen.cn D110.mzhen.cn
192.168.3.123 d123 d123.mzhen.cn D123.mzhen.cn
192.168.3.133 d133 d133.mzhen.cn D133.mzhen.cn
192.168.3.134 d134 d134.mzhen.cn D134.mzhen.cn
192.168.3.138 master.druid.hadoop d138 d138.mzhen.cn D138.mzhen.cn 
192.168.3.140 slave1.druid.hadoop d140 d140.mzhen.cn D140.mzhen.cn 
192.168.3.141 slave2.druid.hadoop d141 d141.mzhen.cn D141.mzhen.cn 
192.168.3.160 slave6.druid.hadoop d160 d160.mzhen.cn D160.mzhen.cn 
192.168.3.161 slave5.druid.hadoop d161 d161.mzhen.cn D161.mzhen.cn 
192.168.3.162 d162 d162.mzhen.cn D162.mzhen.cn
192.168.3.163 d163 d163.mzhen.cn D163.mzhen.cn


但是在第一次建立连接的时候需要 进行身份认证, 加入 /etc/hosts


情况一:


如果 这么多的机器都 手动连接是个很麻烦的过程,为此我特地写了个脚本 , 主要通过 expect 自动完成第一次互信输入 yes 的操作

脚本如下 : (注意此种情况只适用于known_hosts 不存在的情况下)

expect 若没有安装, 需要通过yum 安装


ssh_main.sh : 去各个机器上执行 ssh_list.sh

ssh_list.sh : 从当前机器上 对指定机器的双向互信测试连接


ssh_main.sh

#!/bin/bash

host=(18 19 13 14 55 61 62 110 123 133 134 138 140 141 160 161 162 163)
hadoopList=(140 141 61 62 161 160 18)


for x in ${host[@]}
do
	scp ssh_list.sh root@192.168.3.$x:~/
done 



for x in ${host[@]}
do
	ssh d$x /bin/bash << MID
	cd ~/
	/bin/bash ssh_list.sh $x
MID
done


#清理执行脚本
for  x in ${host[@]}
do
ssh d$x /bin/bash << END 
		cd ~/
		if [ $x -ne 14 ] 
		then	
			rm -f ssh_list.sh
			echo "rm -f ssh_list.sh at d$x"
		fi
		exit
END
done



 ssh_list.sh

#!/bin/bash

host=(18 19 13 14 55 61 62 110 123 133 134 138 140 141 160 161 162 163)

old=$1

for x in ${host[@]}
do
/usr/bin/expect  << EOF
      set timeout 1
      spawn ssh d$x.mzhen.cn
      expect "(yes/no)?" { 
    	 send "yes\r"
      } 
      expect "(yes/no)?" {
    	 send "yes\r"
      }

      spawn ssh d$old.mzhen.cn 
      expect "(yes/no)?" { 
    	 send "yes\r"
      } 
      expect "(yes/no)?" {
    	 send "yes\r"
      } 
      expect eof
EOF

done


但是这么操作遇到了意向不到的问题,主要是因为与之前的 know_hosts 冲突了:

但是know_hosts 还不能直接删除,由于还有一些和另一些机器的互信状态需要保存。


所以引出了情况二


情况二

与之前互通的认证key存在冲突,我采取的方案

know_hosts 不能直接删除, 只能从 know_hosts 对应条目进行删除,  只保存一条记录。

将对应的脚本传到各台机器上,输入yes 手工完成, 但是脚本完成输入 ssh 连接机器的流程

由此引出了以下几个脚本

ssh_test_send.sh   负责把连接的脚本传入到各个需要执行命令的机器上

ssh_test_rm.sh       负责执行完任务后自动清理各台机器上遗留的ssh_test_send.sh 

ssh_test_bak1.sh   /etc/hosts 需要特殊处理的机器进行 ssh 连接

ssh_test_bak2.sh  /etc/hosts  可以采取通用处理的机器进行 ssh 连接



ssh_test_send.sh

#!/bin/bash

ip=(18 19 13 14 55 61 62 110 123 133 134 138 140 141 160 161 162 163)

for x in ${ip[@]}
do
	scp ssh_test_bak1.sh ssh_test_bak2.sh d$x:~/
done



ssh_test_rm.sh 

#!/bin/bash

ip=(18 19 13 14 55 61 62 110 123 133 134 138 140 141 160 161 162 163)

for x in ${ip[@]}
do
ssh d$x /bin/bash << EOF
		echo "done!" 
		cd ~/
		rm -f ssh_test_bak1.sh ssh_test_bak2.sh
		exit
EOF
done



ssh_test_bak1.sh  

#!/bin/bash

hadoopList=(140 141 61 62 161 160 18)
hadoopMaster=138
extra="2985.mzhen.cn"

echo "ssh slaveX.druid.hadoop"
echo "--------------"
for (( i=0 ; i<${#hadoopList[@]}; i++ ))
do
	echo ${hadoopList[i]}
	ssh "slave$(($i+1)).druid.hadoop" /bin/bash << EOF
		hostname
		exit
EOF
done 
echo "--------------"

echo "ssh master.druid.hadoop"
echo "-------------"
ssh master.druid.hadoop /bin/bash << SD
	hostname
	exit
SD
echo "-------------"

echo "ssh 2985.mzhen.cn"
echo "-------------"
ssh "2985.mzhen.cn" /bin/bash << SX
	hostname
	exit
SX
echo "-------------"



ssh_test_bak2.sh  

#!/bin/bash

ip=(18 19 13 14 55 61 62 110 123 133 134 138 140 141 160 161 162 163)


echo "ssh dx"
echo "--------------"
for x in ${ip[@]}
do
ssh d$x /bin/bash << EOF
	hostname
	exit
EOF
done
echo "--------------"


echo "ssh dx.mzhen.cn"
echo "--------------"
for y in ${ip[@]}
do
ssh d$y.mzhen.cn /bin/bash << EOF
        hostname
        exit
EOF
done
echo "--------------"


echo "ssh Dx.mzhen.cn"
echo "--------------"
for z in ${ip[@]}
do
ssh D$z.mzhen.cn /bin/bash << EOF
        hostname
        exit
EOF
done
echo "--------------"


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值