一、为什么是 2017 年这一份
2017 年这个时间点前后,Linux 远程管理进入"工具标准化"阶段:
- OpenSSH 7.x(2016-2017 时代)已修复大量历史漏洞,sshd 默认配置趋于安全
- Wake-on-LAN 仍是有线网卡机器远程开机的主流方案
- Debian/Ubuntu 的网络配置正经历重构——Debian 9 (2017-06) 仍用
/etc/network/interfaces,但 Ubuntu 18.04 (2018-04) 起改用 netplan - systemd-resolved 在 Ubuntu 17.10 (2017-10) 起成为默认 DNS 解析
这一篇覆盖远程登录、远程拷贝、远程开机、网卡配置、DNS 配置——一个系统管理员日常要用的"远程"工具箱。
阅读建议:本文分四块——远程登录(SSH)、远程拷贝(SCP)、远程开机(WoL)、网络配置。强烈建议所有公开服务器禁止密码登录,只用密钥。
二、SSH 远程登录
2.1 sshpass:脚本里的免密登录
sshpass 允许在一条命令里把密码带上——典型场景是自动化脚本里临时用一下,生产环境请用 SSH 公私钥。
1
2
3
4
5
6
7
8
9
10
11
12
| # 安装(CentOS)
yum install -y sshpass
# 安装(Debian/Ubuntu)
apt install -y sshpass
# 免密 SSH 登录
sshpass -p 'your-password' ssh root@<host-ip>
# sshpass + ssh 不提示 yes/no
sshpass -p 'your-password' ssh \
-o StrictHostKeyChecking=no user@<host-ip>
|
2.2 优化:去掉"是否连接"的提示
第一次 SSH 连接到新主机时,会问"是否信任该主机(yes/no)"。在自动化场景下这个交互很烦。两种解决方案:
客户端配置(影响本机的所有 SSH 客户端):
1
2
3
4
| vim /etc/ssh/ssh_config
# 加上这一行
StrictHostKeyChecking no
|
服务端配置(影响所有客户端连这台机器):
1
2
3
4
5
6
| vim /etc/ssh/sshd_config
GSSAPIAuthentication no
UseDNS no
service sshd restart
|
三、SSH 公私钥登录:生产环境标配
强烈推荐:所有公开服务器禁止密码登录,只用密钥。
3.1 生成密钥对
1
2
3
4
5
6
| ssh-keygen -t rsa
# 默认 2048 位 RSA,公私钥存在 ~/.ssh/
# 当前目录下多出两个文件
# id_rsa ← 私钥(**绝不能泄露**)
# id_rsa.pub ← 公钥(要上传到服务器)
|
3.2 上传公钥到服务器
方法一:手动复制
1
2
3
4
5
6
7
8
| # 假设你已经在服务器上
mkdir -p ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
# 把本地公钥内容粘贴进去
cat id_rsa.pub >> ~/.ssh/authorized_keys
|
方法二:ssh-copy-id(如果装了)
1
| ssh-copy-id -i ~/.ssh/id_rsa.pub user@<host-ip>
|
3.3 服务端配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| vim /etc/ssh/sshd_config
# 启用 RSA 认证(默认是 yes)
RSAAuthentication yes
PubkeyAuthentication yes
# 指定公钥文件位置
AuthorizedKeysFile .ssh/authorized_keys
# 允许 root 登录(视业务)
PermitRootLogin yes
# **关键:禁用密码登录**
PasswordAuthentication no
# 重启 sshd
service sshd restart
|
顺序很重要:先确认至少有一个账号能用公钥登录了,再去禁密码。否则一旦失联,就只能接显示器登录。
3.4 多个公钥
1
| cat other_id_rsa.pub >> ~/.ssh/authorized_keys
|
一行一个公钥,OpenSSH 按顺序匹配。
四、scp 远程拷贝
4.1 本地 → 远程
1
2
3
4
5
6
7
8
| # 文件
scp /local/file.txt user@<host>:/remote/path/
# 目录(加 -r)
scp -r /local/dir user@<host>:/remote/path/
# 携带密码(自动化场景)
sshpass -p 'your-password' scp -r /local/dir user@<host>:/remote/path/
|
4.2 远程 → 本地
1
2
3
4
5
6
7
8
| # 文件
scp user@<host>:/remote/file.txt /local/path/
# 目录
scp -r user@<host>:/remote/dir /local/path/
# 携带密码
sshpass -p 'your-password' scp user@<host>:/remote/file.txt /local/path/
|
4.3 常用选项
| 选项 | 含义 |
|---|
-P port | 指定端口(大写 P,不是 -p) |
-q | 去掉进度显示 |
-l limit | 限速(单位 Kbit/s) |
-C | 压缩传输 |
-i keyfile | 指定私钥文件 |
更现代的替代:rsync 和 sftp 都已经基本替代 scp 在生产环境的位置。rsync 增量传输、sftp 支持断点续传,scp 适合"小文件、临时一次性"的场景。
五、Wake-on-LAN 远程开机
WoL(Wake-on-LAN)允许通过网络发一个"魔术包",让关机状态下的机器开机。要求机器的有线网卡和主板都支持。
5.1 检查网卡是否支持 WoL
1
2
3
4
| ethtool eno1
# 找到 "Supports Wake-on:" 和 "Wake-on:" 两行
# Supports Wake-on: pumbg
# Wake-on: d ← d = 禁用
|
| 字段值 | 含义 |
|---|
p | Wake on PHY activity |
u | Wake on unicast messages |
m | Wake on multicast messages |
b | Wake on broadcast messages |
a | Wake on ARP |
g | Wake on MagicPacket(最常用) |
s | Enable SecureOn password for MagicPacket |
d | Disable(默认) |
5.2 启用 WoL
1
2
3
4
5
6
7
8
9
10
| # 立即启用(重启后失效)
ethtool -s eno1 wol g
# 永久启用:写进网卡配置
# CentOS/RHEL
echo "ETHTOOL_OPTS='-s eno1 wol g'" >> /etc/sysconfig/network-scripts/ifcfg-eno1
# Debian/Ubuntu
# 在 /etc/network/interfaces 里加
# up ethtool -s eno1 wol g
|
5.3 查网卡物理地址(MAC)
1
2
| ip a
# link/ether 58:11:22:c3:1b:4d
|
5.4 安装并发送魔术包
1
2
3
4
5
6
7
8
9
| # 安装 wakeonlan
apt install wakeonlan # Debian/Ubuntu
yum install wakeonlan # CentOS(需 EPEL)
# 在同一局域网内发送
wakeonlan 58:11:22:c3:1b:4d
# 指定目标 IP(跨网段需要中继)
wakeonlan -i 10.8.33.5 58:11:22:c3:1b:4d
|
5.5 BIOS 也要打开 WoL
掉电恢复来电后 WoL 经常失效——这是主板 BIOS 没开。
开机进 BIOS → Power Management Setup:
- 找
Wake On LAN → 设为 Enable - 没有就找
Wake On PCI Card → 设为 Enable(注意:PCI 选项可能有两个,确保只开一个,否则循环重启) - 找
PME Event Wake Up → 设为 Enabled
两种 WoL 模式的区别:
Wake On LAN —— 完全关机也能唤醒Wake On PCI Card —— 深度休眠(hibernate)才能唤醒
5.6 远程关机
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| # 立即关机
shutdown now
# 或
shutdown --poweroff now
# 取消关机
shutdown -c
# 预关机(带警告)
shutdown --poweroff
# 深度睡眠
pm-hibernate
# 重启
shutdown --reboot
|
六、Debian / Ubuntu 网络配置
6.1 Debian 9/10:/etc/network/interfaces
1
2
3
4
5
6
| # 重启网络
/etc/init.d/networking restart
systemctl restart networking
# 网卡配置
vim /etc/network/interfaces
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| # This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# 环回口
auto lo
iface lo inet loopback
# DHCP 自动获取
auto eth0
iface eth0 inet dhcp
# 静态 IP
auto eth0
iface eth0 inet static
address 192.168.1.122
netmask 255.255.255.0
gateway 192.168.1.2
|
6.2 查看 DNS
1
2
3
4
5
6
7
| # 临时配置
cat /etc/resolv.conf
# nameserver 8.8.8.8
# nameserver 114.114.114.114
# 永久配置
sudo apt install resolvconf
|
6.3 Ubuntu 18.04+:netplan
Ubuntu 18.04 起改用 netplan(YAML 格式):
1
2
| # 配置
vim /etc/netplan/00-installer-config.yaml
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| network:
ethernets:
eno1:
dhcp4: false
addresses:
- 192.168.10.127/24
routes:
- to: default
via: 192.168.10.1
nameservers:
addresses: [211.138.24.66, 114.114.114.114, 192.168.10.1]
eno2:
dhcp4: true
eno3:
dhcp4: true
eno4:
dhcp4: true
version: 2
|
从 interfaces 迁移到 netplan:2017-2018 是过渡期,老教程仍是 interfaces,新机器按 netplan 走。
6.4 DNS:systemd-resolved
Ubuntu 17.10 起默认启用 systemd-resolved。
1
2
3
4
5
6
7
8
| vim /etc/systemd/resolved.conf
[Resolve]
# 几个公开 DNS(示例)
#DNS=1.1.1.1 8.8.8.8
DNS=114.114.114.114
systemctl restart systemd-resolved
|
/etc/resolv.conf 经常被覆盖:/etc/resolv.conf 实际上是软链接到 /run/systemd/resolve/stub-resolv.conf,手动改 /etc/resolv.conf 重启后会失效。正确做法是改 /etc/systemd/resolved.conf。
七、Debian 静态 IP 实际案例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| # 1. 查当前 IP
ip a
# 或
ifconfig
# 2. 备份原配置
cp /etc/network/interfaces /etc/network/interfaces.bak
# 3. 改成静态
cat > /etc/network/interfaces << "EOF"
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.1.122
netmask 255.255.255.0
gateway 192.168.1.2
EOF
# 4. 重启
systemctl restart networking
|
八、前置知识 / 下一步
- 想了解 SSH 高级用法(端口转发、代理)→ 翻独立文章
- 想了解
fail2ban 防爆破 → 翻本系列《Linux 用户管理与安全加固》 - 想了解 Wake-on-LAN 跨网段(需要路由器支持)→ 翻独立文章
- 想了解
rsync 增量同步替代 scp → 翻独立文章 - 想了解
ufw 防火墙配置 → 翻本系列《Ubuntu 发行版实战》
九、参考资源
2024 视角:7 年后远程管理的"新王"和"新坑"
2017 那篇的 SSH 公私钥、scp、Wake-on-LAN 在 2024 仍管用——但有 3 个新趋势必须知道:
一、ed25519 全面替代 RSA 2048
2017 那篇示范 ssh-keygen -t rsa(默认 2048 位)。2024 实际项目里 ed25519 已经是事实标准:
| 算法 | 密钥长度 | 性能 | 抗量子 | 兼容性 |
|---|
| RSA 2048 | 2048 位 | 慢(签名/验签 1-3ms) | 弱(量子 Shor 算法秒破) | 全平台 |
| RSA 4096 | 4096 位 | 极慢(10-30ms) | 较弱 | 全平台 |
| ed25519 | 256 位 | 极快(< 0.1ms) | 中(仍是椭圆曲线) | OpenSSH 6.5+(2014) |
| ECDSA P-256 | 256 位 | 快 | 中 | OpenSSH 5.7+(2008) |
| ML-DSA(Dilithium) | 1312 字节 | 慢 | 强(抗量子) | OpenSSH 9.x 实验中 |
2024 默认推荐:
1
2
3
4
5
6
| # ed25519
ssh-keygen -t ed25519 -C "lwd@<your-host>"
# 加 passphrase(用 ssh-agent / GNOME Keyring 记)
ssh-keygen -t ed25519 -a 100 -C "lwd@<your-host>"
# -a 100 = 100 轮 KDF,增强私钥文件抗爆破
|
二、SSH 配置的"现代化"补充
Include /etc/ssh/sshd_config.d/*.conf:2024 推荐——把配置拆到 /etc/ssh/sshd_config.d/ 目录,sshd 8.0+ 已支持。- KDF rounds on private key:私钥 KDF 迭代次数(
-a 参数)。 Include ~/.ssh/config.d/*.conf:客户端也可以 Include 拆分。- GSSAPI / DNS 关闭默认已 ok。
Include 路径匹配:
1
2
3
4
5
6
7
8
9
| # 客户端 ~/.ssh/config
Include config.d/*.conf
# /etc/ssh/sshd_config.d/00-hardening.conf
PasswordAuthentication no
PermitRootLogin prohibit-password
MaxAuthTries 3
X11Forwarding no
AllowAgentForwarding no
|
三、scp 全面弃用,改用 sftp / rsync
- OpenSSH 9.0(2022-04)开始打印
WARNING: scp is deprecated。 - sftp(基于 SSH 的 FTP)支持断点续传、目录浏览:
1
2
3
4
5
| # 上传
sftp user@host <<< 'put -r /local/dir /remote/path'
# 下载
sftp user@host <<< 'get -r /remote/path /local/'
|
1
2
3
4
5
| rsync -avz --progress /local/dir/ user@host:/remote/dir/
# -a 归档模式
# -v 详细
# -z 传输时压缩
# --progress 显示进度
|
四、Wake-on-LAN 在云时代的"替代方案"
- 2017 那篇 WoL 在家用 / 局域网场景仍管用。
- 但 2024 云服务器根本没 WoL 概念——开机通过云厂商 API。
- 远程开机的现代姿势:
- AWS:Lambda + CloudWatch Events + EC2 API
- 阿里云:函数计算 + 定时触发器 + ECS StartInstance
- 小米插座 / 智能插线板:远程给机器上电(家里老台式机)
1
2
3
4
5
6
7
8
| # 阿里云 SDK 远程开机
from aliyunsdkcore.client import AcsClient
from aliyunsdkecs.request.v20140526 import StartInstanceRequest
client = AcsClient('<access-key-id>', '<access-key-secret>', 'cn-hangzhou')
request = StartInstanceRequest.StartInstanceRequest()
request.set_InstanceIds(['i-bp1xxxxxxxxxxxxxx'])
client.do_action_with_exception(request)
|
五、WireGuard 替代 SSH 隧道 + frp
- 2017 那篇没提 SSH 端口转发
-L / -R。2024 的"点对点 VPN"首选是 WireGuard:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| # 装
apt install wireguard
# 生成密钥
wg genkey | tee /etc/wireguard/privatekey | wg pubkey > /etc/wireguard/publickey
# 配置 /etc/wireguard/wg0.conf
[Interface]
Address = 10.0.0.1/24
PrivateKey = <server-private-key>
ListenPort = 51820
[Peer]
PublicKey = <client-public-key>
AllowedIPs = 10.0.0.2/32
|
- 优势:内核态实现(性能是 OpenVPN 4 倍)、配置极简(单文件)、roaming 友好(IP 变化不重连)。
- SSH 隧道还在用:但主要是"临时单端口转发",长期组网全部走 WireGuard / Tailscale / ZeroTier。
六、网络配置:NetworkManager 已成"事实上默认"
- 2017 那篇给的
/etc/network/interfaces 写法,在 Debian 12+(2023-06)已经被 NetworkManager 取代:
1
2
3
4
5
6
7
8
9
10
11
| # 看现有连接
nmcli connection show
# 改 IP
nmcli connection modify "Wired connection 1" \
ipv4.addresses 192.168.1.100/24 \
ipv4.gateway 192.168.1.1 \
ipv4.dns "1.1.1.1,8.8.8.8" \
ipv4.method manual
nmcli connection up "Wired connection 1"
|
- Ubuntu 22.04+ / Debian 12+:服务器版仍可装
ifupdown 用 interfaces,但新项目默认 NetworkManager。 - nmcli / nmtui 比手写 YAML 更易维护。
七、Tailscale / ZeroTier 终结"内网穿透"
- 2017 那篇 SSH 远程登录到"内网"用 frp(2017 那篇还没提 frp,那篇主要是 SSH)。2024 趋势:
- Tailscale(基于 WireGuard,5 分钟建全球组网)—— 个人免费 100 台设备
- ZeroTier(P2P + 控制器)—— 同样免费 25 台
- Cloudflare Tunnel(云原生时代)——
cloudflared 一行命令把内网服务暴露公网
1
2
3
4
| # Tailscale(2024 年最易上手)
curl -fsSL https://tailscale.com/install.sh | sh
tailscale up
# 自动获得 100.x.x.x 虚拟 IP,全网互通
|