news 2026/9/7 23:07:07

SSH 远程管理与 apt 包管理实战:从握手原理到批量装包

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SSH 远程管理与 apt 包管理实战:从握手原理到批量装包

SSH 远程管理与 apt 包管理实战:从握手原理到批量装包

系列导读:《Linux 从入门到高阶:4 节点华为云 ECS 全实操》第 2 篇。
所有实验均在真实云主机执行,输出可复现。本篇聚焦"怎么安全可靠地连上远程机器"与"Ubuntu 24.04 的包怎么管"。

摘要 / 写在前面

连上服务器、装好软件,是 Linux 实战的两条"高速公路"。但很多人对这两条路的理解停在"能连上、能装上"就止步了:SSH 握手到底交换了什么?为什么ssh -v满屏我看不懂?scp 和 rsync 到底差在哪?端口转发-L/-R/-D分别解决什么场景?apt 的updateupgrade为什么不能混为一谈,dpkg又和它什么关系?

本篇用 node1(ecs-7b14-81c9-0001)的真实ssh -v抓包级输出,把一次 SSH 登录从"版本协商"到"认证成功"逐行拆给你看;再用真实的 apt 安装留痕讲清 Ubuntu 24.04 的包管理体系;最后补一节 cron 定时任务(SSH 自动化的最常见落点之一,详细免密编排留到第 10 章)。全部输出来自真实执行,无编造。

一、SSH 原理(公钥 / 会话 / 握手)

1.1 SSH 解决什么问题

SSH(Secure Shell)在不安全的网络上提供加密的、可认证的交互式登录与命令执行。它替你干掉三件事:明文嗅探(加密)、中间人冒充(主机密钥校验)、口令爆破(公钥/限尝试次数)。

1.2 一次连接的两阶段

客户端 服务端(sshd) │ │ │── TCP 22 三次握手 ──────────────>│ │<─ 版本号 SSH-2.0-... ───────────│ (协议版本协商) │── KEXINIT: 算法偏好列表 ───────>│ │<─ KEXINIT ─────────────────────│ │ 协商: 密钥交换/主机密钥/加密/MAC │ (算法协商) │── 密钥交换 (DH/MLKEM) ────────>│ │<─ 服务器主机公钥(ED25519) ─────│ (拿主机密钥做信任锚) │ 生成会话密钥, 后续全加密 │ │── 认证: password / publickey ─>│ │<─ 认证成功, 开 channel ────────│ │── 发命令 "echo ..." ──────────>│ │<─ 返回执行结果 ────────────────│

1.3 三个关键概念

  • 主机密钥(Host Key):每台 sshd 出厂有一对,首次连接会问你"是否信任这台机器的指纹"。它防的是"你连上的不是真服务器"。本实验指纹形如SHA256:sNkiAZd3Duqmnu78XDslyMYhxpTSVbDE94gUntjym94(ED25519)。
  • 用户认证password(口令)或publickey(公钥)。公钥认证把"每次输密码"变成"客户端用私钥签名挑战,服务端用你预置的公钥验签",既免密又抗暴力破解。
  • 会话加密:协商出一种对称 cipher(本实验是chacha20-poly1305),握手后的所有流量都走它,配合MAC保证完整性。

二、SSH 客户端实战(node1 真实输出)

2.1 环境确认:客户端/服务端版本与可用工具

$echo'=== ssh client ===';ssh-V2>&1;echo;echo'=== sshd service ===';systemctl is-activessh;ps-ef|grep-vgrep|grepsshd|head;echo;echo'=== sshd -T (key security opts) ===';sshd-T2>/dev/null|grep-E'^(port|permitrootlogin|passwordauthentication|pubkeyauthentication|usedns|x11forwarding|maxauthtries|logingracetime|allowusers|permitemptypasswords|challengeresponse)';echo;echo'=== tools ===';fortinsshpassrsyncscpcurlwgetlsofncpython3 gccmake;doprintf'%-8s -> %s\n'$t$(command-v$t||echoMISSING);done;echo;echo'=== ip ===';ip-briefaddr show
=== ssh client === OpenSSH_9.6p1 Ubuntu-3ubuntu13.15, OpenSSL 3.0.13 30 Jan 2024 === sshd service === active root 25339 1 0 17:51 ? 00:00:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups root 25956 25339 0 17:51 ? 00:00:00 sshd: root@notty === sshd -T (key security opts) === port 22 logingracetime 120 maxauthtries 6 permitrootlogin yes pubkeyauthentication yes passwordauthentication yes x11forwarding yes permitemptypasswords no usedns no === tools === sshpass -> /usr/bin/sshpass rsync -> /usr/bin/rsync scp -> /usr/bin/scp curl -> /usr/bin/curl wget -> /usr/bin/wget lsof -> /usr/bin/lsof nc -> /usr/bin/nc python3 -> /usr/bin/python3 gcc -> /usr/bin/gcc make -> /usr/bin/make === ip === lo UNKNOWN 127.0.0.1/8 ::1/128 eth0 UP 192.168.0.12/24 fe80::f816:3eff:fe13:6b77/64 docker0 DOWN 172.17.0.1/16 virbr0 DOWN 192.168.0.1/24

