SSH + tmux:Linux运维指南

2026-04-30 15:55:50 670

SSH + tmux:Linux运维指南

欢迎来到蓝队云技术小课堂,每天分享一个技术小知识。


SSH简直就是 Linux 世界的万能钥匙——远程登录、文件传输、端口转发,甚至连翻墙都能干。再加上 tmux 这对黄金搭档,基本上就能实现"连上就不掉"的运维终极体验。

今天咱们就来好好聊聊SSH,从基础配置到各种骚操作,保证你看完之后对SSH的认识能提升一个档次。


一、SSH 到底是个啥

SSH 全称 Secure Shell,翻译成人话就是"安全的远程连接协议"。你想想,在没有 SSH 的年代,大家用的是 telnet,所有数据——包括你的密码——都是明文传输的。随便找个抓包工具,密码就裸奔在路上了。

SSH 出现之后,一切通信都经过加密,中间人想偷看?门都没有。

SSH 的客户端和服务器端分别是:

客户端: ssh (OpenSSH-client)

服务器: sshd (OpenSSH-server) 

二、SSH 配置文件详解

SSH 的配置文件主要两个,别搞混了:

客户端配置:~/.ssh/config

服务器配置:/etc/ssh/sshd_config

先看服务器端的重要参数,这些决定了你的 SSH 服务长什么样:

Port 22 — 监听端口。说实话,改端口是最基础的安全措施,改成 2222 之类的能挡住一大半脚本小子。

PermitRootLogin yes/no/prohibit-password — 允许 root 登录不。强烈建议改成 no 或者 prohibit-password,root 密码被爆破的风险太大了。

PasswordAuthentication yes/no — 密码登录开关。用了密钥登录之后果断改成 no,彻底关掉密码认证。

PubkeyAuthentication yes — 密钥认证开关,这个必须开。

MaxAuthTries 6 — 最大认证尝试次数。改成 3 就够了,多了纯属浪费。

LoginGraceTime 120 — 登录超时时间(秒)。超过这个时间没完成认证就断开。

ClientAliveInterval 300 — 服务器每 300 秒给客户端发个心跳包,防掉线用的。

ClientAliveCountMax 3 — 心跳包连续 3 次没回应就踢掉。

AllowUsers user1 user2 — 白名单,只允许指定用户登录。这个配合 DenyUsers 非常好用。

三、SSH 免密登录(密钥登录)

每次连服务器都要输密码?那也太烦了。免密登录的原理其实很简单:用非对称加密。你在本地生成一对密钥——公钥和私钥。公钥放到服务器上,私钥自己留着。连的时候,服务器用公钥验证你的身份,对上了就放行。

具体操作步骤,三句话搞定:

第一步,生成密钥对:

ssh-keygen -t ed25519 -C "your_email@landui.com" 

这里推荐用 ed25519 算法,比 rsa 更快更安全。一路回车就行,想加密码保护也可以(不过那就不是完全"免密"了)。

第二步,把公钥发送到服务器:

ssh-copy-id user@remote-server 

这步需要输入一次密码,之后公钥就自动添加到服务器的 ~/.ssh/authorized_keys 里了。

第三步,直接连:

ssh user@remote-server 

搞定,再也不用输密码了。

再补充一个客户端配置的技巧。编辑 ~/.ssh/config,可以给服务器起别名:

Host myserver

  HostName 192.168.1.100

  User root

  Port 2222

  IdentityFile ~/.ssh/id_ed25519 

配置好之后,只需要输入 ssh myserver 就能连上去,多爽。

四、SSH 端口转发(三种转发详解)

说到端口转发,很多同学都听说过,但真正理解的人不多。说实话,这个功能才是 SSH 最"魔法"的地方。它能让你打通各种网络孤岛,实现各种看似不可能的连接。

4.1 本地转发(Local Forwarding) -L

场景是这样的:你本地有一台机器 A,远程有一台服务器 B,B 后面还有一台数据库服务器 C(C 只能被 B 访问)。你想从 A 直接访问 C 的数据库,怎么办?

本地转发就能解决这个问题。原理是:在 A 上开一个本地端口,所有发到这个端口的数据,都会通过 SSH 隧道送到 C 上。

ssh -L [本地端口]:[目标主机]:[目标端口] user@跳板机 

举个实际的例子:

ssh -L 3307:localhost:3306 dbadmin@remote-server 

这个命令的意思是:在你本地打开 3307 端口,所有访问 3307 的请求都会被转发到 remote-server 的 3306 端口。你本地用 MySQL 客户端连 127.0.0.1:3307,实际连上的是远程服务器的 MySQL。

再比方说你想访问内网的 Web 管理界面:

ssh -L 8080:10.0.0.5:80 jump@bastion-host 

打开浏览器访问 localhost:8080,你就看到内网那台 10.0.0.5 的网页了。全程加密,谁也看不到。

image.png

4.2 远程转发(Remote Forwarding) -R

本地转发是"把远程的服务拉到本地",远程转发正好反过来——"把本地的服务推到远程"。

什么场景需要用这个?你想想:你在家里有一台 NAS 或者测试服务器,但你在外网访问不到它(没有公网 IP)。这时候你在公司的一台有公网 IP 的服务器上开远程转发,就能从公司直接访问家里的服务了。

ssh -R [远程端口]:[本地主机]:[本地端口] user@公网服务器 

具体操作:

ssh -R 9090:localhost:8080 user@public-server 

执行完这个命令后,任何访问 public-server:9090 的人,实际上访问的是你本地的 8080 端口。

有个坑要注意:默认情况下,远程转发的端口只绑定在远程服务器的 localhost 上,外面是访问不到的。要想让其他机器也能访问,需要在服务器的 sshd_config 里加上:

GatewayPorts yes 

4.3 动态转发(Dynamic Forwarding) -D

动态转发是三个里面最骚的。它会把你本地变成一个 SOCKS5 代理服务器,所有走这个代理的流量,都通过 SSH 服务器出去。

ssh -D [本地代理端口] user@远程服务器 

实际操作:

ssh -D 1080 user@remote-server 

连上之后,你本地就有一个 SOCKS5 代理运行在 127.0.0.1:1080。浏览器设置这个代理,你的所有网页浏览流量都会通过远程服务器出去。

和本地转发的区别在哪?本地转发需要指定具体的目标主机和端口,一对一定制;动态转发不用指定目标,它是一个通用的 SOCKS 代理,你想访问哪个远程服务都行。相当于本地转发是专线,动态转发是万能钥匙。

总结一下三种转发的区别:

• -L 本地转发:把远程服务拉到本地,你连本地端口 = 连远程服务

• -R 远程转发:把本地服务推到远程,别人连远程端口 = 连你的服务

• -D 动态转发:在本地开一个 SOCKS5 代理,万能转发

五、tmux:终端里的"永动机"

说完了 SSH,再来聊聊它的好搭档 tmux。这玩意儿的全称是 Terminal Multiplexer——终端复用器。名字听起来有点高大上,说白了就是:让你在一个终端窗口里开多个终端,而且即使 SSH 断开了,你跑的命令也不会中断。

你想想这个场景:你在服务器上跑一个需要 3 小时的数据同步,结果家里路由器重启,SSH 断了……如果没有 tmux,这个任务就废了,得从头再来。有了 tmux,任务继续在后台跑,你重新连上去 attach 一下,一切照旧。

5.1 tmux 的核心概念

tmux 有三个层级,搞懂了就不晕:

• Session(会话):最大单位,相当于一个工作台。你可以有多个会话,每个会话独立运行

• Window(窗口):会话里的标签页,类似浏览器的 tab

• Pane(窗格):窗口里的分屏,一个窗口可以上下左右切分成多个窗格

5.2 常用命令

创建会话:

tmux new -s mywork 

列出所有会话:

tmux ls 

重新连接会话:

tmux attach -t mywork 

分离当前会话(不终止):

按下 Ctrl+b 然后按 d(detach 的意思)

杀掉一个会话:

tmux kill-session -t mywork 

image.png


5.3 窗口和窗格操作

所有 tmux 的操作都以 Ctrl+b 为前缀,就是先按 Ctrl+b 松开,再按下一个键:

