w3ctech

Linux SSH使用密钥实现免密码登录

1.在客户端生成公钥和私钥

ssh-keygen -f ~/.ssh/filename

filename替换为实际的文件名。该命令会提示输入口令用来加密私钥,如果不需要直接回车。

命令执行完毕后会在~/.ssh/下生成两个文件,一个filename,这个是私钥;一个是filename.pub,这个是公钥。

2.将生成的公钥添加到远程SSH服务器

将生成的公钥filename.pub文件,复制到ssh服务器对应用户下的~/.ssh/authorized_keys文件,可以有多种方式。

服务器下的.ssh文件夹通常是隐藏的,可以采用 ll -al的方式显示隐藏文件。

使用ssh-copy-id-for-OSX工具

# 使用brew安装工具
brew install ssh-copy-id 
#将username和hostname替换为你的ssh服务器用户名和IP
ssh-copy-id username@hostname

通用方法

# 将公钥文件复制至ssh服务器
scp ~/.ssh/filename.pub username@hostname:~/
# 使用用户名和密码方式登录至ssh服务器
ssh username@hostname
#若.ssh目录已存在,可省略此步
mkdir .ssh
#将公钥文件id_rsa.pub文件内容追加到authorized_keys文件
cat id_rsa.pub >> .ssh/authorized_keys

3.配置别名,使登录更简单

完成以上步骤后,理论上就可以输入ssh username@hostname直接登录了,但是这样还是需要输入还是有些繁琐,我们可以通过配置别名,使登录更快捷。

在客户端~/.ssh目录下创建config配置文件,如有该文件就不需要新建,直接往里添加内容就好了。

添加文件内容格式如下:

Host        alias #自定义别名
HostName    hostname  #替换为你的ssh服务器ip或domain
Port        port #ssh服务器端口,默认为22
User        user #ssh服务器用户名
IdentityFile   ~/.ssh/filename #第一个步骤生成的公钥文件对应的私钥文件

保存文件退出后,就可以使用别名登录服务器了

ssh alias #alias表示配置的别名

3.配置不生效的解决方案

通常情况下配置完后就应该没有问题,但是我真的又踩到了坑——配置不生效。在网上查找,并多次尝试终于找到了原因。

在我这里访问权限就是罪魁祸首。

在网上搜索到的访问权限,一直认为是.ssh目录或authorized_keys的访问权限,因为我是使用ssh-copy-id工具创建的,理论上权限应该是没有问题的,但我还是跟正常访问的服务器(另一个服务器配置生效)做了对比,果然权限没有问题。

使用ssh -v alias查看ssh上的log,对比两台服务器的差异,发现有一处不一致。

正常的服务器:

debug1: Next authentication method: publickey

出问题的服务器:

debug1: Next authentication method: password

两个的验证方式不同,那么是什么原因导致的呢?就是权限的问题,是home目录的权限问题。

正常的服务器中的home目录的权限是:

drwxr-xr-x

出问题的服务器中home目录的权限是:

drwxrwxr-x

权限不同,虽然觉得好像没有什么相关性,但测试修改试试。

chmod 755 /home

顺利通过,原来是目录的授权出了问题!!

前端圈微信

扫码关注前端圈微信公众号

共收到5条回复

  • 貌似在mac下配置下~/.ssh/config:

    Host *
    ControlPath ~/.ssh/master-%r@%h:%p
    ControlMaster auto
    ControlPersist 10h
    

    就可以在记录session,常见于登录跳板机

    回复此楼
  • 貌似在mac下配置下~/.ssh/config:

    Host *
    ControlPath ~/.ssh/master-%r@%h:%p
    ControlMaster auto
    ControlPersist 10h
    

    就可以在记录session,常见于登录跳板机

    回复此楼
  • 额。刚才提交遇到500了。但发现却提交成了。。。

    回复此楼
  • @前端小武 应该是我上面提交的内容里有关键字,挂了 @裕波

    回复此楼
  • @前端小武 什么呀?

    回复此楼