SSH免密登录介绍
SSH免密登录允许您在不输入密码的情况下连接到远程服务器,这对于使用SSH-Tunnel工具非常重要。免密登录通过公钥/私钥对实现,本指南将详细介绍如何在不同操作系统上配置SSH免密登录。
无论您使用什么操作系统,SSH免密登录的基本流程都是相似的:
- 在本地生成SSH密钥对(如果还没有)
- 将公钥传输到远程服务器
- 在远程服务器上将公钥添加到授权文件
- 测试免密登录
请选择适合您操作系统的指南部分:
Linux系统SSH免密登录配置
1 生成SSH密钥对
在终端中执行以下命令生成SSH密钥对:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
执行后,系统会提示:
Enter file in which to save the key (/home/username/.ssh/id_rsa):
直接按回车键接受默认路径,然后系统会询问是否设置密码:
Enter passphrase (empty for no passphrase): Enter same passphrase again:
您可以直接按回车键跳过密码设置(实现真正的免密登录),或者设置一个密码以提高安全性。
2 将公钥复制到远程服务器
Linux提供了简便的ssh-copy-id工具:
ssh-copy-id username@remote_host
首次连接时会提示确认服务器指纹,输入yes确认,然后输入远程服务器密码。
ssh-copy-id不可用,可以手动复制:
cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && touch ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys && cat >> ~/.ssh/authorized_keys"
3 设置正确的权限
确保SSH目录和文件权限正确:
chmod 700 ~/.ssh chmod 600 ~/.ssh/id_rsa chmod 644 ~/.ssh/id_rsa.pub chmod 600 ~/.ssh/authorized_keys # 在远程服务器上执行
4 测试免密登录
尝试SSH登录到远程服务器:
ssh username@remote_host
如果配置正确,您应该能够无需输入密码直接登录。
macOS系统SSH免密登录配置
1 生成SSH密钥对
macOS的Terminal终端操作与Linux类似:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
按回车键接受默认存储位置(通常是~/.ssh/id_rsa)。
系统会询问是否设置密码,您可以直接按回车键跳过(实现免密登录)或设置密码。
2 将公钥复制到远程服务器
macOS也支持ssh-copy-id命令,但如果没有安装,可以通过Homebrew安装:
brew install ssh-copy-id
然后执行:
ssh-copy-id username@remote_host
或者使用手动方法:
cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && touch ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys && cat >> ~/.ssh/authorized_keys"
3 添加到SSH代理(可选)
为了避免每次重启后都需要重新输入密钥密码(如果设置了),可以添加到SSH代理:
ssh-add -K ~/.ssh/id_rsa
在macOS Sierra 10.12.2及更高版本,您可能需要在~/.ssh/config文件中添加以下配置:
Host * AddKeysToAgent yes UseKeychain yes IdentityFile ~/.ssh/id_rsa
4 测试连接
ssh username@remote_host
应该可以直接登录,无需输入密码。
Windows系统SSH免密登录配置
1 使用OpenSSH(Windows 10/11内置)
较新的Windows版本已内置OpenSSH,可以通过PowerShell生成密钥:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
默认会将密钥保存在C:\\Users\\username\\.ssh\\id_rsa。
2 复制公钥到远程服务器
Windows 10/11可以使用以下PowerShell命令:
type $env:USERPROFILE\.ssh\id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
或者手动复制公钥文件内容:
- 打开公钥文件:
notepad $env:USERPROFILE\.ssh\id_rsa.pub - 复制文件内容
- 登录到远程服务器
- 编辑
~/.ssh/authorized_keys文件,将公钥内容粘贴到新行
3 使用适当的配置文件(可选)
创建或编辑%USERPROFILE%\.ssh\config文件:
Host remote_nickname
HostName remote_host_ip_or_domain
User username
IdentityFile ~/.ssh/id_rsa
有了这个配置,您可以简单地使用ssh remote_nickname进行连接。
4 使用SSH代理(可选)
在PowerShell中执行:
# 启动SSH代理服务 Get-Service ssh-agent | Set-Service -StartupType Automatic Start-Service ssh-agent # 添加私钥 ssh-add $env:USERPROFILE\.ssh\id_rsa
使用Git Bash(替代方案)
如果您安装了Git for Windows,可以使用Git Bash执行与Linux/macOS相同的命令,操作流程与Linux部分完全一致。
5 测试连接
ssh username@remote_host
如果配置正确,您应该能够直接登录而无需输入密码。
验证配置
无论您使用哪种操作系统,验证SSH免密登录是否成功的方法是一致的:
ssh -v username@remote_host
添加-v参数会显示详细的调试信息,帮助您识别可能的问题。
成功的免密登录应该直接让您进入远程系统的命令行,无需输入密码。
使用SSH-Tunnel验证
成功配置SSH免密登录后,您可以使用以下命令启动SSH-Tunnel:
./ssh-tunnel -s username@remote_host
如果隧道能成功建立,说明SSH免密登录配置正确。
常见问题排查
如果SSH仍然要求输入密码,请检查:
- 公钥是否正确添加到远程服务器的
~/.ssh/authorized_keys文件 - 远程服务器上
~/.ssh目录和authorized_keys文件的权限:chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
- 远程服务器的SSH配置是否允许公钥认证:
# 检查 /etc/ssh/sshd_config 文件 PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys
如果出现Permission denied (publickey)错误:
- 确认您使用的是正确的用户名和主机名
- 检查SSH服务器日志(通常在
/var/log/auth.log或/var/log/secure) - 验证您的私钥路径是否正确
- 使用
ssh -i ~/.ssh/id_rsa username@remote_host明确指定私钥
如果遇到密钥类型或格式问题:
- 某些老旧系统可能不支持较新的密钥类型,尝试使用RSA:
ssh-keygen -t rsa -b 2048 -C "your_email@example.com"
- 确保公钥格式正确,应该是单行文本,以
ssh-rsa或其他算法标识符开头 - Windows用户注意:文本文件可能有不同的行尾格式,确保公钥文件没有额外的回车或换行