1. 连接服务器
最常用的登录方式和连接参数。
基本登录
ssh username@example.com
指定端口、密钥或首次只执行一条命令
ssh -p 2222 username@example.com ssh -i ~/.ssh/id_ed25519 username@example.com ssh username@example.com 'uptime && df -h'
| 参数 | 用途 |
|---|---|
-p PORT | 指定服务端端口,默认是 22 |
-i FILE | 指定私钥文件 |
-v / -vv / -vvv | 输出逐级增加的调试信息 |
-4 / -6 | 强制使用 IPv4 / IPv6 |
-C | 启用压缩,慢速网络可能有帮助 |
首次连接会显示服务器指纹。应通过可信渠道核对指纹后再输入
yes,不要盲目接受。2. 配置密钥登录
生成推荐的 Ed25519 密钥
ssh-keygen -t ed25519 -a 100 -C "your_name@example.com"
建议为私钥设置强密码。默认生成 ~/.ssh/id_ed25519(私钥)和 ~/.ssh/id_ed25519.pub(公钥)。
把公钥安装到服务器
ssh-copy-id -i ~/.ssh/id_ed25519.pub username@example.com
若系统没有 ssh-copy-id,可在服务器上将公钥追加至 ~/.ssh/authorized_keys,并设置权限:
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
使用 ssh-agent 管理密钥
eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_ed25519 ssh-add -l
私钥绝不能上传、发给他人或写进网页/代码仓库。需要分享的是以
.pub 结尾的公钥。3. SSH 客户端配置
编辑 ~/.ssh/config,把复杂参数保存成简短别名:
Host myserver
HostName example.com
User username
Port 2222
IdentityFile ~/.ssh/id_ed25519
ServerAliveInterval 60
ServerAliveCountMax 3以后只需运行:
ssh myserver
通过跳板机访问内网主机
ssh -J jumpuser@jump.example.com user@10.0.0.8
也可在配置中为目标主机加入 ProxyJump jumpuser@jump.example.com。
4. 文件与目录操作
登录服务器后常用的 Linux 文件管理命令。
查看和切换目录
pwd # 显示当前目录 ls -lah # 列出文件,含隐藏文件、权限和易读大小 cd /var/www # 进入指定目录 cd .. # 返回上一级目录 cd ~ # 返回当前用户的主目录 du -sh ./directory # 查看某个目录的总大小 df -h # 查看各文件系统的磁盘空间
创建文件和目录
touch example.txt # 创建空文件或更新时间戳 mkdir new-directory # 创建目录 mkdir -p a/b/c # 连同缺失的父目录一起创建 printf '%s\n' 'hello' > example.txt # 覆盖写入一行 printf '%s\n' 'world' >> example.txt # 追加写入一行
> 会清空目标文件后再写入,>> 才是追加。操作重要文件前应先备份。查看文件内容
cat example.txt # 输出整个文件,适合较短内容 less example.txt # 分页查看;按 q 退出,/关键词 搜索 head -n 20 example.txt # 查看前 20 行 tail -n 20 example.txt # 查看最后 20 行 tail -f app.log # 持续查看日志新增内容
复制、移动和重命名
cp source.txt backup.txt # 复制文件 cp -a source-dir backup-dir # 保留属性地递归复制目录 cp -i source.txt destination/ # 覆盖前询问 mv old-name.txt new-name.txt # 重命名 mv -i example.txt /target/path/ # 移动,覆盖前询问
删除文件和目录
rm -i example.txt # 删除文件,操作前询问 rmdir empty-directory # 只删除空目录 rm -rI old-directory # 递归删除目录,批量操作前确认
rm 通常无法撤销。使用 rm -r 前先用 pwd 和 ls 核对位置;避免对变量、通配符或宽泛目录直接执行递归删除。查找文件与内容
find . -type f -name '*.log' # 按名称查找文件 find /var/log -type f -mtime -7 # 查找 7 天内修改的文件 grep -n 'error' app.log # 显示匹配内容和行号 grep -Rni --exclude-dir=.git 'keyword' . # 在目录中递归搜索
权限和所有者
chmod 600 private-key # 仅所有者可读写 chmod 644 document.txt # 所有者读写,其他人只读 chmod 755 script.sh # 所有者读写执行,其他人读和执行 chown user:group file.txt # 更改所有者和用户组(可能需要 sudo)
压缩与解压
tar -czf archive.tar.gz directory/ # 创建 gzip 压缩包 tar -tzf archive.tar.gz # 先查看压缩包内容 tar -xzf archive.tar.gz # 解压到当前目录 tar -xzf archive.tar.gz -C /target # 解压到指定目录 zip -r archive.zip directory/ # 创建 zip(需安装 zip) unzip archive.zip -d target/ # 解压 zip 到指定目录
解压不熟悉的压缩包前,先列出其内容并确认路径,避免覆盖现有文件或发生路径穿越风险。
5. 文件传输
SCP 上传与下载
# 上传本地文件 scp report.pdf username@example.com:/remote/path/ # 下载远程文件 scp username@example.com:/remote/path/report.pdf ./ # 递归上传目录,并指定 SSH 端口 scp -P 2222 -r ./website username@example.com:/var/www/
注意:
ssh 指定端口用小写 -p,而传统 scp 用大写 -P。SFTP 交互式传输
sftp -P 2222 username@example.com # 常用子命令:ls、lls、cd、lcd、get、put、mkdir、exit
Rsync 增量同步
rsync -avz --progress -e "ssh -p 2222" ./local-dir/ username@example.com:/remote-dir/
rsync --delete 会删除目标端多余文件;使用前先加 --dry-run 预演并确认范围。6. 端口转发与代理
本地转发:从本机访问远端网络服务
# 打开 localhost:8080,即访问服务器侧的 127.0.0.1:80 ssh -N -L 8080:127.0.0.1:80 username@example.com
远程转发:把本地服务暴露给远端
# 服务器的 9000 端口转发至本机的 3000 端口 ssh -N -R 9000:127.0.0.1:3000 username@example.com
动态转发:建立 SOCKS5 代理
ssh -N -D 1080 username@example.com
-N 不执行远程命令-f 转入后台-L 本地转发-R 远程转发-D 动态代理
转发可能绕过网络访问边界,只应在获得授权的网络和服务器上使用。
7. 会话与效率技巧
| 操作 | 用法 |
|---|---|
| 安全退出 | exit 或按 Ctrl+D |
| 卡死时强制断开 | 先按回车,再依次按 ~. |
| 列出 SSH 转义命令 | 先按回车,再依次按 ~? |
| 保持长期任务 | 远端使用 tmux 或 screen,避免网络断开导致任务终止 |
连接复用(放入 ~/.ssh/config)
Host *
ControlMaster auto
ControlPath ~/.ssh/control-%C
ControlPersist 10m8. 服务端常用管理命令
# 查看服务状态(发行版的服务名可能是 ssh 或 sshd) sudo systemctl status sshd # 修改配置前先备份 sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak # 检查配置语法,成功时通常无输出 sudo sshd -t # 平滑重载配置 sudo systemctl reload sshd
查看近期日志
sudo journalctl -u sshd --since "30 minutes ago" # Debian/Ubuntu 也常见:sudo tail -f /var/log/auth.log # RHEL/CentOS 也常见:sudo tail -f /var/log/secure
修改端口、认证或防火墙前,务必保留一个已登录的管理会话;另开窗口验证新连接成功后再退出旧会话,防止把自己锁在服务器外。
9. 常见故障排查
| 现象 | 检查方向 |
|---|---|
Connection timed out | IP/域名、网络路由、安全组、防火墙、端口是否开放 |
Connection refused | SSH 服务是否启动、端口是否正确、服务是否监听对应地址 |
Permission denied | 用户名、私钥、公钥安装、文件权限、服务端认证设置 |
| 主机指纹变更警告 | 先确认服务器是否重装或密钥轮换,警惕中间人攻击;确认后再清理旧记录 |
| 连接经常断开 | 配置 ServerAliveInterval,检查网络/NAT 超时和服务端日志 |
输出详细握手过程
ssh -vvv username@example.com
确认后删除某主机的旧指纹
ssh-keygen -R example.com ssh-keygen -R '[example.com]:2222'
10. 安全建议
- 优先使用密钥认证,并为私钥设置密码;妥善备份私钥。
- 日常使用普通账号,需要管理操作时再通过
sudo提权。 - 确认密钥登录可靠后,可按组织策略关闭密码登录和直接 root 登录。
- 限制允许登录的用户与来源 IP,结合防火墙、安全组和登录审计。
- 及时更新 OpenSSH;敏感环境考虑多因素认证和集中式访问管理。
- 不要在命令历史、脚本、聊天记录或代码仓库中保存明文密码。
命令示例默认面向 Linux/macOS 的 OpenSSH。Windows 10/11 的 PowerShell 通常也可使用内置
ssh、scp 和 sftp,但路径写法有所不同。