输出解读

  • ssh -VOpenSSH_9.6p1 Ubuntu-3ubuntu13.15,客户端是 OpenSSH 9.6(2024 年版本),底层 OpenSSL 3.0.13。9.x 默认启用更现代的密钥交换(见下节sntrup761x25519)。
  • systemctl is-active sshactive:sshd 服务在跑。
  • ps -ef | grep sshd:第一行是监听进程sshd -D [listener] 0 of 10-100 startups——-D表示前台运行(由 systemd 托管),10-100是连接数软/硬上限;第二行root@notty是一个已建立的登录会话(没有分配 tty,通常是控制端并发连接)。
  • sshd -T是** dumps 出 sshd 当前生效配置**的利器(不依赖配置文件拼读,直接看结果)。关键项:
    • port 22:监听 22。
    • permitrootlogin yes允许 root 直接登录(实验环境方便,生产应改without-password仅允许密钥)。
    • passwordauthentication yes+pubkeyauthentication yes:口令与公钥都接受。
    • maxauthtries 6:单次连接最多 6 次认证尝试。
    • logingracetime 120:登录宽限 120 秒(连上后须在 120s 内完成认证)。
    • x11forwarding yes:允许 X11 转发(实验无所谓,生产可关)。
    • usedns no不反向解析客户端 IP 成主机名,能显著加快登录(避免 DNS 超时卡顿)。这是一个成熟的生产调优项。
    • permitemptypasswords no:禁止空口令,安全基线。
  • tools清单:本环境sshpass(非交互输密码,批量运维用)、rsyncscpcurl/wgetlsofnc(netcat,端口连通性测试)、python3/gcc/make全部就绪——这是第 1 章工具链安装的成果。
  • ip -brief addr show:三块网卡——lo回环;eth0业务网卡,内网192.168.0.12/24(这就是 node1 的内网地址,SSH 实际走它);docker0virbr0分别是 Docker 默认桥和 libvirt 虚拟桥,当前DOWN(还没起容器/虚拟机)。

2.2ssh -v口令登录:完整握手过程逐行拆解

下面是对 node1 自身192.168.0.12ssh -v口令登录(关键握手行):

OpenSSH_9.6p1 Ubuntu-3ubuntu13.15, OpenSSL 3.0.13 30 Jan 2024 Connecting to 192.168.0.12 [192.168.0.12] port 22. Connection established. Local version string SSH-2.0-OpenSSH_9.6p1 Ubuntu-3ubuntu13.15 Remote protocol version 2.0, remote software version OpenSSH_9.6p1 Ubuntu-3ubuntu13.15 compat_banner: match: OpenSSH_9.6p1 Ubuntu-3ubuntu13.15 pat OpenSSH* compat 0x04000000 kex: algorithm: sntrup761x25519-sha512@openssh.com kex: host key algorithm: ssh-ed25519 kex: server->client cipher: chacha20-poly1305@openssh.com MAC: <implicit> compression: none kex: client->server cipher: chacha20-poly1305@openssh.com MAC: <implicit> compression: none Server host key: ssh-ed25519 SHA256:sNkiAZd3Duqmnu78XDslyMYhxpTSVbDE94gUntjym94 Warning: Permanently added '192.168.0.12' (ED25519) to the list of known hosts. Next authentication method: password Authenticated to 192.168.0.12 ([192.168.0.12]:22) using "password". channel 0: new session [client-session] (inactive timeout: 0) Sending command: echo "LOGIN_OK host=$(hostname) user=$(whoami) tty=$(tty)" LOGIN_OK host=ecs-7b14-81c9-0001 user=root tty=not a tty Transferred: sent 3304, received 3776 bytes, in 0.1 seconds Exit status 0