窗口操作:

• Ctrl+b + c:创建新窗口

• Ctrl+b + n:下一个窗口

• Ctrl+b + p:上一个窗口

• Ctrl+b + 数字:跳到第 N 个窗口

• Ctrl+b + w:列出所有窗口,用方向键选择

窗格操作(分屏):

• Ctrl+b + %:左右分屏

• Ctrl+b + ":上下分屏

• Ctrl+b + 方向键:在窗格间切换

• Ctrl+b + z:当前窗格全屏,再按一次恢复

• Ctrl+b + x:关闭当前窗格

5.4 tmux 配置文件

默认的 tmux 前缀键 Ctrl+b 按起来有点别扭,我建议改成 Ctrl+a,跟 screen 保持一致。创建 ~/.tmux.conf:

# 改前缀键为 Ctrl+a

set -g prefix C-a

unbind C-b

bind C-a send-prefix


# 启用鼠标支持

set -g mouse on


# 窗口编号从 1 开始

set -g base-index 1


# 256 色支持

set -g default-terminal "screen-256color"


# 历史记录增加到 50000 行

set -g history-limit 50000 

改完配置后,在 tmux 里执行 Ctrl+b 然后按 :source-file ~/.tmux.conf 就能热加载。

六、SSH + tmux 实战配合

SSH 和 tmux 搭配起来用,才是真正的"远程运维终极方案"。

场景一:跑长时间任务不怕断线

这是最常见的用法。连上服务器,先开 tmux:

ssh user@server

tmux new -s backup

# 在 tmux 里跑你的长时间任务

# 然后 Ctrl+b, d 分离

# 即使 SSH 断开,任务照常跑 

下次再连上来:ssh user@server 然后 tmux attach -t backup,一切恢复如初。

场景二:多人协作同一个 tmux 会话

tmux 支持多人同时连接同一个会话,相当于"结对编程"的终端版本:

# A 创建会话

tmux new -s pair


# B 连入同一个会话

tmux attach -t pair 

两个人看到完全一样的终端界面,谁输入的命令另一个人实时能看到。远程排障特别好用。

场景三:SSH 连接自动进 tmux

如果你想在每次 SSH 连上去的时候自动进入 tmux(没有就创建,有就恢复),可以在服务器的 ~/.bashrc 里加上:

# 如果是 SSH 登录且不在 tmux 里,自动 attach 或创建

if [ -n "$SSH_CONNECTION" ] && [ -z "$TMUX" ]; then

  tmux attach -t default 2>/dev/null || tmux new -s default

fi 

这样每次 SSH 登录,自动进入一个叫 default 的 tmux 会话。断开重连,自动回到原来的状态。用一次就回不去了。

七、SSH 进阶小技巧

跳板机一键直达:

内网机器要通过跳板机访问?不用手动两步走,配置 ProxyJump 一步到位:

Host inner-server

  HostName 10.0.0.50

  User admin

  ProxyJump jump-host 

直接 ssh inner-server,自动通过 jump-host 跳过去。

SSH 连接复用:

反复连同一台服务器,每次都要重新握手?用 Connection Multiplexing 加速:

Host *

  ControlMaster auto

  ControlPath ~/.ssh/control-%r@%h:%p

  ControlPersist 600 

第一次连接建立主控通道,后续连接复用这个通道,速度快到飞起。

SCP 文件传输:

# 上传

scp local_file user@remote:/path/

# 下载

scp user@remote:/path/file .

# 递归复制

scp -r local_dir user@remote:/path/ 


蓝队云官网上拥有完善的技术支持库可供参考,大家可自行查阅,更多技术问题,可以直接咨询。同时,蓝队云整理了运维必备的工具包免费分享给大家使用,需要的朋友可以直接咨询。

更多技术知识,蓝队云期待与你一起探索。


提交成功!非常感谢您的反馈,我们会继续努力做到更好!

这条文档是否有帮助解决问题?

非常抱歉未能帮助到您。为了给您提供更好的服务,我们很需要您进一步的反馈信息:

在文档使用中是否遇到以下问题: