非対話的に ~/.ssh/known_hosts を更新
基本は上記記事の
host="target-hostname" ssh-keygen -R $host ssh-keyscan -H $host >> ~/.ssh/known_hosts
でいいのだけど、(少なくとも自分の環境だと) ssh-keyscan で出力した1列目のカラムにホスト名しか出力されず、 その後別のレコード(行)としてIPアドレスが登録されてしまっていた。
hoge ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDCq9UXuh/sKm4oBs68VlfAvjc/WaV83brTXkoTOLr2339XxMMzDQQ1FX9jP4Ie6rUfoDrvA1t8N2peJoG2e1rvPgtNAabZxz92l0V1+XYYhEf6Y0n0ZzXv4pf+YWfcj6VtXcQaoaxQ0PieREStTluOShAdA8MpJBAX1qId2qCZ2koF5mPIT/vUF8kEzzXBZjYGx1nOEBL6Caqg1P4wJS4trwOGfeV3/eIZW0jwrujOxYD0NHvaV/UJBZsPceYZthD8G4xAFqkCm5ZXJCiHyEtVRicbB2VddsPpKh6J8+FPMCINHrFmAVGLNG1H424STVacXPqdpdnvdRnYFf6dhjYH (hogeのIPアドレス) ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDCq9UXuh/sKm4oBs68VlfAvjc/WaV83brTXkoTOLr2339XxMMzDQQ1FX9jP4Ie6rUfoDrvA1t8N2peJoG2e1rvPgtNAabZxz92l0V1+XYYhEf6Y0n0ZzXv4pf+YWfcj6VtXcQaoaxQ0PieREStTluOShAdA8MpJBAX1qId2qCZ2koF5mPIT/vUF8kEzzXBZjYGx1nOEBL6Caqg1P4wJS4trwOGfeV3/eIZW0jwrujOxYD0NHvaV/UJBZsPceYZthD8G4xAFqkCm5ZXJCiHyEtVRicbB2VddsPpKh6J8+FPMCINHrFmAVGLNG1H424STVacXPqdpdnvdRnYFf6dhjYH
これによって新たにプロンプトが出て待たされることはない(ホスト名が既に登録されている場合はプロンプトは出ないらしい。「Warning: Permanently added the ECDSA host key for IP address 'xxx.xxx.xxx.xxx' to the list of known hosts.
」といつものメッセージが表示されて静かに追加される)。
ただ、いくつも行ができるのは何となく気持ち悪い。
そこで以下のように、
- ホスト名から引いたIPアドレスを付加させるようにした
- 自分の環境だと対象が CNAME で実 IP は複数ある可能性があったので、
$HOST_LIST
に全てのホスト名を列挙することにした *1 - ついでに
~/.ssh/known_hosts
がない時にssh-keygen -R
でエラーが出ないようガードするようにした - ちなみにパースできなくなるので
ssh-keyscan
に-H
はつけていない…(外した)
HOST_LIST='hostA hostB hostC' HOST=... get_ip_list() { local host for host in $HOST $HOST_LIST; do getent hosts $host || true done | awk '$0=$1' | sort -u | paste -d , -s } [ -f ~/.ssh/known_hosts ] && ssh-keygen -R $HOST ssh-keyscan $HOST | awk -v "hosts=$(get_ip_list)" '$1 = $1 "," hosts' \ >>~/.ssh/known_hosts
これにより冒頭でも示した ~/.ssh/known_hosts
に追加される行は以下のようになる。
Before
hoge ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDCq9UXuh/sKm4oBs68VlfAvjc/WaV83brTXkoTOLr2339XxMMzDQQ1FX9jP4Ie6rUfoDrvA1t8N2peJoG2e1rvPgtNAabZxz92l0V1+XYYhEf6Y0n0ZzXv4pf+YWfcj6VtXcQaoaxQ0PieREStTluOShAdA8MpJBAX1qId2qCZ2koF5mPIT/vUF8kEzzXBZjYGx1nOEBL6Caqg1P4wJS4trwOGfeV3/eIZW0jwrujOxYD0NHvaV/UJBZsPceYZthD8G4xAFqkCm5ZXJCiHyEtVRicbB2VddsPpKh6J8+FPMCINHrFmAVGLNG1H424STVacXPqdpdnvdRnYFf6dhjYH (hogeのIPアドレス) ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDCq9UXuh/sKm4oBs68VlfAvjc/WaV83brTXkoTOLr2339XxMMzDQQ1FX9jP4Ie6rUfoDrvA1t8N2peJoG2e1rvPgtNAabZxz92l0V1+XYYhEf6Y0n0ZzXv4pf+YWfcj6VtXcQaoaxQ0PieREStTluOShAdA8MpJBAX1qId2qCZ2koF5mPIT/vUF8kEzzXBZjYGx1nOEBL6Caqg1P4wJS4trwOGfeV3/eIZW0jwrujOxYD0NHvaV/UJBZsPceYZthD8G4xAFqkCm5ZXJCiHyEtVRicbB2VddsPpKh6J8+FPMCINHrFmAVGLNG1H424STVacXPqdpdnvdRnYFf6dhjYH
After
hoge,(hogeのIPアドレスのリスト) ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDCq9UXuh/sKm4oBs68VlfAvjc/WaV83brTXkoTOLr2339XxMMzDQQ1FX9jP4Ie6rUfoDrvA1t8N2peJoG2e1rvPgtNAabZxz92l0V1+XYYhEf6Y0n0ZzXv4pf+YWfcj6VtXcQaoaxQ0PieREStTluOShAdA8MpJBAX1qId2qCZ2koF5mPIT/vUF8kEzzXBZjYGx1nOEBL6Caqg1P4wJS4trwOGfeV3/eIZW0jwrujOxYD0NHvaV/UJBZsPceYZthD8G4xAFqkCm5ZXJCiHyEtVRicbB2VddsPpKh6J8+FPMCINHrFmAVGLNG1H424STVacXPqdpdnvdRnYFf6dhjYH