ssh 是 Linux 系统中最重要和最常用的命令之一,用于通过加密的网络连接安全地登录到远程计算机(通常是另一台 Linux/Unix 服务器)并在其上执行命令。它是进行远程系统管理、文件传输和网络调试的核心工具。

核心概念:

  1. 协议: SSH (Secure Shell)
  2. ‍♂️ 目的: 提供安全的远程登录、命令执行和文件传输。
  3. 加密: 所有通信(包括密码)都是加密的,防止窃听和中间人攻击。
  4. 客户端: ssh 命令就是 SSH 客户端。
  5. 服务端: 远程机器上需要运行 SSH 服务端(通常是 sshd)。

基本语法:

ssh [options] [user@]hostname [command]
  • [options]: 可选参数(见下文常用选项)。
  • [user@]: 可选。指定要在远程主机上登录的用户名。如果省略,ssh 会尝试使用本地当前登录的用户名连接。
  • hostname: 必需。 远程主机的地址。可以是:
    • 域名 (如 example.com)
    • IP 地址 (如 192.168.1.100)
    • ~/.ssh/config 文件中定义的别名 (如 myserver)
  • [command]: 可选。如果提供,ssh 会登录到远程主机,执行该命令,然后立即退出(不进入交互式 shell)。如果不提供,会建立一个交互式的登录会话。

常用选项:

  • -p port: 指定远程 SSH 服务端监听的端口号(默认为 22)。如果服务器使用非标准端口,必须使用此选项。
    • ssh -p 2222 user@example.com
  • -i identity_file: 指定用于身份验证的私钥文件(默认使用 ~/.ssh/id_rsa, ~/.ssh/id_ecdsa, ~/.ssh/id_ed25519 等)。使用密钥登录比密码更安全。
    • ssh -i ~/.ssh/my_private_key.pem user@example.com
  • -l username: 显式指定远程登录用户名。等同于 user@hostname 中的 user@
    • ssh -l myuser example.com
  • -X: 启用 X11 转发。允许在本地显示远程主机上运行的图形界面程序(需要远程服务器配置支持)。
    • ssh -X user@example.com
  • -C: 启用压缩。在带宽较低时可能提高传输速度,但对高速网络可能适得其反。
    • ssh -C user@example.com
  • -v / -vv / -vvv: 详细模式。打印调试信息,用于排查连接问题。v 越多越详细。
    • ssh -v user@example.com
  • -L [bind_address:]port:host:hostport: 本地端口转发。将本地机器上的某个端口安全地隧道连接到远程网络中的另一台机器的端口。
    • ssh -L 8080:internal.server.com:80 user@gateway.example.com (访问 localhost:8080 即访问 internal.server.com:80 通过 gateway)
  • -R [bind_address:]port:host:hostport: 远程端口转发。将远程机器上的某个端口隧道连接到本地网络中的一台机器的端口。
  • -N: 不执行远程命令。仅用于端口转发时使用。
  • -f:ssh 在认证后转入后台运行。常与 -N 一起用于后台端口转发。
    • ssh -fN -L 3306:localhost:3306 user@dbserver.example.com (后台将本地 3306 转发到远程 MySQL)

使用示例:

  1. 基本远程登录:

    ssh username@example.com
    

    系统会提示你输入 usernameexample.com 上的密码。成功登录后,你将获得远程主机的命令行提示符。

  2. 使用非标准端口:

    ssh -p 2222 username@example.com
    

    连接到运行在 example.com 上端口 2222 的 SSH 服务。

  3. 使用密钥文件登录(无密码):

    ssh -i /path/to/your/private_key username@example.com
    

    这是最推荐的认证方式。确保私钥文件权限是 600 (chmod 600 /path/to/key)。

  4. 执行单个远程命令并退出:

    ssh username@example.com "ls -l /tmp"
    

    连接到 example.com,执行 ls -l /tmp 命令,将结果输出到本地终端,然后断开连接。

  5. 执行多个远程命令:

    ssh username@example.com "cd /var/log; tail -f syslog"
    

    或者使用 Heredoc(更清晰):

    ssh username@example.com << 'EOF'
    cd /backups
    tar -czf backup.tar.gz important_data/
    ls -lh backup.tar.gz
    EOF
    
  6. 本地端口转发:

    ssh -L 8888:localhost:80 username@webserver.example.com
    
    • 本地连接:你在本地浏览器访问 http://localhost:8888
    • SSH 隧道:ssh 客户端监听你本地机器的 8888 端口。
    • 远程连接:通过连接到 webserver.example.com 的 SSH 连接,ssh 客户端将请求转发到 webserver.example.com 本身 (localhost) 的 80 端口(通常是 Web 服务器)。
    • 效果:你本地 8888 端口的数据被安全地隧道传输到 webserver.example.com80 端口,就像你直接在 webserver 上访问一样。用于访问远程防火墙后的服务或加密不安全的协议。
  7. 结合 scp 进行安全文件传输:
    虽然 scp 是独立命令,但它基于 SSH:

    # 从本地复制到远程
    scp myfile.txt username@example.com:/remote/directory/
    # 从远程复制到本地
    scp username@example.com:/remote/path/file.txt /local/directory/
    # 使用端口和密钥
    scp -P 2222 -i ~/.ssh/key.pem localfile user@host:/remote/dir/
    

    现代更推荐使用 rsync -e sshsftp 代替 scp,功能更强大安全。

  8. 启用 X11 转发运行图形程序:

    ssh -X username@example.com
    xclock # 在远程执行,图形时钟会显示在你的本地桌面
    

    (需要远程 /etc/ssh/sshd_configX11Forwarding yes 且本地有 X Server)


重要安全提示与配置:

  1. 禁用密码登录,使用密钥: 这是提高安全性的最重要步骤。在服务器端的 /etc/ssh/sshd_config 中设置:

    PasswordAuthentication no
    PubkeyAuthentication yes
    

    然后使用 ssh-copy-id 命令将你的公钥上传到服务器:

    ssh-copy-id -i ~/.ssh/id_ed25519.pub username@example.com
    

    确保本地私钥 (~/.ssh/id_ed25519) 权限为 600

  2. 修改默认端口: 修改服务器 /etc/ssh/sshd_config 中的 Port 可以减少自动化脚本的扫描攻击(但安全主要靠密钥)。

  3. 禁止 root 登录: 在服务器 /etc/ssh/sshd_config 中设置 PermitRootLogin no。使用普通用户登录后 sudo

  4. ~/.ssh/config 文件: 创建此文件可以简化常用连接的输入。例如:

    Host myserver
        HostName server.example.com
        User myusername
        Port 2222
        IdentityFile ~/.ssh/special_key_for_myserver
    

    之后只需输入 ssh myserver 即可连接。

  5. known_hosts 文件: 首次连接某台主机时,ssh 会询问是否信任其公钥指纹,并保存在 ~/.ssh/known_hosts 中。下次连接会验证主机密钥是否变化,防止中间人攻击。如果服务器重装系统或密钥变更,会出现警告,需要手动确认或删除旧条目。


总结:

ssh 是 Linux/Unix 系统管理和开发的基石工具。掌握其基本登录、命令执行、端口转发功能以及与密钥认证相关的安全配置至关重要。通过 ~/.ssh/config 文件可以极大地提升使用效率和便捷性。始终优先使用密钥认证并遵循安全最佳实践。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