Linux

    xiaoxiao2021-04-01  37

    我们在管理服务器的时候,往往在 /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 "--------------"

    转载请注明原文地址: https://ju.6miu.com/read-665675.html

    最新回复(0)