Linux ssh 命令(保姆级教程)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

什么是 SSH 命令?

在 Linux 系统中,SSH(Secure Shell)是远程管理和操作服务器的核心工具。它通过加密通信通道实现用户与远程主机的安全交互,广泛应用于开发、运维和系统管理场景。对于编程初学者和中级开发者而言,掌握 SSH 命令如同掌握了远程协作的“钥匙”,能够高效地访问和控制远程服务器。

SSH 的核心优势在于安全性。它通过非对称加密技术,将用户密码、命令和文件传输过程中的数据进行加密,有效防止中间人攻击和数据窃取。此外,SSH 还支持多种认证方式,如密码认证、密钥对认证和多因素认证,进一步提升系统的安全性。

SSH 命令的基础用法

基本语法与连接操作

SSH 命令的最基础形式是:

ssh username@hostname

其中:

  • username 是远程主机的登录用户名
  • hostname 可以是 IP 地址或域名

示例:

ssh developer@192.168.1.100

当首次连接时,系统会提示确认远程主机的指纹信息。输入 yes 后,系统会保存该主机的公钥,后续连接时将不再重复验证。

指定端口连接

默认情况下,SSH 使用 22 端口。若远程服务器配置了非标准端口(如 2222),需通过 -p 参数指定:

ssh -p 2222 developer@remote-server.com

密钥对认证

密码认证存在被暴力破解的风险。推荐使用密钥对认证,步骤如下:

  1. 生成密钥对:

    ssh-keygen -t ed25519
    

    会生成 id_ed25519(私钥)和 id_ed25519.pub(公钥)

  2. 将公钥复制到远程服务器:

    ssh-copy-id -i ~/.ssh/id_ed25519.pub developer@remote-server.com
    

完成配置后,再次连接时无需输入密码,系统会自动使用私钥认证。


SSH 的高级功能与场景应用

端口转发与隧道技术

SSH 可以创建安全的隧道,实现内网穿透或服务代理。常见类型包括:

本地端口转发(Local Port Forwarding)

将本地端口映射到远程主机的指定服务:

ssh -L 8080:localhost:3306 developer@remote-server.com

此命令将本地 8080 端口连接到远程主机的 3306(MySQL 默认端口),本地可通过 localhost:8080 访问远程数据库。

远程端口转发(Remote Port Forwarding)

将远程端口映射到本地服务:

ssh -R 8080:localhost:80 developer@remote-server.com

此时,远程服务器的 8080 端口会转发到本地的 80 端口(Web 服务),远程用户可通过 remote-server.com:8080 访问本地网站。

动态端口转发(SOCKS 代理)

创建动态代理实现全局流量转发:

ssh -D 1080 developer@remote-server.com

配置本地浏览器使用 socks5://localhost:1080 代理后,所有流量将通过远程服务器传输,常用于访问受地域限制的网络资源。


会话管理与持久连接

保持长连接

通过 -o ServerAliveInterval=30 参数防止空闲断开:

ssh -o ServerAliveInterval=30 developer@remote-server.com

此命令每 30 秒向服务器发送心跳包,避免因超时断开。

跳板机连接(Bastion Host)

当目标服务器位于内网时,可通过跳板机中转:

ssh -J user_jump@jump-server.com user_target@target-server.com

或使用多层跳板:

ssh -J user_jump1@host1,user_jump2@host2 user_target@host3

会话恢复

使用 screentmux 实现断线重连:

  1. 连接后启动 tmux 会话:

    tmux new -s mysession
    
  2. 断开连接后重新连接并恢复:

    ssh developer@remote-server.com
    tmux attach -t mysession
    

文件传输:SCP 和 SFTP

SSH 内置了安全的文件传输协议:

SCP(Secure Copy)

单次传输文件:

scp local_file.txt developer@remote-server.com:/remote/path/

递归传输目录:

scp -r /local/directory/ developer@remote-server.com:/remote/path/

SFTP(SSH File Transfer Protocol)

交互式文件管理:

sftp developer@remote-server.com

进入 SFTP 界面后,可用命令:

  • put local_file remote_file 上传
  • get remote_file local_file 下载
  • ls 查看远程目录
  • cd 切换目录

安全最佳实践

密钥对管理

  • 私钥保护: 设置密钥文件权限为 600
    chmod 600 ~/.ssh/id_ed25519
    
  • 定期轮换: 每年更换密钥并更新远程服务器的 authorized_keys 文件
  • 使用 Passphrase: 在生成密钥时设置密码短语,增强私钥安全性

服务器配置优化

编辑 SSH 配置文件 /etc/ssh/sshd_config,推荐设置:

PasswordAuthentication no

AllowUsers developer admin

Port 2222

StrictModes yes

修改后重启 SSH 服务:

systemctl restart sshd

防火墙规则

仅允许指定 IP 或 IP 段访问 SSH 端口:

iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 2222 -j ACCEPT
iptables -A INPUT -p tcp --dport 2222 -j DROP

实战案例与进阶技巧

案例 1:远程开发环境搭建

开发者需在本地 IDE 调试远程服务器上的代码:

  1. 建立端口转发:

    ssh -L 5000:localhost:5000 developer@remote-server.com
    

    将远程的 5000 端口映射到本地,本地浏览器访问 localhost:5000 即可查看远程服务。

  2. 使用 VS Code 远程开发: 安装 VS Code 的 Remote - SSH 扩展,直接在本地界面编辑远程文件。

案例 2:跨服务器数据迁移

需将数据库从服务器 A 迁移到服务器 B:

  1. 在本地建立 SSH 隧道连接服务器 A:

    ssh -L 3306:localhost:3306 developerA@serverA.com
    
  2. 在另一终端连接服务器 B,执行数据导出:

    ssh developerB@serverB.com
    mysql -h 127.0.0.1 -P 3306 -u user -p > backup.sql
    
  3. 将备份文件通过 SCP 传输到服务器 B:

    scp backup.sql developerB@serverB.com:/var/db/
    

进阶技巧:SSH 代理命令

通过 ProxyCommand 实现复杂网络连接:

ssh -o "ProxyCommand ssh jump-server nc %h %p" target-server

此命令通过 jump-server 中转访问 target-server,无需手动建立多层跳板。


常见问题与解决方案

连接超时问题

现象: 输入密码后长时间无响应
原因: 可能是 MTU 值过大导致分片包丢失
解决方案:

ifconfig eth0 mtu 1400

主机密钥验证失败

现象: 提示 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
原因: 远程服务器更换了 SSH 主机密钥
解决方案:

ssh-keygen -R remote-server.com

连接中断后无法恢复

现象: 断线后重新连接需重新配置端口转发
解决方案: 使用 autossh 自动重连:

autossh -M 0 -L 8080:localhost:3306 developer@remote-server.com

结论

SSH 命令作为 Linux 系统的远程交互核心工具,其功能远不止简单的登录操作。通过端口转发、密钥认证和隧道技术,开发者可以构建安全高效的远程工作流,实现跨网络的无缝协作。掌握 SSH 的高级用法,不仅能提升工作效率,更能显著增强系统的安全性。建议读者根据实际需求,结合具体场景灵活运用这些技术,逐步探索 SSH 的更多可能性。

在数字化时代,SSH 已经成为开发者必备的技能之一。无论是本地开发环境的调试,还是云端服务器的运维管理,SSH 命令都是连接数字世界的桥梁。通过持续实践和探索,开发者能够将这一工具的潜力最大化,为高效、安全的远程工作奠定坚实基础。

最新发布