SSH/SCP自动登陆的三种方法
背景:
开发机是fedora,无法使用xshell等可以保存密码的软件工具,而服务器大概有10来台,都是centos,有些需要通过跳板方式登陆,每次都要输入地址和密码显得很麻烦且费时间,所以查找了一些资料,总结一下,大概有3种方案,特记录下来。当然,自动登陆都是有风险的,所以请酌情使用
方案一:sshpass登陆,明文密码,不安全(需要安装sshpass)
比如说:
ssh jenkins@10.99.0.245,假设密码为yyy,利用sshpass,则可写作:
sshpass -p yyy ssh jenkins@10.99.0.245
对于ssh的第一次登陆,会提示:“Are you sure you want to continue connecting (yes/no)”,这时用sshpass会不好使,解决方法:
- 可以在ssh命令后面加上 -o StrictHostKeyChecking=no来解决。比如说上面的命令,就可以写作sshpass -p yyy ssh jenkins@10.99.0.245 -o StrictHostKeyChecking=no。
- 或者写入配置文件:把 StrictHostKeyChecking no 加到/etc/ssh/ssh_config可以让ssh客户端自动接受新主机的hostkey,不用每次都自己输入yes
方案二:证书登陆,比方案一安全,但证书可以被拷贝,也有风险
1、生成密钥对
ssh-keygen -t rsa
在~/.ssh目录下生成一个私钥id_rsa和一个公钥id_rsa.pub
2、在服务器上创建.ssh目录,权限必须是700
mkdir -m 700 .ssh
3、把公钥拷贝到服务器上的.ssh目录下
scp ~/.ssh/id_rsa.pub jenkins@[服务器ip]:/home/jenkins/.ssh
4、重命名为authorized_keys
mv id_rsa.pub authorized_keys
5、如果已经存在,则追加
cat id_rsa.pub >> authorized_keys
6、修改authorized_keys权限为644
chmod 644 authorized_keys
7、其实3、4、5、6步骤可以合并为一个步骤的,p是指定ssh端口,默认是22
ssh-copy-id -i ~/.ssh/id_rsa.pub -p 22 jenkins@[服务器ip]
大功告成!现在可以直接“ssh [服务器ip]”来登陆了,不需要指定服务器账户
方案三:expect登陆,支持自动跳板登陆,支持自动跨服务器SCP拷贝文件,这是功能最强大的方法,但安全性介于方案一和方案二之间(需要安装expect)
案例1:实现从本机自动登陆到B服务器,再自动登陆到C服务器
1 2 3 4 5 6 7 8 9 10 | #!/usr/bin/expect -f set timeout 30 spawn /usr/bin/ssh jenkins@B expect "password" send "xxx\r" expect "]*" send "/usr/bin/ssh jenkins@C\r" expect "password" send "yyy\r" interact |
案例2:实现从C服务器拷贝文件到本机
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #!/usr/bin/expect -f set timeout 300 set file [lindex $argv 0] spawn /usr/bin/ssh jenkins@C expect "password" send "yyy\r" expect "]*" send "scp jenkins@C:/home/jenkins/$file .\r" expect "password" send "yyy\r" expect "]*" send "exit\r" expect "]*" spawn scp jenkins@B:/home/jenkins/$file . expect "password" send "xxx\r" interact |
expect的代码比较简单,可以参考expect spawn、linux expect 用法小记 | Linux服务器运维日志来理解,有不明白的可以留言讨论
最近评论