ssh简介
2023/11/14大约 3 分钟
简介
SSH 的全称为 Secure Shell 即安全外壳协议,是一种加密的网络传输协议,用来在不安全的网络里安全地操作另一台主机:ssh root@192.168.1.100 远程登录服务器敲命令、git clone git@github.com:xxx/xxx.git 推拉代码、scp 跨机器传文件,底层都是它。早期的 Telnet、FTP 全程明文,账号密码可被直接窃听,SSH 将整个会话加密。
SSH 登录有两种凭证:账号密码与密钥对。公钥放到目标主机后,登录免输密码、不怕暴力破解。
远程操作主机
# 登录远程主机,账号密码或密钥认证
ssh root@192.168.1.100
# 远端 sshd 不在 22 端口时指定端口
ssh -p 2222 root@192.168.1.100
# 登录后执行单条命令,执行完自动退出,常用于脚本
ssh root@192.168.1.100 "df -h"
# 复制文件到远端;两个路径调换即为从远端拉取
scp ./app.jar root@192.168.1.100:/opt/app/
# 目录同步、增量传输,大量文件时比 scp 高效
rsync -avz ./dist/ root@192.168.1.100:/opt/app/dist/端口映射
远端服务只监听 localhost(数据库、管理后台等)、不便对外暴露时,用本地端口映射直连:
# 本机 2222 端口经远端转发到 127.0.0.1:10120,登录会话期间有效
ssh -L 2222:127.0.0.1:10120 root@192.168.1.100
# 只做转发、不进入 shell,-f 挂到后台
ssh -fNL 2222:127.0.0.1:10120 root@192.168.1.100格式为 -L [本地端口]:[目标地址]:[目标端口],映射建立后访问本机 localhost:2222 即等同于访问远端的 10120 端口。目标地址在远端解析:写 127.0.0.1 指远端自己,写其他 IP 则由远端代为转发。反向映射 -R 方向相反,把本机服务暴露给远端,场景较少。
生成密钥对
ssh-keygen 是 OpenSSH 自带的密钥对生成工具;ssh-keygen 指令不带 -t 时默认密钥类型随版本而不同,通过如下指令确认本机版本:
ssh -Vssh-keygen 常用参数
# 生成新密钥对;默认类型随版本变化(9.5 起为 ed25519,更早为 RSA),建议始终显式指定 -t
ssh-keygen
# 指定密钥类型;推荐 ed25519,兼容旧系统用 rsa,dsa 已过时不建议使用
ssh-keygen -t <type>
# 指定生成的密钥文件名称
ssh-keygen -f <filename>
# 指定密钥位数;仅对 rsa、ecdsa 有效,rsa 常用 4096 位,3072 位也安全
ssh-keygen -b <bits>
# 指定私钥口令;传空串 "" 免口令,仅建议用于自动化脚本
ssh-keygen -N "<passphrase>"
# 添加注释,惯例写邮箱,仅作标识用途
ssh-keygen -C "your_email@example.com"
# 指定密钥文件格式;PEM、PKCS8 作用于私钥,RFC4716 作用于公钥,兼容老工具时才需指定
ssh-keygen -m <format>推荐:ed25519
# 交互式生成,私钥口令在提示时输入,适合个人使用
ssh-keygen -t ed25519 -f ~/.ssh/custom_id_ed25519 -C "986379932@qq.com"
# 免交互生成;-N "" 表示私钥不设口令,仅建议用于自动化脚本
ssh-keygen -t ed25519 -f ~/.ssh/custom_id_ed25519 -N "" -C "986379932@qq.com"提示
生成 .pub 结尾的是公钥,可放心上传;不带后缀的同名文件是私钥,只留在本机、妥善保管。
兼容旧系统:rsa
# 目标服务器、网络设备或旧版客户端不支持 ed25519 时改用 rsa
ssh-keygen -t rsa -b 4096 -f ~/.ssh/custom_id_rsa -C "986379932@qq.com"生成之后
# 查看公钥内容,复制到 GitHub 等平台的 SSH Keys 设置中
cat ~/.ssh/custom_id_ed25519.pub
# 查看密钥指纹,用于核对密钥身份
ssh-keygen -lf ~/.ssh/custom_id_ed25519.pub
# 将公钥一键追加到远程主机的 ~/.ssh/authorized_keys
ssh-copy-id -i ~/.ssh/custom_id_ed25519.pub user@remote-host
# 部分环境(如 Windows 原生 OpenSSH)没有 ssh-copy-id,可手动追加
cat ~/.ssh/custom_id_ed25519.pub | ssh user@remote-host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
# 报 Permissions 0644 ... are too open 时,恢复私钥默认权限
chmod 600 ~/.ssh/custom_id_ed25519多密钥配置
# 连接时临时指定私钥
ssh -i ~/.ssh/custom_id_ed25519 user@remote-host私钥较多时,在 ~/.ssh/config 中为不同主机绑定各自私钥:
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/github_ed25519
IdentitiesOnly yes
Host my-server
HostName example.com
User root
IdentityFile ~/.ssh/server_ed25519
IdentitiesOnly yes配置后直接 ssh my-server 即可,无需每次指定 -i。