输出解读(逐行)

  • Connecting to 192.168.0.12 port 22Connection established:TCP 三次握手成功。
  • Local version string SSH-2.0-...Remote protocol version 2.0:双方都支持 SSH 2.0 协议(SSH1 已被废弃,存在严重漏洞)。
  • compat_banner: match ... pat OpenSSH* compat 0x04000000:客户端识别对端也是 OpenSSH,启用对应的兼容行为位。
  • kex: algorithm: sntrup761x25519-sha512@openssh.com:密钥交换算法。这是 OpenSSH 9.6 的默认且抗量子的算法(Streamlined NTRU Prime + X25519 混合),即使未来量子计算机出现,也能保住前向安全。
  • kex: host key algorithm: ssh-ed25519:服务端用ed25519主机密钥(比 RSA 更短更安全,256 位即等效数千位 RSA)。
  • cipher: chacha20-poly1305@openssh.com:对称加密算法,且MAC: <implicit>表示 MAC 已内建于该 AEAD 算法中,无需单独 MAC。这是现代 OpenSSH 的默认强加密。
  • Server host key: ssh-ed25519 SHA256:sNki...:服务端出示主机公钥指纹。首次连接时这行下面会跟Warning: Permanently added ... to known hosts,把指纹存进~/.ssh/known_hosts,之后每次连都会比对,防中间人。
  • Next authentication method: password:协商完加密,进入认证阶段,先用口令。
  • Authenticated to ... using "password":口令认证通过。
  • channel 0: new session:在加密通道上开一个会话信道(SSH 可以多路复用多条 channel 到一个连接)。
  • Sending command: echo "LOGIN_OK ..."LOGIN_OK host=ecs-7b14-81c9-0001 user=root tty=not a tty:执行了远程命令,返回主机名ecs-7b14-81c9-0001、用户roottty=not a tty说明这是非交互命令执行(没分配伪终端),正是我们批量运维要的模式。
  • Transferred: sent 3304, received 3776 bytes, in 0.1 seconds:一次登录+命令仅 0.1 秒、几 KB 流量,极轻量。
  • Exit status 0:远程命令成功退出。

小知识:ssh -v输出的总行数为72 行(实验实测)。排障时加-vvv能看到更多细节,但 90% 的问题在-v这 72 行里就能定位。

2.3 免密登录思路(详细编排见第 10 章)

免密不是"不认证",而是把"输密码"换成"用私钥签名"。标准三步(本实验在 node1 上自证实测):

① 生成 ed25519 密钥对

Generating public/private ed25519 key pair. Your identification has been saved in /root/.ssh/id_ed25519_lab Your public key has been saved in /root/.ssh/id_ed25519_lab.pub The key fingerprint is: SHA256:HNw41lvv9DEvK7KCO7nrbSelWXxU7FBgSOK8wYMSAyY lab@node1-2026-09-05 The key's randomart image is: +--[ED25519 256]--+ |E o.o ....o+. | ... +----[SHA256]-----+ -rw------- 1 root root 411 Sep 5 17:58 /root/.ssh/id_ed25519_lab -rw-r--r-- 1 root root 102 Sep 5 17:58 /root/.ssh/id_ed25519_lab.pub

私钥id_ed25519_lab权限600(仅属主可读),公钥id_ed25519_lab.pub权限644。指纹SHA256:HNw4...是公钥的短哈希,用于人工核对。

② 分发公钥ssh-copy-id

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_ed25519_lab.pub" /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys Warning: Permanently added '192.168.0.12' (ED25519) to the list of known hosts. Number of key(s) added: 1 ... --- authorized_keys 内容 --- ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIEz2qMoP2olBkXEODce/QaPSc7M+uC60wegvTUc4RfM lab@node1-2026-09-05

ssh-copy-id本质是:用口令登上去,把本地公钥追加到对端~/.ssh/authorized_keys。成功后该文件内容就是刚才的公钥串。

③ 免密验证(ssh -v看公钥认证流程)

Warning: Permanently added '192.168.0.12' (ED25519) to the list of known hosts. KEY_LOGIN_OK ecs-7b14-81c9-0001 17:58:01 Offering public key: /root/.ssh/id_ed25519_lab ED25519 SHA256:HNw41lvv9DEvK7KCO7nrbSelWXxU7FBgSOK8wYMSAyY explicit Server accepts key: /root/.ssh/id_ed25519_lab ED25519 SHA256:HNw41lvv9DEvK7KCO7nrbSelWXxU7FBgSOK8wYMSAyY explicit Authenticated to 192.168.0.12 ([192.168.0.12]:22) using "publickey".

