SSH 就像一把钥匙,但倒霉的是,你永远不知道它开的是服务器的大门,还是你那台忘了密码的旧电脑。
一、远程连接基础命令
标准登录
bash
ssh user@host
示例:ssh root@192.168.1.100
指定端口登录
bash
ssh -p 端口 user@host
示例:ssh -p 2222 deploy@example.com
使用指定私钥登录
bash
ssh -i 私钥文件 user@host
示例:ssh -i ~/.ssh/id_ed25519 root@server
执行单条命令后退出
bash
ssh user@host 'command'
示例:ssh root@server 'ls -la /var/log'
退出远程会话
bash
exit
或按 Ctrl + D
二、密钥管理与认证
生成 ED25519 密钥对(现代推荐,安全性高且速度快)
bash
ssh-keygen -t ed25519
一路回车,默认生成在 ~/.ssh/id_ed25519
生成 RSA 密钥对(兼容性更好)
bash
ssh-keygen -t rsa -b 4096
示例:ssh-keygen -t rsa -b 4096 -C "email@example.com"
推送公钥到远程服务器(实现免密登录)
bash
ssh-copy-id user@host
示例:ssh-copy-id root@192.168.1.100
将私钥加载到 ssh-agent 缓存
bash
ssh-add ~/.ssh/私钥名
示例:ssh-add ~/.ssh/id_ed25519
列出已缓存的密钥
bash
ssh-add -l
清除 known_hosts 中的主机记录(主机密钥变更时使用)
bash
ssh-keygen -R host
示例:ssh-keygen -R 192.168.1.100
测试 GitHub SSH 连接
bash
ssh -T git@github.com
成功时返回:Hi username! You've successfully authenticated...
三、端口转发(隧道)
本地端口转发:将远程主机的端口映射到本地,访问本地端口即访问远程服务
bash
ssh -L 本地端口:目标主机:目标端口 user@跳板机
示例:ssh -L 8080:localhost:80 root@server
效果:访问本机 8080 端口即访问 server 的 80 端口
远程端口转发:将本地服务暴露到远程主机的指定端口
bash
ssh -R 远程端口:本地主机:本地端口 user@远程主机
示例:ssh -R 9090:localhost:3000 root@server
效果:他人访问 server 的 9090 端口即访问本地的 3000 端口
动态端口转发(SOCKS5 代理)
bash
ssh -D 本地端口 user@host
示例:ssh -D 1080 root@server
效果:本地 1080 端口变成 SOCKS5 代理,流量经远程主机转发
纯隧道模式(不执行远程命令)
bash
ssh -N -L 8080:host:80 user@host
示例:ssh -N -L 8080:internal:80 root@server
后台运行隧道
bash
ssh -f -N -L 8080:localhost:80 user@host
允许其他主机访问本地转发端口(默认只绑定 127.0.0.1)
bash
ssh -g -L 8080:localhost:80 user@host
四、调试与排错
输出连接调试信息
bash
ssh -v user@host
-v 详细,-vv 更详细,-vvv 最详细
示例:ssh -vvv root@192.168.1.100
设置连接超时时间
bash
ssh -o ConnectTimeout=秒数 user@host
示例:ssh -o ConnectTimeout=10 root@server
跳过主机密钥确认(仅测试环境,生产有安全风险)
bash
ssh -o StrictHostKeyChecking=no user@host
示例:ssh -o StrictHostKeyChecking=no root@192.168.1.100
指定非默认配置文件
bash
ssh -F 配置文件 user@host
示例:ssh -F /tmp/ssh_config root@server
五、客户端配置文件 ~/.ssh/config
通过配置文件可以为不同主机设置别名、端口、用户名、私钥等参数,大幅简化命令。
配置文件示例:
bash
Host prod
HostName 192.168.1.100
User deploy
Port 2222
IdentityFile ~/.ssh/id_ed25519
Host dev
HostName dev.example.com
User admin
ProxyJump jump-server
配置完成后,直接执行 ssh prod 即可,无需输入完整参数。
六、常用场景速查
首次登录新服务器
bash
ssh root@host
输入密码完成首次登录
配置免密登录流程
bash
ssh-keygen
ssh-copy-id user@host
登录非标准端口服务器
bash
ssh -p 2222 user@host
临时测试远程 Web 服务
bash
ssh -L 8080:localhost:80 user@host
之后在本地浏览器访问 localhost:8080
将本地服务临时暴露给同事
bash
ssh -R 9090:localhost:3000 user@host
同事访问你的服务器 9090 端口即可
连接失败排查
bash
ssh -vvv user@host
查看详细连接日志定位问题
在远程服务器执行一条命令
bash
ssh user@host 'df -h'
七、注意事项
-
私钥权限 :私钥文件权限必须设为
600或400,否则 SSH 会拒绝使用bashchmod 600 ~/.ssh/id_ed25519 -
连接缓慢 :若连接过程卡顿,可能是服务端开启了 DNS 反向解析。可在服务端
/etc/ssh/sshd_config中设置UseDNS no并重启 sshd。 -
端口安全:建议将默认的 22 端口修改为高位端口,减少被暴力破解的风险。
-
配置文件区分 :
- 客户端配置文件位于
~/.ssh/config - 服务端配置文件位于
/etc/ssh/sshd_config - 修改服务端配置后需执行
systemctl restart sshd生效
- 客户端配置文件位于
-
转发安全 :使用
-g参数允许其他主机访问转发端口时需谨慎,确保网络安全策略允许。