admin管理员组

文章数量:1516870

SSH(Secure Shell)是在 Linux 服务器上进行远程操作的核心工具。无论是训练深度学习模型、管理服务器,还是日常开发,SSH 都是必不可少的。本文将全面介绍 SSH 的使用方法,从基础连接到高级技巧。

一、SSH 基础知识

什么是 SSH?

SSH 全称 : S ecure Sh ell(安全外壳协议)

SSH 是一种加密的网络传输协议,用于在不安全的网络中安全地远程登录和执行命令。它替代了不安全的 Telnet 和 rlogin 等协议。

SSH 的特点

  • 加密传输,保证数据安全
  • 支持密码和密钥认证
  • 可以进行端口转发和隧道
  • 默认端口:22

SSH 的工作原理

本地计算机 ----SSH协议----> 远程服务器
   (客户端)    (加密连接)      (SSH服务器)

二、SSH 基本连接

1. 最简单的连接方式

ssh username@hostname

示例

# 连接到服务器
ssh root@192.168.1.100
# 使用域名连接
ssh user@server.example.com

第一次连接时会提示:

The authenticity of host '192.168.1.100' can't be established.
ECDSA key fingerprint is SHA256:xxxxx.
Are you sure you want to continue connecting (yes/no)?

输入 yes 后继续,然后输入密码即可登录。

2. 指定端口连接

如果 SSH 服务不在默认的 22 端口:

ssh -p 端口号 username@hostname

示例

# 连接到 2222 端口
ssh -p 2222 user@192.168.1.100

3. 执行远程命令

不需要登录交互式 shell,直接执行命令:

ssh username@hostname "命令"

示例

# 查看远程服务器磁盘使用
ssh user@server.com "df -h"
# 查看 GPU 状态
ssh user@server.com "nvidia-smi"
# 查看进程
ssh user@server.com "ps aux | grep python"

4. 常用 SSH 选项

ssh [选项] username@hostname
# 常用选项:
-p    # 指定端口
-i    # 指定私钥文件
-v    # 详细模式(调试用)
-X    # 启用 X11 转发(图形界面)
-L    # 本地端口转发
-R    # 远程端口转发
-N    # 不执行远程命令(仅用于端口转发)
-f    # 后台运行

三、SSH 免密登录(重点!)

每次输入密码很麻烦,配置 SSH 密钥可以实现免密登录,这是最重要的技能!

原理

SSH 密钥认证使用非对称加密:

  • 私钥 :保存在本地计算机,绝对不能泄露
  • 公钥 :上传到远程服务器,可以公开

步骤 1:生成 SSH 密钥对

本地计算机 上执行:

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

参数说明

  • -t rsa : 指定密钥类型为 RSA
  • -b 4096 : 密钥长度 4096 位(更安全)
  • -C : 添加注释(通常是邮箱)

执行后会有以下提示:

Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):

直接回车 使用默认路径。

Enter passphrase (empty for no passphrase):

直接回车 表示不设置密码(推荐),或者输入一个密码短语。

生成完成后会显示:

Your identification has been saved in /home/user/.ssh/id_rsa
Your public key has been saved in /home/user/.ssh/id_rsa.pub

步骤 2:查看生成的密钥

# 查看公钥内容
cat ~/.ssh/id_rsa.pub
# 查看私钥(不要泄露!)
cat ~/.ssh/id_rsa

密钥文件位置:

  • 私钥: ~/.ssh/id_rsa
  • 公钥: ~/.ssh/id_rsa.pub

步骤 3:上传公钥到服务器

方法一:使用 ssh-copy-id(最简单!推荐)
ssh-copy-id username@hostname

示例

ssh-copy-id user@192.168.1.100

输入一次密码后,公钥就自动上传到服务器了。

方法二:手动复制(适用于没有 ssh-copy-id 的系统)
# 1. 查看公钥内容
cat ~/.ssh/id_rsa.pub
# 2. 登录到远程服务器
ssh user@server.com
# 3. 在服务器上创建 .ssh 目录(如果不存在)
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# 4. 将公钥内容添加到 authorized_keys
echo "你的公钥内容" >> ~/.ssh/authorized_keys
# 5. 设置正确的权限
chmod 600 ~/.ssh/authorized_keys
方法三:一条命令完成
cat ~/.ssh/id_rsa.pub | ssh user@server.com "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

步骤 4:测试免密登录

ssh username@hostname