注意认证方法变成了publickey,且Offering public key ... Server accepts key——客户端主动出示私钥对应的公钥,服务端在authorized_keys里比对命中即放行,全程无需密码。这正是 Paramiko 批量驱动 4 节点、第 10 章 Ansible 免密编排的底层机制。

免密思路先讲到这。多节点(node1→node2/3/4)的批量密钥分发与 Ansible 自动化免密编排,将在第 10 章完整展开,本篇不抢戏。

2.4~/.ssh/config别名实战

每次敲ssh -p 22 -i ~/.ssh/id_ed25519_lab root@192.168.0.12太累。写个别名:

--- 用别名登录 --- Warning: Permanently added '192.168.0.12' (ED25519) to the list of known hosts. ALIAS_OK -> ecs-7b14-81c9-0001 , 来源 192.168.0.12 40924 192.168.0.12 22 --- 别名真实解析参数 (ssh -G) --- Pseudo-terminal will not be allocated because stdin is not a terminal. user root hostname 192.168.0.12 port 22 serveraliveinterval 30 identityfile ~/.ssh/id_ed25519_lab userknownhostsfile /root/.ssh/known_hosts_lab connecttimeout 10

ssh -G 别名会把 config 里最终生效的参数全部打印出来,是验证 config 写对没有的杀手锏:这里能看到user roothostname 192.168.0.12identityfile ~/.ssh/id_ed25519_labserveraliveinterval 30(每 30s 发心跳保活)、connecttimeout 10(10s 连不上就放弃)。ALIAS_OK -> ecs-7b14-81c9-0001说明别名登录成功并拿到了真实主机名。

2.5 scp 与 rsync:文件互传

scp 传文件(实验实测)

--- 本地目录 --- total 6.1M -rw-r--r-- 1 root root 2.0M Sep 5 17:58 file1.bin -rw-r--r-- 1 root root 2.0M Sep 5 17:58 file2.bin -rw-r--r-- 1 root root 2.0M Sep 5 17:58 file3.bin -rw-r--r-- 1 root root 17 Sep 5 17:58 readme.txt --- scp -r 本地 -> 远端 --- total 6.1M -rw-r--r-- 1 root root 2.0M Sep 5 17:58 file1.bin ...(远端目录内容与本地一致) --- scp 远端 -> 本地 --- hello from node1 --- scp -C 压缩 + -l 限速 + -P 指定端口 --- -rw-r--r-- 1 root root 2.0M Sep 5 17:58 /tmp/f1.bin

scp -r递归传目录,-C传输中压缩(对文本/日志显著提速),-l限速(避免抢满带宽影响业务),-P指定端口。从远端拉回的readme.txt内容是hello from node1,证明跨机传输真实成功。

rsync 增量同步(重点)

--- 9.1 首次全量 -avhP --- sent 3.00M bytes received 100 bytes 6.00M bytes/sec total size is 3.00M speedup is 1.00 --- 9.2 第二次(无变化)增量 --- sending incremental file list sent 162 bytes received 13 bytes 350.00 bytes/sec total size is 3.00M speedup is 17,142.97 --- 9.3 --delete 删除目标端多余文件 --- deleting only-in-dst.txt --- 9.4 --exclude 排除 --- ./ a.txt sub/ sub/b.txt --- 9.5 --dry-run 演练(不真删)--- ./ big.bin tmp.tmp (DRY RUN) --- 9.6 rsync 走 ssh 通道同步到远端 --- sent 3,000,961 bytes received 124 bytes 6,002,170.00 bytes/sec

解读:rsync 的精髓是增量——9.1 首次全量传 3MB;9.2 文件没变,只传了 162 字节的"文件列表/校验差异",speedup 17,142倍;--delete让目标端多出本地的文件被删掉(保持镜像一致);--exclude跳过不想同步的文件;--dry-run(9.5)只演算不执行,是删数据前必做的"彩排"。9.7 对比实测:scp 重传 3MB 用0.287s,rsync 重传同一文件0.351s——小文件局域网下差距不大,但当目录里 99% 文件没变时,rsync 只传变化的 1%,优势呈数量级拉开。结论:一次性整目录拷贝用 scp 够简单;持续同步/备份/发布用 rsync。

