0%

Caution

由 Gemini 2.5 Pro 生成。

👶 服务器:我在 ~/.bashrc 中填写好代理(在 -i 的检查之前),我没有 ~/.bash_profile 文件。本机:我尝试连接服务器 ssh server,可以进入到交互界面,且有正常的代理设置;但是如果我用 ssh server bash -c "env | grep http",就发现没有代理,请问这是为什么?

🤖 简单来说:

  1. ssh server:当你这样连接时,你在服务器上启动的是一个 交互式登录 Shell (Interactive Login Shell)
    • 它会首先尝试加载 /etc/profile
    • 然后会查找并加载用户家目录下的 ~/.bash_profile、~/.bash_login 或 ~/.profile 文件中的 第一个 存在且可读的文件
    • 很多 Linux 发行版的默认 ~/.profile (或者如果你创建了 ~/.bash_profile) 文件里会包含一段逻辑,如果 ~/.bashrc 文件存在,就去加载 (source) 它。这就是为什么你的 ~/.bashrc 在交互式登录时生效了(即使理论上 .bashrc 主要用于非登录交互式 Shell)。
    • 你提到将代理设置放在了 -i 检查(通常是类似 [ -z "$PS1" ] && return 的语句,用于判断是否是交互式 Shell)之前,这确保了即使是通过 ~/.profile 间接加载 .bashrc,代理设置也会被执行。
  2. ssh server bash -c "command":当你这样执行远程命令时,你在服务器上启动的是一个 非交互式 Shell (Non-interactive Shell)
    • 非交互式 Shell 默认不会加载 /etc/profile 或 ~/.profile 或 ~/.bash_profile 或 ~/.bash_login 这些登录 Shell 的配置文件
    • 默认情况下,非交互式 Shell 也不会加载 ~/.bashrc 文件。Bash 这样做是为了避免 .bashrc 中那些为交互式会话设计的设置(如别名、提示符设置、函数等)干扰脚本的执行或产生不必要的输出。
    • 因此,你在 ~/.bashrc 中设置的代理环境变量在这个场景下没有被加载,所以 env | grep http 命令看不到它们。

解决方案:

Caution

由 Gemini 2.5 Pro 生成。

👶 我发现 NetworkManager 活跃而 systemd-networkd 仅仅加载而不活跃。同时我有以下日志:

xx@xx-Rack-Server:~$ NetworkManager --print-config
# NetworkManager configuration: /etc/NetworkManager/NetworkManager.conf (lib: 10-dns-resolved.conf, 10-globally-managed-devices.conf, 20-connectivity-ubuntu.conf, no-mac-addr-change.conf) (etc: 10-ubuntu-fan.conf, default-wifi-powersave-on.conf)

[main]
# rc-manager=
# auth-polkit=true
# dhcp=internal
# iwd-config-path=
dns=systemd-resolved
plugins=ifupdown,keyfile
configure-and-quit=no

[connectivity]
uri=http://connectivity-check.ubuntu.com./

[ifupdown]
managed=false

[keyfile]
unmanaged-devices=*,except:type:wifi,except:type:gsm,except:type:cdma,interface-name:fan-*

[logging]
# backend=journal
# audit=true

[device]
# wifi.backend=wpa_supplicant
wifi.scan-rand-mac-address=no

[device]
# wifi.backend=wpa_supplicant
wifi.scan-rand-mac-address=no

[device-31-mac-addr-change]
match-device=driver:eagle_sdio,driver:wl
wifi.scan-rand-mac-address=no

[connection]
wifi.powersave=3

# no-auto-default file "/var/lib/NetworkManager/no-auto-default.state"

我怎么验证静态 ip 是正常的(至少每次重启之后是正常的),这个配置写到哪里去了?


Caution

由 gemini-2.0-flash-001 生成。

我们来解释一下 Linux 中的 IFUNC (Indirect Function) 机制,以及它与 PLT 的关系。

IFUNC 机制解释:

IFUNC,全称 Indirect Function,是 GNU C 库(glibc)引入的一种机制,允许在运行时动态选择函数的实现。 简单来说,IFUNC 允许你根据运行时的条件(例如 CPU 特性、操作系统版本等)选择一个函数的不同版本或实现。

工作原理:

Caution

由 gemini-2.5-pro-exp-03-25 生成。

gcc 的 -fno-plt 是什么含义?

-fno-plt 是 GCC 编译器的一个选项,它与程序如何处理函数调用相关,特别是对共享库函数的调用。

作用和含义

-fno-plt 选项禁用 PLT(Procedure Linkage Table,过程链接表)的使用。具体来说:

  1. PLT 的工作原理
    • 在标准的动态链接中,对外部函数的调用通过 PLT 和 GOT(Global Offset Table,全局偏移表)间接进行
    • PLT 包含一小段代码,负责在第一次调用函数时解析其实际地址,并将该地址缓存在 GOT 中
    • 后续对同一函数的调用可以直接使用 GOT 中缓存的地址
  2. 禁用 PLT 的效果
    • 使用 -fno-plt 后,编译器会为每次外部函数调用生成直接的代码
    • 函数地址会在程序加载时由动态链接器解析,而不是在第一次调用时解析
    • 所有对外部函数的调用将直接通过 GOT 进行

使用场景

这个选项主要在以下场景中使用: