You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Salt Stack执行shadow.set_password修改用户密码命令失败问题求助

Salt shadow.set_password 抛出 IndexError: list assignment index out of range 问题排查与解决

我遇到了一个棘手的问题:尝试用Salt修改目标节点vultr.guest上用户的密码时,执行命令后直接抛出了索引越界的错误。以下是详细的问题情况和我整理的解决思路:

执行的命令

sudo salt 'vultr.guest' shadow.set_password user '$6$SALTsalt$3ILXYcVfBr/SosT4SMXKrqtgfR6BYm2XgTLQ/Xy95gpNYT7MOEToBUWw1gtV15U2IVFngh0DtUSsgR6Khlldm1'

返回的错误信息

The minion function caused an exception: Traceback (most recent call last):
File "/usr/lib/python3.6/site-packages/salt/minion.py", line 1934, in _thread_return
function_name, function_args, executors, opts, data
File "/usr/lib/python3.6/site-packages/salt/minion.py", line 1892, in _execute_job_function
return_data = self.executors[fname](opts, data, func, args, kwargs)
File "/usr/lib/python3.6/site-packages/salt/loader/lazy.py", line 149, in __call__
return self.loader.run(run_func, *args, **kwargs)
File "/usr/lib/python3.6/site-packages/salt/loader/lazy.py", line 1201, in run
return self._last_context.run(self._run_as, _func_or_method, *args, **kwargs)
File "/usr/lib/python3.6/site-packages/contextvars/__init__.py", line 38, in run
return callable(*args, **kwargs)
File "/usr/lib/python3.6/site-packages/salt/loader/lazy.py", line 1216, in _run_as
return _func_or_method(*args, **kwargs)
File "/usr/lib/python3.6/site-packages/salt/executors/direct_call.py", line 10, in execute
return func(*args, **kwargs)
File "/usr/lib/python3.6/site-packages/salt/loader/lazy.py", line 149, in __call__
return self.loader.run(run_func, *args, **kwargs)
File "/usr/lib/python3.6/site-packages/salt/loader/lazy.py", line 1201, in run
return self._last_context.run(self._run_as, _func_or_method, *args, **kwargs)
File "/usr/lib/python3.6/site-packages/contextvars/__init__.py", line 38, in run
return callable(*args, **kwargs)
File "/usr/lib/python3.6/site-packages/salt/loader/lazy.py", line 1216, in _run_as
return _func_or_method(*args, **kwargs)
File "/usr/lib/python3.6/site-packages/salt/modules/linux_shadow.py", line 400, in set_password
comps[2] = lstchg
IndexError: list assignment index out of range

已尝试的操作

  • 使用Salt官方提供的密码哈希Python脚本生成了符合SHA-512格式的密码哈希
  • 尝试通过user.remove删除用户后,再用user.add重新创建用户,问题依然存在

问题分析

这个错误的根源很明确:Salt的linux_shadow.py模块在读取/etc/shadow文件时,目标用户对应的条目拆分后得到的字段数量不足,导致无法访问索引为2的字段(也就是密码最后修改日期字段)。常见的触发原因包括:

  1. 目标节点上该用户的/etc/shadow条目格式异常(字段数不足)
  2. 使用的Salt版本存在已知bug(当前适配Python3.6的Salt版本偏旧,这类问题在新版本中已被修复)
  3. 密码哈希传递过程中被Shell意外转义(不过我已经用单引号包裹,这种可能性较低)

解决步骤

1. 检查目标节点的/etc/shadow条目

先登录vultr.guest节点,执行以下命令查看用户的shadow条目格式:

cat /etc/shadow | grep user

正常的shadow条目应该包含9个用冒号分隔的字段,格式示例如下:

user:$6$SALTsalt$...:19450:0:99999:7:::

如果条目字段数不足,说明用户创建过程中出现异常,需要手动修复或重新创建用户。

2. 手动在目标节点更新密码验证

直接在vultr.guest节点执行usermod命令,验证密码哈希是否有效:

usermod --password '$6$SALTsalt$3ILXYcVfBr/SosT4SMXKrqtgfR6BYm2XgTLQ/Xy95gpNYT7MOEToBUWw1gtV15U2IVFngh0DtUSsgR6Khlldm1' user

如果这个命令能成功执行,说明密码哈希是有效的,问题出在Salt模块本身。

3. 升级Salt版本

当前使用的Salt版本适配Python3.6,属于比较旧的版本(比如2018.3.x系列),这个版本的linux_shadow.py模块存在索引越界的已知bug。建议升级到较新的Salt版本(比如3000.x及以上),新版本已经修复了这类问题。

4. 临时替代方案

如果暂时无法升级Salt,可以使用cmd.run模块直接调用系统命令来修改密码:

sudo salt 'vultr.guest' cmd.run "usermod --password '$6$SALTsalt$3ILXYcVfBr/SosT4SMXKrqtgfR6BYm2XgTLQ/Xy95gpNYT7MOEToBUWw1gtV15U2IVFngh0DtUSsgR6Khlldm1' user"

内容的提问来源于stack exchange,提问作者Austin Bennett

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 15:12:49