每次 ssh user@host
登录目标机器都要输密码是件很烦的事,特别是经常访问多台主机的情况。 最近写自动化脚本时碰到要自动做机器间 ssh 验证,碰到一些问题记录下来备忘。
分析
- 通过
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
命令生成本地机器的私钥和公钥:~/.ssh/id_rsa
and~/.ssh/id_rsa.pub
- 授权就是将将本地机器的公钥加入到目标机器的
~/.ssh/authorized_keys
中供验证用 - 本地
~/.ssh/known_hosts
中信任目标机器的公钥指纹
自动做 ssh-key 授权
# copy local ssh-key to remote 对应分析中的第二步
cat ~/.ssh/id_rsa.pub | ssh root@192.168.37.110 "cat >> ~/.ssh/authorized_keys"
# add host to known_hosts 对应分析中的第三步
ssh-keyscan -t rsa "192.168.37.110" >> ~/.ssh/known_hosts
或者这两条命令可以精简为如下一条
brew install ssh-copy-id # just for mac
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.37.110
还有剩下的一个难题是还需要手动输入密码,这个怎么自动化呢?
# just for mac
brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb
sshpass -p "PASSWORD" ssh-copy-id -i ~/.ssh/id_rsa.pub -o StrictHostKeyChecking=no root@192.168.37.110
或者使用 Fabric 等远程执行 run("cmd")
# tips 执行 sudo 不需要手动输入密码
echo "PASSWORD" | sudo -S CMD
用 iterm2 做 terminal 管理
略