欢迎光临
我们一直在努力

SSH 远程连接完全指南

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

一、SSH 基础知识

什么是 SSH?

SSH 全称: Secure Shell(安全外壳协议)

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

# 现在可以在本地浏览器访问:http://localhost:8888

实际应用:

# 访问 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 中直接编辑服务器上的文件,非常方便!

安装和配置

  • 安装插件:在 VSCode 中搜索并安装 "Remote – SSH"

  • 配置连接:

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

  • Host my-server
    HostName 192.168.1.100
    User username
    IdentityFile ~/.ssh/id_rsa

  • 连接服务器:
    • 按 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. 在本地浏览器访问
    # http://localhost:8888

    十一、常见问题解决

    问题 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

    深度学习工作流

  • 配置免密登录 → 2. 设置 SSH config → 3. 使用 VSCode Remote → 4. 端口转发访问服务 → 5. 后台运行训练
  • 掌握 SSH 是使用 Linux 服务器的基础技能。从基本连接到免密登录,从文件传输到端口转发,SSH 提供了强大而安全的远程管理能力。希望这篇指南能帮助你高效地使用 SSH!

    赞(0)
    未经允许不得转载:171主机测评 » SSH 远程连接完全指南
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址