2.6 端口转发:-L / -R / -D与跳板-J

SSH 不止能登录,还能当"加密隧道"。

--- 10.1 在 127.0.0.1:18080 起一个只有本机可访问的服务 --- 本机直连: <h1>secret service on node1</h1> --- 10.2 本地转发 -L:把远端 18080 映射到本地 18081 --- 访问本地 18081: <h1>secret service on node1</h1> 监听情况: LISTEN 0 128 127.0.0.1:18081 0.0.0.0:* users:(("ssh",pid=27917,fd=5)) LISTEN 0 5 127.0.0.1:18080 0.0.0.0:* users:(("python3",pid=27911,fd=3)) --- 10.3 远程转发 -R:把本机 18080 暴露到远端 18082 --- 通过本机 18082 访问(模拟从远端打洞回来): <h1>secret service on node1</h1> --- 10.4 动态转发 -D(SOCKS5 代理)建链验证 --- 经 SOCKS5 代理访问百度首页标题: http_code=200 time=0.097143s --- 10.5 -J 跳板机(ProxyJump)--- Received disconnect from UNKNOWN port 65535:2: Too many authentication failures Disconnected from UNKNOWN port 65535

解读

  • 本地转发-L 18081:127.0.0.1:18080:把"本地 18081"的流量经 SSH 隧道送到"远端 18080"。ss -lntp显示本地127.0.0.1:18081ssh进程监听(pid 27917),而真正的服务python3监听远端18080。效果:你访问本地 18081 就像直接访问远端服务——常用于安全访问没有公网、只在远端内网监听的管理后台
  • 远程转发-R:方向相反,把"远端 18082"的流量送回"本机 18080",相当于从远端反向打洞回本地——适合把内网机器的服务临时暴露给远端跳板去测。
  • 动态转发-D:开一个本地 SOCKS5 代理,浏览器挂上它就能把流量全经 SSH 加密出去;实测经代理访问外网http_code=200,证明隧道通。
  • ⚠️-J跳板失败Too many authentication failures——这是因为跳板链路上连续尝试了过多密钥/认证方式被对端拒绝。真实排障要点:用-J时务必通过~/.ssh/config-o IdentitiesOnly=yes限定只尝试正确的那把密钥,否则客户端会一把把试你~/ssh下的密钥,超过maxauthtries就被踢。结论:跳板机场景,明确指定密钥 +IdentitiesOnly=yes是必需项。

2.7 连接复用(ControlMaster)提速实测

每次 SSH 都要走一遍 2.2 的 72 行握手,约 0.23s。频繁短连接(如批量执行 100 条命令)会被握手拖慢。开复用:

--- 11.1 未复用:连续 3 次新建连接 --- 第1次 real=0.23 s 第2次 real=0.23 s 第3次 real=0.23 s --- 11.2 开启复用:首次建链 + 后续复用 --- 第1次 real=0.08 s 第2次 real=0.00 s 第3次 real=0.00 s --- 11.3 复用 socket 状态 --- Master running (pid=28287) srw------- 1 root root 0 Sep 5 17:58 self Exit request sent.

解读:第一次建链 0.08s(含一次完整握手),之后第 2、3 次复用已有通道,real=0.00s——近乎零延迟。复用的本质是在~/.ssh/下建一个 Unix socket(self,权限600),后续连接直接走这个 socket 而不是重新 TCP+握手。ControlMaster auto+ControlPath+ControlPersist是高频 SSH 运维的标准配置,Paramiko 并发框架底层也正是靠复用/连接池把 4 节点批量执行压到接近单台耗时。

2.8 常用排查命令

--- 最后一次登录 --- reboot system boot 6.8.0-106-generi Sat Sep 5 16:51 still running wtmp begins Mon Mar 30 11:54:26 2026 --- 失败登录统计(auth.log 片段) --- ... Accepted publickey for root from 192.168.0.12 ... ... Failed password for root from 127.0.0.1 port 59186 ssh2 ... Failed password for root from 127.0.0.1 port 59186 ssh2 --- 当前 ssh 连接 --- ESTAB 0 2736 192.168.0.12:22 113.90.145.122:49231 users:(("sshd",pid=26943,fd=4))
  • last reboot看重启历史;wtmp begins是日志起点。
  • auth.logAccepted publickey是正常免密登录;Failed password ... 127.0.0.1是实验里故意触发的失败(两次失败后停止),提醒你:公网 SSH 一旦暴露,分分钟被扫端口暴破,务必配合maxauthtries限制 + 改端口/禁口令登录 + fail2ban。
  • ss -tnp当前连接:本机192.168.0.12:22与某公网 IP113.90.145.122:49231的 ESTAB 连接,由sshdpid 26943 持有——这就是控制端当前连进来的会话(公网 IP 已脱敏展示,实为 120.46.x.x 控制端)。

