閱讀1025 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

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

[TOC]

背景

之前使用vmware vCenter管理虛擬機, 我們在做模版時就將控製節點的公鑰放入了虛擬機模版, 因此使用模版新建的虛擬機都可以直接從控製節點免密鑰登錄的, 能夠有效解決虛擬機密碼被改了無法登錄的問題, 以及通過控製節點來做一些軟件安裝/配置修改和服務監控等。

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

詳細步驟

1. 需要的工具

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

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

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

tcloud-web01 172.20.68.40 9nDvik7w
operation01  172.20.68.37 5fDviDEw
ngx-gw01     172.20.68.36 FiPp2UpR
gateway01    172.20.68.35 KeMbe57z
vehicle01    172.20.68.34 FElJ3ArM

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

使用sshpass將密碼傳遞給ssh-copy-id , 使得當需要輸入密碼時, 能夠自動讀取變量進行輸入並完成驗證:
腳本cat copy_ssh_id.sh如下:

#!/usr/bin/env bash
cat hostsname.txt | while read hostname ipaddr passwd
do
sshpass -p $passwd ssh-copy-id $ipaddr
done

也可以使用單條命令:

cat hostsname.txt | while read hostname ipaddr passwd; do sshpass -p $passwd ssh-copy-id $ipaddr; done

4. 驗證是否拷貝成功

在CRT會話窗口中, 勾選使用Send command to all sessions選項同時將命令cat .ssh/authorized_keys發送到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

最後更新:2017-05-09 14:02:05

  上一篇:go 大中華地區(含港澳台)空氣質量接口參加阿裏雲API as a Service 大賽?
  下一篇:go Infrastructure as Code――Kubernetes一鍵編排實踐