Linux 命令行:禁用互联网(保持 LAN)的快速方法?

Sop*_*rez 13 networking linux internet command-line shell-script

拆分问题:这里的另一个是针对 Windows 的。

Linux:从命令行禁用互联网(保持 LAN)的最快方法?

我认为在 Linux 中停用互联网(而不是 LAN)的最简单方法是删除默认网关,因此,假设 LAN 是 10.0.2.0/24 并且网关是 10.0.2.1 :

sudo /sbin/route del default gw 10.0.2.1
Run Code Online (Sandbox Code Playgroud)

要重新激活互联网:

sudo /sbin/route add default gw 10.0.2.1
Run Code Online (Sandbox Code Playgroud)

但是,即使这是一条简单的线路,也需要先发现默认网关 IP:

sudo /sbin/route
Run Code Online (Sandbox Code Playgroud)

我将构建一些需要启用/禁用互联网(但保持 LAN 正常工作)的通用 shell 脚本,所以看来我需要一些(¿ grep,也许?)操作来过滤和检测确切的网关 IP 号(它可能是 10.0.2.1、127.0.0.1、127.0.50.1、192.168.0.1 ...等),除非我找到了一个更简单的命令行。
有什么想法吗?

Joh*_*024 9

在 *nix 上,找到网关:

GW="$(sudo /sbin/route -n | awk '$1=="0.0.0.0" {print $2; exit}')"
sudo /sbin/route del default gw "$GW"
echo "$GW" >~/my_tmp_file
Run Code Online (Sandbox Code Playgroud)

最后一行将值保存在一个文件中,以备以后重新启动网络时使用:

sudo /sbin/route add default gw "$(cat ~/my_tmp_file)"
Run Code Online (Sandbox Code Playgroud)

注意:如果有多个默认网关,则需要为每个网关再次运行此代码,或重写以支持该代码。

工作原理: 上述awk命令能够捕获网关,因为route -n输出如下所示:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.0.2.1        0.0.0.0         UG    0      0        0 eth0
10.0.2.0        0.0.0.0         255.255.255.0   U     0      0        0 eth0
Run Code Online (Sandbox Code Playgroud)

Internet 网关是允许目的地在任何地方 ( 0.0.0.0) 的网关。因此,awk脚本逐行查看第一列($1awk符号表示)。当第一列是destination-anywhere 时,它​​会打印第二列,即网关。awk然后命令的输出被捕获到 shell 变量中GW。然后可以要求 shell 替换$GW为任何需要它的命令。