如果配置正确,应该可以直接登录,不需要输入密码!

常见问题排查

如果免密登录失败,检查以下几点:

1. 检查服务器端权限
# 在服务器上执行
ls -la ~/.ssh
# 应该看到:
# drwx------  .ssh/              (700)
# -rw-------  authorized_keys    (600)

如果权限不对,修改:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
2. 检查 SSH 配置

服务器的 SSH 配置文件 /etc/ssh/sshd_config 需要启用密钥认证:

# 查看配置
sudo cat /etc/ssh/sshd_config | grep -i pubkey
# 应该有这一行(且没有被注释):
PubkeyAuthentication yes
3. 查看详细错误信息
ssh -v username@hostname

使用 -v 参数可以看到详细的连接过程,帮助排查问题。

四、SSH 配置文件

创建 SSH 配置文件

每次输入完整的用户名和主机名很麻烦,可以创建配置文件简化连接。

本地计算机 创建或编辑 ~/.ssh/config

vim ~/.ssh/config

配置文件示例

# 服务器 1:实验室服务器
Host lab-server
    HostName 192.168.1.100
    User zhangsan
    Port 22
    IdentityFile ~/.ssh/id_rsa
# 服务器 2:云服务器
Host cloud
    HostName server.example.com
    User ubuntu
    Port 2222
    IdentityFile ~/.ssh/id_rsa
# 服务器 3:GPU 训练服务器
Host gpu-server
    HostName 10.0.0.50
    User deeplearning
    Port 22
    IdentityFile ~/.ssh/id_rsa_gpu
    
# 通配符配置:所有以 .company.com 结尾的主机
Host *.company.com
    User employee
    IdentityFile ~/.ssh/id_rsa_company

配置参数说明

参数 说明 示例
Host 别名(自定义) Host myserver
HostName 实际的主机名或 IP HostName 192.168.1.100
User 登录用户名 User root
Port SSH 端口 Port 2222
IdentityFile 私钥文件路径 IdentityFile ~/.ssh/id_rsa
ServerAliveInterval 保持连接(秒) ServerAliveInterval 60
ServerAliveCountMax 最大尝试次数 ServerAliveCountMax 3

使用配置文件连接

配置好后,连接变得非常简单:

# 使用别名连接
ssh lab-server
# 相当于执行:
# ssh -p 22 zhangsan@192.168.1.100 -i ~/.ssh/id_rsa

防止 SSH 连接断开

在配置文件中添加保活设置:

Host *
    ServerAliveInterval 60
    ServerAliveCountMax 3

这会每 60 秒发送一次心跳包,保持连接不断开。

五、SSH 端口转发(高级)

SSH 端口转发可以通过 SSH 隧道安全地访问远程服务,这在访问 Jupyter Notebook、TensorBoard 等 Web 服务时非常有用。

1. 本地端口转发(Local Port Forwarding)

场景 :服务器上运行了 Jupyter Notebook(端口 8888),想在本地浏览器访问。

ssh -L 本地端口:目标主机:目标端口 username@hostname

示例

# 将服务器的 8888 端口映射到本地的 8888 端口
ssh -L 8888:localhost:8888 user@server.com
# 现在可以在本地浏览器访问:

实际应用

# 访问 Jupyter Notebook
ssh -L 8888:localhost:8888 user@gpu-server
# 访问 TensorBoard
ssh -L 6006:localhost:6006 user@gpu-server
# 访问多个服务
ssh -L 8888:localhost:8888 -L 6006:localhost:6006 user@gpu-server

2. 远程端口转发(Remote Port Forwarding)

场景 :本地有一个服务,想让远程服务器访问。

ssh -R 远程端口:本地主机:本地端口 username@hostname

示例

# 让远程服务器的 9000 端口访问本地的 8080 端口
ssh -R 9000:localhost:8080 user@server.com

3. 动态端口转发(SOCKS 代理)

ssh -D 本地端口 username@hostname

示例

# 创建 SOCKS 代理
ssh -D 1080 user@server.com
# 然后配置浏览器使用 localhost:1080 作为 SOCKS5 代理

4. 后台运行端口转发

# -f: 后台运行
# -N: 不执行远程命令
ssh -fN -L 8888:localhost:8888 user@server.com

配置文件中的端口转发

~/.ssh/config 中配置:

Host jupyter-server
    HostName server.com
    User user
    LocalForward 8888 localhost:8888
    LocalForward 6006 localhost:6006

