SSH 远程连接
SSH 远程管理:密钥登录与免密配置、端口转发与跳板、服务端安全加固要点。
ssh 基本连接
基本写法:连接远程主机
ssh <用户>@<主机>
# 以 root 用户连接到 192.168.1.1
ssh root@192.168.1.1
基本写法:指定端口连接
ssh -p <端口> <用户>@<主机>
# 连接到 2222 端口
ssh -p 2222 root@192.168.1.1
基本写法:指定私钥文件
ssh -i <私钥> <用户>@<主机>
# 使用指定私钥连接
ssh -i ~/.ssh/id_rsa user@192.168.1.1
基本写法:执行远程命令
ssh <用户>@<主机> <命令>
# 在远程主机执行命令
ssh root@192.168.1.1 "df -h"
基本写法:分配伪终端
ssh -t <用户>@<主机> <命令>
# 远程执行需要终端的命令
ssh -t root@192.168.1.1 "top"
ssh 配置文件
基本写法:配置主机别名
`Host <别名>
HostName <主机>
User <用户>
Port <端口>
IdentityFile <私钥>`
# 配置 SSH 主机别名
Host prod
HostName 192.168.1.100
User deploy
Port 22
IdentityFile ~/.ssh/prod_key
基本写法:使用别名连接
ssh <别名>
# 使用配置的别名连接
ssh prod
基本写法:禁用严格主机密钥检查
ssh -o StrictHostKeyChecking=no <用户>@<主机>
# 跳过主机密钥确认
ssh -o StrictHostKeyChecking=no root@192.168.1.1
基本写法:保持连接活跃
ssh -o ServerAliveInterval=<秒数> <用户>@<主机>
# 每 60 秒发送心跳保持连接
ssh -o ServerAliveInterval=60 user@192.168.1.1
ssh-agent 密钥代理
基本写法:启动 ssh-agent
eval $(ssh-agent)
# 启动 ssh-agent
eval $(ssh-agent)
基本写法:添加私钥到 agent
ssh-add <私钥>
# 添加私钥到 agent
ssh-add ~/.ssh/id_rsa
基本写法:添加所有默认私钥
ssh-add
# 添加默认私钥
ssh-add
基本写法:列出已加载的密钥
ssh-add -l
# 列出 agent 中的密钥指纹
ssh-add -l
基本写法:删除密钥
ssh-add -d <私钥>
# 从 agent 中删除密钥
ssh-add -d ~/.ssh/id_rsa
基本写法:删除所有密钥
ssh-add -D
# 清空 agent 中所有密钥
ssh-add -D
ssh 端口转发
基本写法:本地端口转发
ssh -L <本地端口>:<目标主机>:<目标端口> <用户>@<SSH主机>
# 将本地 8080 转发到远程的 80
ssh -L 8080:localhost:80 user@192.168.1.1
基本写法:远程端口转发
ssh -R <远程端口>:<目标主机>:<目标端口> <用户>@<SSH主机>
# 将远程 8080 转发到本地 80
ssh -R 8080:localhost:80 user@192.168.1.1
基本写法:动态端口转发(SOCKS 代理)
ssh -D <本地端口> <用户>@<SSH主机>
# 创建 SOCKS5 代理
ssh -D 1080 user@192.168.1.1
基本写法:后台端口转发
ssh -fNL <本地端口>:<目标>:<端口> <用户>@<主机>
# 后台运行本地端口转发
ssh -fNL 8080:localhost:80 user@192.168.1.1
基本写法:指定绑定地址
ssh -L <地址>:<本地端口>:<目标>:<端口> <用户>@<主机>
# 绑定到所有地址
ssh -L 0.0.0.0:8080:localhost:80 user@192.168.1.1
scp 远程拷贝
基本写法:上传文件到远程
scp <本地文件> <用户>@<主机>:<远程路径>
# 上传文件到远程主机
scp file.txt root@192.168.1.1:/tmp/
基本写法:从远程下载文件
scp <用户>@<主机>:<远程文件> <本地路径>
# 从远程主机下载文件
scp root@192.168.1.1:/var/log/syslog ./
基本写法:递归拷贝目录
scp -r <目录> <用户>@<主机>:<路径>
# 上传整个目录
scp -r ./project root@192.168.1.1:/opt/
基本写法:指定端口
scp -P <端口> <文件> <用户>@<主机>:<路径>
# 指定端口 2222
scp -P 2222 file.txt root@192.168.1.1:/tmp/
基本写法:压缩传输
scp -C <文件> <用户>@<主机>:<路径>
# 启用压缩传输
scp -C bigfile.tar root@192.168.1.1:/tmp/
基本写法:限速传输
scp -l <速率> <文件> <用户>@<主机>:<路径>
# 限制速率为 1000 Kbps
scp -l 1000 file.txt root@192.168.1.1:/tmp/
sftp 安全文件传输
基本写法:连接 SFTP
sftp <用户>@<主机>
# 连接到 SFTP 服务器
sftp user@192.168.1.1
基本写法:上传文件
sftp> put <本地文件> [远程路径]
# 在 sftp 交互模式中上传
sftp> put file.txt /tmp/
基本写法:下载文件
sftp> get <远程文件> [本地路径]
# 在 sftp 交互模式中下载
sftp> get /var/log/syslog ./
基本写法:递归上传目录
sftp> put -r <本地目录>
# 递归上传整个目录
sftp> put -r ./project
基本写法:递归下载目录
sftp> get -r <远程目录>
# 递归下载整个目录
sftp> get -r /var/log
ssh-keygen 密钥生成
基本写法:生成 RSA 密钥
ssh-keygen -t rsa -b <位数>
# 生成 4096 位 RSA 密钥
ssh-keygen -t rsa -b 4096
基本写法:生成 Ed25519 密钥
ssh-keygen -t ed25519
# 生成 Ed25519 密钥(推荐)
ssh-keygen -t ed25519 -C "user@example.com"
基本写法:指定密钥文件名
ssh-keygen -f <文件名>
# 指定密钥文件路径
ssh-keygen -f ~/.ssh/my_key
基本写法:不设置密码
ssh-keygen -t rsa -N ""
# 生成无密码的密钥
ssh-keygen -t rsa -N "" -f ~/.ssh/deploy_key
基本写法:更改密钥密码
ssh-keygen -p -f <私钥>
# 修改密钥的密码
ssh-keygen -p -f ~/.ssh/id_rsa
基本写法:查看密钥指纹
ssh-keygen -l -f <公钥>
# 查看公钥指纹
ssh-keygen -l -f ~/.ssh/id_rsa.pub
ssh-copy-id 部署公钥
基本写法:复制公钥到远程
ssh-copy-id <用户>@<主机>
# 将公钥部署到远程主机
ssh-copy-id user@192.168.1.1
基本写法:指定公钥文件
ssh-copy-id -i <公钥> <用户>@<主机>
# 指定公钥文件部署
ssh-copy-id -i ~/.ssh/my_key.pub user@192.168.1.1
基本写法:指定端口
ssh-copy-id -p <端口> <用户>@<主机>
# 指定端口部署公钥
ssh-copy-id -p 2222 user@192.168.1.1
sshd 服务管理
基本写法:重启 SSH 服务
systemctl restart sshd
# 重启 SSH 服务
systemctl restart sshd
基本写法:查看 SSH 服务状态
systemctl status sshd
# 查看 SSH 服务运行状态
systemctl status sshd
基本写法:测试 sshd 配置
sshd -t
# 测试配置文件语法
sshd -t
基本写法:禁止 root 登录
# 修改 /etc/ssh/sshd_config
# 编辑 sshd_config 配置
sed -i 's/#PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
systemctl restart sshd
基本写法:禁止密码登录
# 修改 /etc/ssh/sshd_config
# 只允许密钥登录
sed -i 's/#PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config
systemctl restart sshd