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的字段(也就是密码最后修改日期字段)。常见的触发原因包括:
- 目标节点上该用户的
/etc/shadow条目格式异常(字段数不足) - 使用的Salt版本存在已知bug(当前适配Python3.6的Salt版本偏旧,这类问题在新版本中已被修复)
- 密码哈希传递过程中被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
相关产品推荐
相关产品推荐