然后只需执行:

ssh jupyter-server

六、SCP 文件传输

SCP(Secure Copy)用于通过 SSH 安全传输文件。

从本地复制到远程

scp 本地文件 username@hostname:远程路径

示例

# 复制单个文件
scp model.pth user@server:/home/user/models/
# 复制整个目录
scp -r data/ user@server:/home/user/datasets/
# 指定端口
scp -P 2222 file.txt user@server:/path/
# 显示进度
scp -v file.txt user@server:/path/

从远程复制到本地

scp username@hostname:远程文件 本地路径

示例

# 下载单个文件
scp user@server:/home/user/result.txt ./
# 下载目录
scp -r user@server:/home/user/logs/ ./logs_backup/
# 下载多个文件
scp user@server:"/path/*.pth" ./models/

在两台远程服务器间传输

scp user1@server1:/path/file user2@server2:/path/

SCP 常用选项

-r    # 递归复制整个目录
-P    # 指定端口(注意是大写 P)
-p    # 保留文件时间和权限
-v    # 显示详细信息
-C    # 启用压缩
-l    # 限制带宽(Kbit/s)

限制带宽示例

# 限制为 5000 Kbit/s (约 5 Mbps)
scp -l 5000 large_file.zip user@server:/path/

七、SFTP 文件传输

SFTP(SSH File Transfer Protocol)提供交互式文件传输。

连接到 SFTP

sftp username@hostname

SFTP 常用命令

# 连接后的命令:
ls          # 列出远程目录
lls         # 列出本地目录
cd          # 切换远程目录
lcd         # 切换本地目录
pwd         # 显示远程当前目录
lpwd        # 显示本地当前目录
get file    # 下载文件
put file    # 上传文件
get -r dir  # 下载目录
put -r dir  # 上传目录
mkdir dir   # 创建远程目录
lmkdir dir  # 创建本地目录
rm file     # 删除远程文件
exit        # 退出 SFTP
quit        # 退出 SFTP

示例会话

$ sftp user@server
sftp> ls
sftp> cd /home/user/data
sftp> get dataset.zip
sftp> lcd ~/Downloads
sftp> put model.pth
sftp> exit

八、VSCode Remote SSH

VSCode 的 Remote SSH 插件让你可以在本地 VSCode 中直接编辑服务器上的文件,非常方便!

