ssh免密登录

一、前言

ssh或者vscode每次登录服务器都要输入密码,繁琐还记不住。免密是个好东西

二、ssh登录

  1. 本地打开terminal,执行以下命令

    cd ~/.ssh 
    ssh-keygen -t rsa -C "[email protected]" -f ~/.ssh/server
    

    "[email protected]"只是作为server.pub公钥中的标记使用,便于识别;~/.ssh/server中的server可以修改成需要的名字,便于识别。

  2. 此时,~/.ssh路径下新增了server(私钥)和server.pub(公钥)两个文件。

    # 将公钥传送到远端服务器
    ssh-copy-id -i ~/.ssh/server.pub -p 3322 account@服务器IP  # 如果有端口需要指定,默认端口可以去掉-p参数
    

    也可以手动复制~/.ssh/server文件的内容到远端服务器的~/.ssh/authorized_keys

    mkdir -p ~/.ssh
    touch ~/.ssh/authorized_keys
    chmod 600 ~/.ssh/authorized_keys
    vim ~/.ssh/authorized_keys
    # 粘贴公钥内容
    :wq  # 保存退出
    
  3. 编写 config 文件,在 ~/.ssh 目录下新建文件 config ,写入刚刚的密钥配置信息

    Host 4090
        HostName 127.0.0.1
        User jerry
        Port 3322
        IdentityFile ~/.ssh/server
        IdentitiesOnly yes
        
    # 参数说明
    - `HostName`: 服务器的ip
    - `User`: 用户名
    - `Port`: 端口
    - `IdentityFile`: 指定用于身份验证的私钥文件,server为秘钥文件名
    - `IdentitiesOnly`: 仅使用 IdentityFile 指定的私钥文件进行身份验证,有时可以省略
    

设置完成后,执行 ssh 4090 效果等同于 ssh -p 3322 用户名@服务器的ip,即可实现免密登录。vscode现在也可以免密登录喽!!

三、常见问题

  1. 如果密钥配置后,用 Host 连接仍需输入密码,很可能是文件权限错误,ssh 对文件的权限敏感,解决方法如下:

    • 登录服务器,进入.ssh目录
    • 输入 ls -la 查看文件权限
    • 确保权限为:
      • .ssh的权限为rwx --- ---
      • authorized_keys 的权限为 rw- --- ---
    • 如果权限错误,修改一下
      • chmod 700 ~/.ssh
      • chmod 600 authorized_keys
  2. 使用ssh-copy-id 上传公钥时,提示 Too many authentication failures

    • 错误原因:sh 连接会逐个验证本地公钥,验证次数过多将导致失败。
    • 解决方法:指定参数 -o PubkeyAuthentication=no 不使用公钥验证
    ssh-copy-id -i ~/.ssh/auc -p 3322 -o PubkeyAuthentication=no 用户名@服务器的ip
    
  3. 还有可能服务器上的签名算法和本地不一致,日志如下:

    # 报错log
    debug1: Next authentication method: publickey
    debug1: Offering public key: /home/jerry/.ssh/server RSA SHA256:zA6VA3/u47p/u3zLHSPbqyfbIiCjRPQdma3KPPuMJa8 explicit agent
    debug1: send_pubkey_test: no mutual signature algorithm
    debug1: Next authentication method: password
    
    # 正常log
    debug1: SSH2_MSG_SERVICE_ACCEPT received
    debug1: Authentications that can continue: publickey,password
    debug1: Next authentication method: publickey
    debug1: Offering public key: /home/jerry/.ssh/server RSA SHA256:zA6VA3/u47p/u3zLHSPbqyfbIiCjRPQdma3KPPuMJa8 explicit agent
    debug1: Server accepts key: /home/jerry/.ssh/server RSA SHA256:zA6VA3/u47p/u3zLHSPbqyfbIiCjRPQdma3KPPuMJa8 explicit agent
    Authenticated to 172.23.148.25 ([172.23.148.25]:22) using "publickey".
    debug1: channel 0: new [client-session]
    debug1: Requesting [email protected]
    debug1: Entering interactive session.
    debug1: pledge: filesystem
    debug1: client_input_global_request: rtype [email protected] want_reply 0
    debug1: client_input_hostkeys: searching /home/jerry/.ssh/known_hosts for 172.23.148.25 / (none)
    debug1: client_input_hostkeys: searching /home/jerry/.ssh/known_hosts2 for 172.23.148.25 / (none)
    debug1: client_input_hostkeys: hostkeys file /home/jerry/.ssh/known_hosts2 does not exist
    debug1: Sending environment.
    

    解决办法:在服务器上使用相同的签名算法,只需要将~/.ssh下的config文件中加一行跟本地一致的加密算法即可:

    Host 4090
        HostName 127.0.0.1
        User jerry
        Port 3322
        IdentityFile ~/.ssh/server
        IdentitiesOnly yes
        PubkeyAcceptedKeyTypes ssh-rsa
    

四、小结

笔者最近遇到的问题比较多,做了一些小结。希望能帮助到各位小伙伴们。

你可能感兴趣的:(ssh,运维)