阿飞
阿飞
发布于 2025-07-31 / 8 阅读
0
0

ssh免密连接


如何使用SSH免密连接Linux服务器

在日常的Linux服务器管理中,我们经常需要通过SSH(Secure Shell)连接到远程服务器。每次都输入密码会非常繁琐,特别是当你管理多台服务器时。SSH免密连接可以大大提高工作效率。本文将由浅入深地介绍如何实现SSH免密连接。

SSH免密连接的原理

SSH免密连接的核心是密钥对认证(Public Key Authentication)。这涉及到一对密钥:

  • 公钥(Public Key):可以公开,存储在你要连接的Linux服务器上。

  • 私钥(Private Key):必须保密,存储在你本地的电脑上。

当尝试连接时,客户端会向服务器发送一个连接请求。服务器会使用存储的公钥对客户端发送的挑战进行加密。客户端使用其私钥解密这个挑战并返回给服务器。如果解密成功,服务器就会认为这是合法的连接请求,允许免密登录。


第一步:检查或生成SSH密钥对

首先,你需要确认你的本地电脑上是否已经存在SSH密钥对。

1. 检查现有密钥

打开你的终端(Linux/macOS)或Git Bash/WSL(Windows),输入以下命令:

ls -al ~/.ssh

如果输出中包含 id_rsaid_rsa.pub(或 id_dsaid_ecdsaid_ed25519 等及其对应的 .pub 文件),则说明你已经有了SSH密钥对。其中:

  • id_rsa 是你的私钥

  • id_rsa.pub 是你的公钥

2. 生成新的SSH密钥对

如果上述命令没有找到密钥对,或者你想生成一个新的密钥对,可以使用以下命令:

ssh-keygen -t rsa -b 4096 -C "你的邮箱或备注"
  • -t rsa:指定密钥类型为RSA。RSA是一种常用的非对称加密算法。

  • -b 4096:指定密钥长度为4096位。更高的位数提供更高的安全性。

  • -C "你的邮箱或备注":为你的密钥添加一个注释,这有助于你识别密钥。

执行命令后,系统会提示你选择密钥存储路径和设置密码短语(passphrase)

  • Enter file in which to save the key (~/.ssh/id_rsa): 直接按回车键使用默认路径即可。

  • Enter passphrase (empty for no passphrase): 建议设置一个密码短语。即使私钥泄露,没有密码短语也无法使用。如果你追求极致的便利,也可以选择留空(不安全)。

生成成功后,你会在 ~/.ssh/ 目录下看到 id_rsa(私钥)和 id_rsa.pub(公钥)两个文件。


第二步:上传公钥到Linux服务器

这一步是将你本地生成的**公钥(id_rsa.pub)**上传到你想要免密登录的Linux服务器上。

1. 使用 ssh-copy-id 命令(推荐)

这是最简单也是最推荐的方法。ssh-copy-id 命令会自动将你的公钥添加到远程服务器的 ~/.ssh/authorized_keys 文件中。

ssh-copy-id username@remote_host
  • username:你在远程Linux服务器上的用户名。

  • remote_host:远程Linux服务器的IP地址或域名。

执行命令后,它会提示你输入远程服务器的密码。成功输入密码后,你的公钥就会被添加到服务器上。

2. 手动上传公钥(如果 ssh-copy-id 不可用)

如果你的系统没有 ssh-copy-id 命令,或者由于网络限制无法直接使用,你可以手动上传公钥。

a. 复制公钥内容

cat ~/.ssh/id_rsa.pub

复制输出的所有内容。

b. 登录远程服务器

ssh username@remote_host

c. 创建 .ssh 目录(如果不存在)

mkdir -p ~/.ssh
chmod 700 ~/.ssh
  • mkdir -p ~/.ssh:创建 .ssh 目录。

  • chmod 700 ~/.ssh:设置 .ssh 目录的权限为700(只有所有者可读、写、执行),这是SSH安全要求。

d. 将公钥内容追加到 authorized_keys 文件

echo "在这里粘贴你复制的公钥内容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
  • echo "..." >> ~/.ssh/authorized_keys:将你的公钥内容追加到 authorized_keys 文件末尾。请确保是追加(>>),而不是覆盖(>,以免覆盖服务器上已有的公钥。

  • chmod 600 ~/.ssh/authorized_keys:设置 authorized_keys 文件的权限为600(只有所有者可读写),这也是SSH安全要求。


第三步:测试免密连接

完成上述步骤后,你现在应该可以免密连接到你的Linux服务器了。

ssh username@remote_host

如果一切顺利,你将无需输入密码直接登录到远程服务器。


进阶:SSH配置文件优化(~/.ssh/config)

当你需要管理多台服务器时,每次都输入完整的用户名和IP地址会比较麻烦。通过编辑本地的SSH配置文件 ~/.ssh/config 可以大大简化连接过程。

创建一个或编辑 ~/.ssh/config 文件:

touch ~/.ssh/config
chmod 600 ~/.ssh/config # 设置权限
nano ~/.ssh/config # 或者使用你喜欢的编辑器

添加以下内容:

Host my_server_name
    HostName your_remote_ip_or_domain
    User your_username
    Port 22 # 如果SSH端口不是默认的22,请在这里指定
    IdentityFile ~/.ssh/id_rsa # 如果你的私钥不是默认的id_rsa,请指定
    # 可以添加更多选项,例如:
    # ForwardAgent yes # 启用SSH代理转发
  • Host my_server_name:为你这台服务器设置一个别名。你可以随意命名。

  • HostName:远程服务器的实际IP地址或域名。

  • User:登录远程服务器的用户名。

  • Port:SSH端口,默认为22。如果你的服务器使用了非标准端口,请在此处指定。

  • IdentityFile:指定用于此连接的私钥文件路径。

保存并关闭文件。现在,你可以使用更简洁的命令连接到服务器:

ssh my_server_name

常见问题与排查

  • Permissions too open:如果连接失败并提示“Permissions too open”之类的错误,通常是 ~/.ssh 目录或其下的密钥文件权限设置不正确。请确保:

    • ~/.ssh 目录权限为 700 (drwx------)。

    • 私钥文件(如 id_rsa)权限为 600 (-rw-------)。

    • 公钥文件(如 id_rsa.pub)和 authorized_keys 文件权限为 600 (-rw-------)。

  • 输入密码但无法免密

    • 检查服务器上的 ~/.ssh/authorized_keys 文件中是否包含你的公钥,并且内容完整无误。

    • 确认远程服务器上的SSH服务是否允许公钥认证。编辑 /etc/ssh/sshd_config 文件,确保 PubkeyAuthentication yesAuthorizedKeysFile .ssh/authorized_keys 被启用且没有被注释。修改后需要重启SSH服务:sudo systemctl restart sshdsudo service sshd restart

    • 确保远程服务器上 .ssh 目录和 authorized_keys 文件的权限设置正确。

  • 多个密钥对:如果你有多个私钥,连接时可能需要指定使用的私钥,例如:ssh -i ~/.ssh/my_other_key username@remote_host,或者在 ~/.ssh/config 中指定 IdentityFile

  • 私钥密码短语:如果你的私钥设置了密码短语,第一次使用该私钥进行连接时需要输入密码短语。之后可以通过 ssh-agent 来缓存密码短语,避免每次都输入。


通过遵循以上步骤,你就可以轻松实现SSH免密连接,大大提升你的工作效率。记住,私钥的安全性至关重要,务必妥善保管。


评论