被SSH免密码登录失败的问题困扰了很久,也查了很多资料,一直没能解决,最近研究ssh-copy-id脚本源码,发现了根源所在。说深究实在有点夸大,鄙人能力低微,在此就标题问题致歉。

######环境: >客户端:Mac >服务器:CentOS6.8—-ip:192.168.0.32


先说一般的使用方式


1. 拷贝 ~/.ssh 目录里的公钥到服务器

scp ~/.ssh/id_rsa.pub root@192.168.0.32:~

2. 登录服务器,创建 ~/.ssh/authorized_keys 文件

ssh root@192.168.0.32
mkdir .ssh
cat id_rsa.pub >> ~/.ssh/authorized_keys
rm -rf id_rsa.pub
logout


正常情况,按理说就可以免密码登录了,但试了下,还是需要密码


根据搜索引擎得来的资料,总结原因在于SELinux限制,解决办法如下: > ** 服务器端设置 .sshauthorized_keys 权限 ** > chmod 700 .ssh/ chmod 600 authorized_keys


我试了下,问题还是没有解决,不能免密码登录


研究 ssh-copy-id 源码,发现了这段代码: > ssh_copy_id > Assuming that the remote host treats ~/.ssh/authorized_keys as one might expect populate_new_ids 0 [ “$DRY_RUN” ] || printf ‘%s\n’ “$NEW_IDS” | ssh “$@” “ umask 077 ; mkdir -p .ssh && cat >> .ssh/authorized_keys || exit 1 ; if type restorecon >/dev/null 2>&1 ; then restorecon -F .ssh .ssh/authorized_keys ; fi”
|| exit 1 ADDED=$(printf ‘%s\n’ “$NEW_IDS” | wc -l)

前面两行不用看,第三行用 “ssh” 命令登录服务器,执行后面引号里的命令。 引号第一行设置默认权限 “umask 077”,即创建文件的初始权限为700; 引号第二行创建 .ssh 复制密钥到 “./ssh/authorized_keys” 引号第三行是判断是否存在 restorecon 命令,存在则执行 “restorecon -F .ssh .ssh/authorized_keys“ 我用”man“查了下 restorecon 命令:

restorecon - restore file(s) default SELinux security contexts.

看到这里,我的大家应该知道原因了,还是SELinux限制,解决办法: > ** 服务器端用 restorecon 恢复文件SELinux安全 ** > restorecon -F .ssh .ssh/authorized_keys


注意:设置权限的命令也是要执行的(” # chmod 700 .ssh/ && chmod 600 authorized_keys“)