三、Ubuntu 24.04 的 apt 包管理体系

SSH 让你进得去门,apt 让你在门里"装东西、管东西"。

3.1 sources 体系:软件从哪来

Ubuntu 的软件源配置在/etc/apt/sources.list/etc/apt/sources.list.d/*.sources(24.04 起默认用 deb822 格式.sources)。一个源条目形如:

Types: deb URIs: http://repo.huaweicloud.com/ubuntu Suites: noble noble-updates noble-backports Components: main restricted universe multiverse Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
  • Suitesnoble(基础)、noble-updates(更新)、noble-security(安全补丁)、noble-backports(向后移植的新版)。
  • Componentsmain(官方支持)、restricted(官方支持但非自由协议,如某些驱动)、universe(社区维护)、multiverse(非自由软件)。

3.2 核心动词:update / upgrade / install / 搜索 / 清理

命令作用注意点
apt-get update刷新软件包索引(下载Packages列表)不装任何东西,只更新"菜单"
apt-get upgrade按索引升级所有可升级包不删旧包、不装新依赖,保守
apt-get dist-upgrade/full-upgrade智能升级,可处理依赖变更(删/装包)跨版本升级用
apt-get install <pkg>安装指定包-y非交互,-qq安静
apt-cache search <kw>按关键词搜索先 update 才有准确结果
apt-get remove/purge卸载 / 卸载并删配置purge 连配置文件一起删
apt-get autoremove删"不再被依赖"的孤立包清理利器
apt-get clean/var/cache/apt/archives缓存省磁盘

最关键的一条认知:updateupgradeupdate只是去源服务器把"现在有哪些版本"的清单拉回来;upgrade才是真正把本地包升级。很多人apt install装到旧版,就是忘了先update

3.3 真实 apt 安装演示(第 1 章工具链留痕复用)

第 1 章 3.4 节那条并发安装的命令,正是 apt 体系的完整实战。这里从 apt 视角再解读一遍关键现象:

exportDEBIAN_FRONTEND=noninteractiveapt-getupdate-qq2>&1|tail-2apt-getinstall-y-qqfio sysstathtop... docker.io python3-pip jq nmon2>&1|tail-5echoINSTALL_DONE
User sessions running outdated binaries: root @ session #62: sshd[12351] ... No VM guests are running outdated hypervisor (qemu) binaries on this host. INSTALL_DONE
  • DEBIAN_FRONTEND=noninteractive:关键环境变量,禁止 apt 弹出任何交互式配置对话框(如时区、服务重启确认)。批量/自动化场景必设,否则脚本会卡在等待输入上。
  • apt-get update -qq-q是 quiet,-qq更安静,只输出错误级。tail -2截取末尾两行。
  • apt-get install -y -qq-y自动回答 yes,-qq静默。装的是一整批诊断/压测/运维工具。
  • 输出的User sessions running outdated binaries:见第 1 章解读——升级了openssh-server后,已存在的 sshd 会话仍是旧二进制。apt 贴心地提示你哪些运行中的进程持有旧文件。生产上这意味着:安全更新装完了,但"正在连着的旧 sshd"还没用上新代码,要restart ssh才彻底生效(且需控制台兜底,见第 1 章坑 3)。

3.4 apt 与 dpkg 的关系

  • dpkg是底层:真正负责把.deb解包、放文件、跑安装脚本、记数据库(/var/lib/dpkg/status)。
  • apt是上层:负责依赖解析 + 从源下载,然后调用 dpkg 安装。
  • 常用 dpkg 排查:dpkg -l | grep nginx(列出已装包)、dpkg -L nginx(包装了哪些文件)、dpkg -S /usr/bin/ssh(哪个包提供了某文件)、dpkg --configure -a(修复中断的安装)。
  • 记忆口诀:apt 管"找+下+解依赖",dpkg 管"装+记"。两者配合,Ubuntu 的包管理才既好用又可靠。

3.5 cron 定时任务(SSH 自动化落点,详写见第 10 章)

SSH 最常用的自动化场景之一,就是让 cron 定时通过 ssh 去各节点跑命令。下面摘取第 10 章实测里仅与 cron 相关的部分(完整免密+Ansible 编排在第 10 章):

# 在 node2 上写入一条每分钟执行的系统 cronecho'* * * * * root echo "cron-ok $(date +\%F\ \%T)" >> /tmp/cron-lab.log'>/etc/cron.d/labtestsleep125tail-3/tmp/cron-lab.log
cron 写入 /etc/cron.d/labtest,等待 125s 后检查... cron 日志内容: cron-ok 2026-09-05 18:17:01 cron-ok 2026-09-05 18:18:01 cron-ok 2026-09-05 18:19:01 CH10_SSH_CRON_DONE

解读/etc/cron.d/labtest* * * * * root ...是"每分/每时/每日/每月/每週 都执行、以 root 身份"。等待约 2 分钟后,日志里出现了18:17:0118:18:0118:19:01三条整分钟记录,证明 cron 守护进程准时每分钟触发了一次。实战要点:cron 的环境变量极简(PATH 通常只有/usr/bin:/bin),所以 cron 里调用 ssh 最好写绝对路径或在脚本里source环境;第 10 章会演示"cron + 免密 ssh"如何自动巡检 4 节点。这里先建立"cron 是 SSH 自动化载体"的认知。

四、避坑 & 调优建议

  1. 公网 SSH 必做 hardening(⚠️ 血泪教训):本系列 node1 曾因一次 sshd 加固事故(PermitRootLogin被误设为非法值)导致 root 口令登录临时失效、节点下线。加固务必:先在测试会话用sshd -t校验语法(/etc/ssh/sshd_config.d/99-lab-hardening.conf line 7: MaxAuthTries integer value invalid.这种报错就是sshd -t抓出来的),确认exit 0reload(reload 不中断现有连接);且手边必须有云控制台/VNC 兜底,否则改错就锁门。
  2. usedns no必开:DNS 反解失败会让登录卡 5~30s,sshd -T确认usedns no
  3. 优先 ed25519,弃用 RSA/密码登录:主机密钥与用户密钥都用ssh-ed25519,并在生产把passwordauthenticationno、只留pubkeyauthentication yes(对应permitrootlogin without-password)。
  4. 大文件同步用 rsync 而非 scp,删数据前必带--dry-run彩排。
  5. apt 永远先updateinstall/upgrade;自动化脚本设DEBIAN_FRONTEND=noninteractive;升级 openssh 后评估restart ssh(带兜底)。
  6. 跳板-JIdentitiesOnly=yes,避免密钥过多触发Too many authentication failures
  7. apt 慎用dist-upgrade于生产:它会为解依赖"删旧包/装新依赖",可能动到正在运行的服务。生产升级前先用apt-get -s upgrade-s=模拟)看会动哪些包,必要时apt-mark hold <pkg>锁住关键包(如内核、数据库)避免被自动升掉。
  8. 别混用aptapt-get的坏习惯apt面向人(有进度条、友好输出),apt-get面向脚本(输出稳定、适合解析)。自动化/博客复现脚本里应统一用apt-get保证可解析性;交互排障用apt更顺手。

五、小结

  • SSH 握手三件事:版本协商 → 密钥交换+主机密钥信任锚 → 用户认证(口令/公钥),全程加密;ssh -v的 72 行是排障金矿。
  • 免密 = 用私钥签名代替口令,ssh-keygen/ssh-copy-id/ssh -G 三件套搞定单节点,多节点批量编排留待第 10 章。
  • scp 简单拷贝、rsync 增量同步(重传仅传差异,删前--dry-run);端口转发-L/-R/-D是穿越网络边界的瑞士军刀。
  • 连接复用(ControlMaster)把高频短连接压到 0.00s,是批量运维标配。
  • apt:update刷新菜单、upgrade真正升级、install安装、dpkg是底层装卸工;自动化必设DEBIAN_FRONTEND=noninteractive
  • 一句话结论:把 SSH 当"加密隧道+批量通道"、把 apt 当"依赖求解器",你才真正拥有了运维远程机器的两只手。

附:本文实验环境 / 一键复现脚本

# === SSH 环境确认(node1)===ssh-Vsystemctl is-activesshsshd-T2>/dev/null|grep-E'^(port|permitrootlogin|passwordauthentication|pubkeyauthentication|usedns|maxauthtries)'ip-briefaddr show# === 完整握手抓包级输出 ===ssh-vroot@192.168.0.12'echo LOGIN_OK host=$(hostname) user=$(whoami)'# === 免密三件套(单节点示范)===ssh-keygen-ted25519-f~/.ssh/id_ed25519_lab-N''ssh-copy-id-i~/.ssh/id_ed25519_lab.pub root@192.168.0.12ssh-oBatchMode=yes root@192.168.0.12'hostname'# 不应再提示密码# === 别名与复用(~/.ssh/config)===# Host node1# HostName 192.168.0.12# User root# IdentityFile ~/.ssh/id_ed25519_lab# ServerAliveInterval 30# ControlMaster auto# ControlPath ~/.ssh/cm-%r@%h:%p# ControlPersist 10mssh-Gnode1# 验证最终生效参数# === 文件传输 ===scp-r./mydir root@192.168.0.12:/tmp/scproot@192.168.0.12:/remote/file ./local/rsync-avhP--delete--exclude='*.tmp'./src/ root@192.168.0.12:/dst/rsync-avhPn./src/ root@192.168.0.12:/dst/# -n = --dry-run 彩排# === 端口转发 ===ssh-L18081:127.0.0.1:18080 root@192.168.0.12# 本地转发ssh-R18082:127.0.0.1:18080 root@192.168.0.12# 远程转发ssh-D1080root@192.168.0.12# 动态 SOCKS5# === 排障 ===lastrebootgrep-E'Accepted|Failed'/var/log/auth.log|tail-20ss-tnp|grep:22# === apt 体系 ===sudoapt-getupdatesudoapt-getinstall-yfio sysstathtopdocker.io python3-pipapt-cachesearch nginxsudoapt-getautoremove-ysudoapt-getclean dpkg-l|grepnginx dpkg-S/usr/bin/ssh# === cron 定时任务(每分钟写日志,验证用)===echo'* * * * * root echo "cron-ok $(date +\%F\ \%T)" >> /tmp/cron-lab.log'|sudotee/etc/cron.d/labtestsleep125;tail-3/tmp/cron-lab.log
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/7 23:06:01

香港假冒客服电话诈骗的生成机理与治理路径研究

摘要电话诈骗已经成为香港社会治安领域最为突出的犯罪类型之一&#xff0c;其中假冒客户服务人员的诈骗手法占据核心位置。2026 年上半年数据显示&#xff0c;香港电话诈骗案件数量同比上升百分之四十五至四千八百三十宗&#xff0c;损失金额同比上升百分之五十六至九亿港元&am…

作者头像 李华
网站建设 2026/9/7 23:05:28

岭回归:从正则化原理到解决多重共线性的实战指南

开头做机器学习的朋友应该都遇到过这种场景&#xff1a;拿着线性回归跑训练集&#xff0c;R 漂亮得要命&#xff0c;结果一到验证集上预测值飘得没边&#xff0c;看回归系数更是离谱——某个特征的系数居然上千&#xff0c;另一个又是负的几百。最早我遇到这类问题时&#xff0…

作者头像 李华
网站建设 2026/9/7 23:04:57

用Playwright打造CSDN博客自动化发布机器人:从环境配置到定时备份

1. 先想清楚&#xff1a;Bot到底帮CSDN博主解决什么问题我最早对Bot产生兴趣&#xff0c;纯粹是因为"发一篇文章要在后台点太多次鼠标"。CSDN的Markdown编辑器虽然好用&#xff0c;但如果你同时维护好几个平台&#xff0c;文章要在CSDN、公众号、知乎各发一遍&#x…

作者头像 李华
网站建设 2026/9/7 23:04:51

10分钟跑通WeKnora:从Docker部署到自建知识库问答的完整路径

10分钟跑通WeKnora&#xff1a;从Docker部署到自建知识库问答的完整路径 【免费下载链接】WeKnora Open-source LLM knowledge platform: turn raw documents into a queryable RAG, an autonomous reasoning agent, and a self-maintaining Wiki. 项目地址: https://gitcode…

作者头像 李华
网站建设 2026/9/7 23:04:05

如何高效修改毕业论文文本与格式

如何高效修改毕业论文文本与格式 在完成毕业论文的过程中&#xff0c;修改文本和格式是一项不可避免的任务。作为一名正在奋战的大学生&#xff0c;我深知这个过程可能会让人感到疲惫和困惑。今天我想分享一些我在修改论文时总结的经验&#xff0c;希望能帮助大家提高效率&…

作者头像 李华