安装和配置

  1. 安装插件 :在 VSCode 中搜索并安装 "Remote - SSH"

  2. 配置连接

    • F1 Ctrl+Shift+P
    • 输入 "Remote-SSH: Connect to Host"
    • 选择 "Configure SSH Hosts"
    • 选择配置文件(通常是 ~/.ssh/config
  3. 添加服务器配置

Host my-server
    HostName 192.168.1.100
    User username
    IdentityFile ~/.ssh/id_rsa
  1. 连接服务器
    • F1
    • 输入 "Remote-SSH: Connect to Host"
    • 选择你配置的服务器

使用技巧

  • 连接后可以像本地一样使用 VSCode 的所有功能
  • 可以打开终端直接在服务器上执行命令
  • 可以安装服务器端的 VSCode 插件
  • 支持端口转发,自动转发 Jupyter、TensorBoard 等服务

九、SSH 安全最佳实践

1. 使用密钥认证,禁用密码登录

编辑服务器的 /etc/ssh/sshd_config

# 禁用密码认证
PasswordAuthentication no
# 禁用空密码
PermitEmptyPasswords no
# 启用公钥认证
PubkeyAuthentication yes

修改后重启 SSH 服务:

sudo systemctl restart sshd

2. 更改默认端口

# 在 /etc/ssh/sshd_config 中
Port 2222  # 改为非 22 端口

3. 禁止 root 直接登录

# 在 /etc/ssh/sshd_config 中
PermitRootLogin no

4. 限制登录用户

# 只允许特定用户登录
AllowUsers user1 user2
# 或者禁止特定用户
DenyUsers baduser

5. 使用防火墙

# 只允许特定 IP 访问 SSH
sudo ufw allow from 192.168.1.0/24 to any port 22

6. 启用双因素认证(2FA)

安装 Google Authenticator:

sudo apt-get install libpam-google-authenticator

7. 定期更新系统

sudo apt update && sudo apt upgrade

十、深度学习常用 SSH 场景

场景 1:后台训练模型

# 方法 1:使用 nohup
ssh user@server "cd /path/to/project && nohup python train.py > train.log 2>&1 &"
# 方法 2:使用 screen
ssh user@server
screen -S training
python train.py
# Ctrl+A, D 分离
# 方法 3:使用 tmux
ssh user@server
tmux new -s training
python train.py
# Ctrl+B, D 分离

场景 2:实时查看训练日志

# 连接并查看日志
ssh user@server "tail -f ~/project/train.log"
# 或者使用端口转发查看 TensorBoard
ssh -L 6006:localhost:6006 user@server
# 然后在服务器上启动 TensorBoard
# tensorboard --logdir=logs

场景 3:传输大型数据集

# 使用 rsync(支持断点续传)
rsync -avzP -e "ssh -p 22" dataset/ user@server:/data/datasets/
# 使用 SCP 限速传输
scp -l 10000 -r large_dataset/ user@server:/data/

场景 4:多服务器批量操作

创建批量 SSH 脚本:

#!/bin/bash
# batch_ssh.sh
SERVERS=("server1.com" "server2.com" "server3.com")
COMMAND="nvidia-smi"
for server in "${SERVERS[@]}"; do
    echo "=== $server ==="
    ssh user@$server "$COMMAND"
    echo ""
done

场景 5:Jupyter Notebook 远程访问

# 1. 在服务器启动 Jupyter(无浏览器)
jupyter notebook --no-browser --port=8888
# 2. 在本地建立 SSH 隧道
ssh -L 8888:localhost:8888 user@server
# 3. 在本地浏览器访问
# 

十一、常见问题解决

问题 1:连接超时

# 检查服务器是否可达
ping server.com
# 检查端口是否开放
telnet server.com 22
# 使用详细模式查看错误
ssh -v user@server.com

问题 2:密钥权限错误

WARNING: UNPROTECTED PRIVATE KEY FILE!

解决方法

chmod 600 ~/.ssh/id_rsa
chmod 700 ~/.ssh

问题 3:Too many authentication failures

解决方法

# 明确指定使用哪个密钥
ssh -i ~/.ssh/id_rsa user@server

问题 4:Host key verification failed

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

解决方法

# 删除旧的主机密钥
ssh-keygen -R hostname
# 或
ssh-keygen -R 192.168.1.100

问题 5:连接后立即断开

检查服务器日志:

sudo tail -f /var/log/auth.log

十二、实用技巧总结

快捷命令别名

~/.bashrc ~/.zshrc 中添加:

# SSH 别名
alias lab='ssh lab-server'
alias gpu='ssh gpu-server'
alias cloud='ssh cloud-server'
# SCP 别名
alias scpto='scp -r * user@server:/path/'
alias scpfrom='scp -r user@server:/path/* .'
# 查看 GPU 状态
alias gpu-status='ssh gpu-server "nvidia-smi"'

一键脚本

# start_training.sh
#!/bin/bash
# 连接服务器并启动训练
ssh user@server << 'EOF'
cd /home/user/project
source activate pytorch
nohup python train.py --epochs 100 > train.log 2>&1 &
echo "Training started, PID: $!"
EOF

SSH 保活配置

在本地 ~/.ssh/config 添加:

Host *
    ServerAliveInterval 60
    ServerAliveCountMax 10
    TCPKeepAlive yes

总结

SSH 核心命令速查

命令 用途
ssh user@host 基本连接
ssh-keygen 生成密钥对
ssh-copy-id user@host 上传公钥
ssh -L 8888:localhost:8888 user@host 本地端口转发
scp file user@host:/path 文件传输
sftp user@host 交互式文件传输
ssh -v user@host 调试模式

配置文件位置

  • 本地配置 : ~/.ssh/config
  • 本地密钥 : ~/.ssh/id_rsa (私钥), ~/.ssh/id_rsa.pub (公钥)
  • 服务器授权 : ~/.ssh/authorized_keys
  • 服务器配置 : /etc/ssh/sshd_config

深度学习工作流

  1. 配置免密登录 → 2. 设置 SSH config → 3. 使用 VSCode Remote → 4. 端口转发访问服务 → 5. 后台运行训练

掌握 SSH 是使用 Linux 服务器的基础技能。从基本连接到免密登录,从文件传输到端口转发,SSH 提供了强大而安全的远程管理能力。希望这篇指南能帮助你高效地使用 SSH!

本文标签: 转发端口示例