跳转至

Slurm 环境注入单轨缺口:csh 用户拿不到集群命令

归档日期:2026-10-05 证据等级:【实测】(.28 提交节点 / .18 计算节点只读探测) 范围:Slurm × Lmod 的登录环境注入(/etc/profile.d/),不含 Slurm 本体安装 状态:缺口已定位;修正动作归属「Slurm 部署器」项目,本工作区未改动任何系统文件 关联:docs/BASELINE.md §7.10、docs/HANDOFF.md 第 2 节未完成事项 #10


1. 背景(实测事实)

  • 站点:Rocky Linux 9.8;Slurm 26.05.2 源码安装于 /usr/local/slurm(非 rpm)
  • 控制主备 192.168.31.16/.17,计算节点 .18/.19/.20,统一提交节点 .28
  • LDAP 域用户默认 shell = /bin/csh(实测 getent passwd:cy01、rain01 均为 /bin/csh),业务用户共 8 个
  • 启动文件路由(关键):
  • bash/POSIX 侧由 /etc/profile 遍历 /etc/profile.d/*.sh
  • csh/tcsh 侧由 /etc/csh.login:34、/etc/csh.cshrc:55 遍历 /etc/profile.d/*.csh
  • 两侧互不通用:.sh 不会被 csh 读,.csh 不会被 bash 读
  • 实测现象:su - cy01(干净登录态)下 sinfo / sbatch / srun 全部 Command not found,PATH 中无 /usr/local/slurm/*
  • 对照:slurm/26.05.2 模块在 csh 侧可用(module 为正常 alias,module avail 可见 cadence/pdk/siemens/synopsys/slurm/26.05.2)⇒ csh 用户的临时补救是 module load slurm

2. 缺口:单轨 vs 双轨

组件 sh 侧 csh 侧 判定
Lmod 初始化 zzz_site_lmod.sh zzz_site_lmod.csh 双轨 ✓
MODULEPATH 00-modulepath.sh 00-modulepath.csh 双轨 ✓
modules 命令 modules.sh modules.csh 双轨 ✓
Slurm PATH slurm-path.sh 缺 单轨 ✗
SLURM_CONF_SERVER slurm_configless.sh 缺 单轨 ✗

结论:同一生成器对 Lmod 是双轨,对 Slurm 是单轨 ⇒ csh 用户既拿不到集群命令,也拿不到 configless 模式所需的 SLURM_CONF_SERVER。

注意:/opt/modulefiles/Core/slurm/26.05.2.lua 的 help 写有「集群已有 /etc/profile.d 兜底」——该表述对 csh 用户不成立,属作者假设偏差,应一并更正。

3. 修正目标

  1. 让 csh/tcsh 用户(含非交互的 #!/bin/csh 作业脚本)与 bash 用户等效:登录即得 sinfo / squeue / sbatch / srun / scontrol,并拿到 SLURM_CONF_SERVER
  2. 不改用户登录 shell(LDAP 侧不动),不改 Slurm 本体与 slurm.conf
  3. 幂等:重复执行零变更,且 PATH 不重复追加;新文件权限属主与同目录既有文件一致(root:root 0644)

4. 参考改法

新增 /etc/profile.d/slurm-path.csh(csh 无 export、不支持 2>&1,且需判重):

# Slurm 命令路径(由 slurm 部署器写入,请勿手工修改)
set SLURM_PREFIX="/usr/local/slurm"
if ( "${PATH}" !~ "*${SLURM_PREFIX}/bin*" ) then
    setenv PATH "${SLURM_PREFIX}/bin:${SLURM_PREFIX}/sbin:${PATH}"
endif
unset SLURM_PREFIX

新增 /etc/profile.d/slurm_configless.csh:

# Auto-generated by slurm_deployer (do not edit manually)
setenv SLURM_CONF_SERVER "slurm-master-01:6817,slurm-master-02:6817"

该值建议与 .sh 版从同一模板变量渲染,避免两处硬编码产生漂移。

修正 slurm/26.05.2.lua 的 help 文案:

sh/bash 用户由 /etc/profile.d/slurm-path.sh 兜底;
csh/tcsh 用户由 /etc/profile.d/slurm-path.csh 兜底。
本模块用于脚本中显式声明依赖版本。

5. 验收判据

su - cy01 -c "which sinfo sbatch srun squeue"   # 四条全部命中 /usr/local/slurm/bin
su - cy01 -c "printenv SLURM_CONF_SERVER"        # 有值
su - cy01 -c "sinfo -N -l | head -5"             # 能列出节点与分区
su - rain01 -c "printenv PATH"                   # bash 侧不回归,仍含 /usr/local/slurm/bin
# 幂等:重复执行部署动作,第二次零变更;PATH 中不出现第二份 /usr/local/slurm/bin

6. 未取证 / 待确认

  • 「csh 版缺失」是生成器逻辑未写、写后未同步,还是人工遗漏——仅有产物证据,无法归因,需在部署器项目侧核对生成逻辑
  • 是否存在其他同类单轨产物:建议用「sh 有则 csh 应有」做一次全量对账,Lmod 那几组文件即双轨基线
  • 现有 bash PATH 中 /usr/local/slurm/bin 已出现两份 ⇒ 注入未判重,补 csh 版时把去重逻辑一并带上

7. 取证方法与复现命令

# 域用户默认 shell
getent passwd cy01 rain01 | awk -F: '{print $1, $7}'

# csh 干净登录态(真实默认 shell 视角,勿用 bash -lc 代替)
su - cy01 -c "printenv PATH; which sinfo sbatch srun"

# 启动文件路由
grep -n "profile.d" /etc/profile /etc/csh.login /etc/csh.cshrc

# sh / csh 双轨对账
ls -1 /etc/profile.d/ | grep -E "slurm|module|site"

# csh 侧 Lmod 可用性(csh 不支持 2>&1,勿加)
su - cy01 -c "which module"
su - cy01 -c "module avail"

取证教训:runuser -u rain01 -- bash -lc 会走 bash 登录链并读到 profile.d/*.sh,得到「全局可用」的假阳性;验证登录环境必须用 su - <user>(走用户真实默认 shell)。


来源:/home/rain/Documents/eda_tools_ins/design/docs/SLURM-CSH-INJECTION-GAP.md | 最后更新:2026-10-05 13:48(由 build/sync.py 同步,请勿在站点侧修改)