使用ssh-copy-id批量拷貝公鑰到遠程主機

使用ssh-copy-id批量拷貝公鑰到遠程主機

update @2019/03/19node

  • 移除全部節點默認相互免密登陸功能

背景

以前使用vmware vCenter管理虛擬機, 咱們在作模版時就將控制節點的公鑰放入了虛擬機模版, 所以使用模版新建的虛擬機均可以直接從控制節點免密鑰登陸的, 可以有效解決虛擬機密碼被改了沒法登陸的問題, 以及經過控制節點來作一些軟件安裝/配置修改和服務監控等。shell

最近在OpenStack上新建了100多臺機器, 這些機器一開始並無內置公鑰, 機器開機後要對他們進行初始化, 如修改yum源和主機名, 經常使用工具安裝, SELINUX/iptables禁用, vim設置優化等, 逐一手動修改工做量無疑會大到讓人奔潰, 在不熟悉Ansible的狀況下, 咱們要作的第一步就是將控制節點的公鑰拷貝到遠程虛擬機上, 可是一個個的執行ssh-copy-id 還要輸入不一樣的隨機密碼,也會累死人的。有沒有比較好的shell腳原本實現呢? 摸索了一下, 找到了對應的解決辦法;vim

詳細步驟

1. 須要的工具

sshpass (添加epel源進行安裝)
ssh-copy-id (centos已內置)

2. 新建文件保存主機名/IP/密碼信息

將須要添加公鑰的主機名/IP地址/主機密碼存入到文本文件hostsname.txt 中,格式以下:centos

node01 10.0.0.21 9nDvik7w
node02 10.0.0.22 5fDviDEw
node03 10.0.0.23 FiPp2UpR
node04 10.0.0.24 KeMbe57z
node05 10.0.0.25 FElJ3ArM

3. 使用sshpass實現ssh自動填寫密碼

使用sshpass將密碼傳遞給ssh-copy-id , 使得當須要輸入密碼時, 可以自動讀取變量進行輸入並完成驗證.
本腳本在原來的基礎上添加了一些附加功能, 包括:bash

  • 拷貝本機公鑰到遠程主機
  • 免密鑰登陸到遠程主機設置主機名
  • 在遠程主機生成ssh-key並將公鑰收集到本機
  • 將主機列表添加到hosts文件並拷貝到遠程主機
  • 設置sshd配置文件UseDNS爲no以加快ssh鏈接並拷貝到遠程主機
  • 設置ssh配置文件禁用遠程scp/ssh時詢問並拷貝到遠程主機
  • 彙總全部主機的公鑰並拷貝到全部節點,使得能互相免密登陸(慎用)

腳本copy_ssh_id.sh以下:session

vim copy_ssh_id.sh 

#!/bin/bash
rm -f ./authorized_keys; touch ./authorized_keys
sed -i '/StrictHostKeyChecking/s/^#//; /StrictHostKeyChecking/s/ask/no/' /etc/ssh/ssh_config
sed -i "/#UseDNS/ s/^#//; /UseDNS/ s/yes/no/" /etc/ssh/sshd_config

cat hostsname.txt | while read host ip pwd; do
  sshpass -p $pwd ssh-copy-id -f $ip 2>/dev/null
  ssh -nq $ip "hostnamectl set-hostname $host"
  ssh -nq $ip "echo -e 'y\n' | ssh-keygen -q -f ~/.ssh/id_rsa -t rsa -N ''"
  echo "===== Copy id_rsa.pub of $ip ====="
  scp $ip:/root/.ssh/id_rsa.pub ./$host-id_rsa.pub
  #cat ./$host-id_rsa.pub >> ./authorized_keys
  echo $ip $host >> /etc/hosts
done

cat ~/.ssh/id_rsa.pub >> ./authorized_keys
cat hostsname.txt | while read host ip pwd; do
  rm -f ./$host-id_rsa.pub
  echo "===== Copy authorized_keys to $ip ====="
  scp ./authorized_keys $ip:/root/.ssh/
  scp /etc/hosts $ip:/etc/
  scp /etc/ssh/ssh_config $ip:/etc/ssh/ssh_config
  scp /etc/ssh/sshd_config $ip:/etc/ssh/sshd_config
  ssh -nq $ip "systemctl restart sshd"
done

4. 驗證是否拷貝成功

在CRT會話窗口中, 勾選使用Send command to all sessions選項同時將命令cat .ssh/authorized_keys 發送到ssh主機:ssh

[root@gateway01 ~]# cat .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA7S0v0xsVaYB1B0NL/tzX0BkFttUWfBqYCL/LokSe3B6fgajY+b5FhxkCElGGvZKdGRQGqL07hcLcDHE3eWldOqv1jJ/rNO/omlogvs0dZwr9vI8QCmb/98ZHKTLrd3iDVMX4WiSTJ1mgxHIKFz6I1K0whcMObioyr8dFHWWTMSx2LDshGEsFQBcNLfAdjMaYE9OOpo05jOxiMaPq8M1oE4sdcJ3yKZHGO1ZzibapUuHiSma2pMbdR2OGC8SSIs5lRif1UUqg9rdsuztaikKpHSVYMrMZuIWW3jaAuJf8wZtnyaKU6y/GDm3H/SD0LWtRE7FUEBIT64aQjptcoOxoYw== root@deploy

5. 驗證是否可以免密鑰登陸

[root@deploy ~]# ssh ngx-gw01
Warning: Permanently added 'ngx-gw01' (RSA) to the list of known hosts.
Last login: Sun Mar 19 22:54:08 2017 from 172.20.224.202
[root@ngx-gw01 ~]#

6. 注意

第5步中沒有提示要求輸入yes 進行確認,是我以前就在ssh_config文件中設置了不進行確認:工具

vim /etc/ssh/ssh_config
#Add at the end of file
  StrictHostKeyChecking no

或者優化

sed -i '/StrictHostKeyChecking/s/^#//; /StrictHostKeyChecking/s/ask/no/' /etc/ssh/ssh_config
相關文章
相關標籤/搜索