Windows 和 Linux 环境下免密使用 SSH
SSH 免密登录使用公钥认证,与远程账号有没有密码无关。
- 远程账号有密码:首次通过密码安装公钥;
- 远程账号无密码:通过控制台或管理员账号安装公钥;
- 私钥有密码:使用
ssh-agent,解锁一次后无需重复输入。
# 生成密钥
Windows PowerShell 和 Linux 均可使用:
ssh-keygen -t ed25519 -C "设备名称"
-t:指定密钥类型;-C:添加密钥备注,注意是大写C。
直接回车使用默认保存位置。私钥密码留空,可完全免输入;设置密码则更加安全。
生成的文件:
~/.ssh/id_ed25519 私钥,不可泄露
~/.ssh/id_ed25519.pub 公钥,放到服务器
# 远程账号有密码
# Linux
ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 22 user@server_ip
-i:指定公钥文件;-p:指定 SSH 端口。
首次输入远程账号密码,之后直接登录:
ssh -p 22 user@server_ip
# Windows PowerShell
Get-Content "$env:USERPROFILE\.ssh\id_ed25519.pub" | ssh -p 22 user@server_ip "umask 077; mkdir -p ~/.ssh; cat >> ~/.ssh/authorized_keys"
$env:USERPROFILE:Windows 当前用户目录;|:把公钥内容传给后面的 SSH 命令;mkdir -p:目录不存在时创建,存在时不报错;>>:追加内容,不覆盖已有公钥。
输入一次远程账号密码,之后直接登录:
ssh -p 22 user@server_ip
# 远程账号无密码
无法通过密码完成首次登录时,使用服务器控制台或管理员账号配置。
先在客户端查看并复制公钥。
Linux:
cat ~/.ssh/id_ed25519.pub
Windows PowerShell:
Get-Content "$env:USERPROFILE\.ssh\id_ed25519.pub"
在服务器目标账号下执行:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo '粘贴公钥内容' >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
如果由 root 配置,还需修改文件所有者:
chown -R user:user /home/user/.ssh
-R 表示递归修改目录内所有文件。账号还需要具备正常的登录 Shell,且未过期。
# 私钥有密码
私钥密码与远程账号密码不是一回事。使用 ssh-agent 可以避免每次连接都输入私钥密码。
# Linux
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
ssh-agent -s:输出当前 Shell 可用的代理配置;ssh-add:将私钥加入代理。
# Windows PowerShell
管理员 PowerShell 执行一次:
Set-Service -Name ssh-agent -StartupType Automatic
Start-Service ssh-agent
-Name:指定服务名称;-StartupType Automatic:设置为开机自动启动。
普通 PowerShell 添加私钥:
ssh-add "$env:USERPROFILE\.ssh\id_ed25519"
# 配置连接别名
Linux 配置文件为 ~/.ssh/config,Windows 为 %USERPROFILE%\.ssh\config。
Host my-server
HostName 192.168.1.100
User user
Port 22
IdentityFile ~/.ssh/id_ed25519
以后直接连接:
ssh my-server
# 登录失败排查
ssh -vvv -i ~/.ssh/id_ed25519 user@server_ip
-vvv:输出详细连接日志;-i:指定私钥文件。
重点检查服务器上的权限和所有者:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
如果提示 Enter passphrase for key,表示公钥登录已经生效,只是私钥设置了密码,使用前面的 ssh-agent 即可。
上次更新: 2026/08/18, 01:07:41