Linux ssh 命令(保姆级教程)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 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
密钥对认证
密码认证存在被暴力破解的风险。推荐使用密钥对认证,步骤如下:
-
生成密钥对:
ssh-keygen -t ed25519
会生成
id_ed25519
(私钥)和id_ed25519.pub
(公钥) -
将公钥复制到远程服务器:
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
会话恢复
使用 screen
或 tmux
实现断线重连:
-
连接后启动
tmux
会话:tmux new -s mysession
-
断开连接后重新连接并恢复:
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 调试远程服务器上的代码:
-
建立端口转发:
ssh -L 5000:localhost:5000 developer@remote-server.com
将远程的 5000 端口映射到本地,本地浏览器访问
localhost:5000
即可查看远程服务。 -
使用 VS Code 远程开发: 安装 VS Code 的 Remote - SSH 扩展,直接在本地界面编辑远程文件。
案例 2:跨服务器数据迁移
需将数据库从服务器 A 迁移到服务器 B:
-
在本地建立 SSH 隧道连接服务器 A:
ssh -L 3306:localhost:3306 developerA@serverA.com
-
在另一终端连接服务器 B,执行数据导出:
ssh developerB@serverB.com mysql -h 127.0.0.1 -P 3306 -u user -p > backup.sql
-
将备份文件通过 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 命令都是连接数字世界的桥梁。通过持续实践和探索,开发者能够将这一工具的潜力最大化,为高效、安全的远程工作奠定坚实基础。