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. 修正目标¶
- 让 csh/tcsh 用户(含非交互的
#!/bin/csh作业脚本)与 bash 用户等效:登录即得sinfo/squeue/sbatch/srun/scontrol,并拿到SLURM_CONF_SERVER - 不改用户登录 shell(LDAP 侧不动),不改 Slurm 本体与
slurm.conf - 幂等:重复执行零变更,且 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同步,请勿在站点侧修改)