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

Jenkins流水线挂载Windows共享失败:Kerberos票据问题排查

问题诊断

这个错误的核心原因是:Jenkins执行kinit是在**Jenkins运行用户(比如jenkins)**的环境下生成Kerberos票据,但后续的mount命令用sudo切换到了root用户,而root的Kerberos缓存里没有对应的票据,导致内核找不到认证密钥,抛出mount error(126)。

你提到root shell下能正常运行,因为root环境下执行kinit生成的票据直接存在root的缓存里,mount时能直接读取。

解决方案

方案1:让sudo继承Kerberos环境变量

Kerberos票据的位置由环境变量KRB5CCNAME指定,默认是用户家目录下的缓存文件。我们需要让sudo执行mount时继承这个变量,让root能访问到Jenkins用户生成的票据。

步骤:

  1. 修改sudoers配置,允许Jenkins用户在sudo时保留环境变量:
    执行visudo,添加以下内容(替换jenkins为你的Jenkins运行用户):

    jenkins ALL=(ALL) NOPASSWD: SETENV: /usr/bin/mount
    

    这行配置允许Jenkins用户无需密码执行mount,并且保留环境变量。

  2. 修改bash脚本,显式指定票据缓存路径并传递给sudo:

    # 显式设置票据缓存路径,确保root能读取(注意权限)
    export KRB5CCNAME="/tmp/krb5cc_$(id -u)"
    # 重新生成票据(去掉-R,因为如果没有现有票据,-R会失败)
    kinit -V -k -t "$WINRM_KERBEROS_KEYTAB" "$user"
    # 使用-E参数让sudo继承环境变量
    sudo -E mount -v -t cifs -o username="$user",sec=krb5,uid="$USER",gid="$USER",vers=2.1 "${smb_path}" "${mount_point}"
    

方案2:在sudo环境下生成Kerberos票据

如果方案1的权限调整有困难,可以直接在sudo环境下执行kinit和mount,确保票据生成在root的缓存里。但需要确保keytab文件对root可读:

步骤:

  1. 调整keytab文件权限,让root能读取:

    sudo chown root:root "$WINRM_KERBEROS_KEYTAB"
    sudo chmod 600 "$WINRM_KERBEROS_KEYTAB"
    
  2. 修改bash脚本,把kinit和mount都放到sudo里:

    sudo bash -c "
        kinit -V -k -t '$WINRM_KERBEROS_KEYTAB' '$user'
        mount -v -t cifs -o username='$user',sec=krb5,uid='$USER',gid='$USER',vers=2.1 '${smb_path}' '${mount_point}'
    "
    

额外检查项

  • 确认Jenkins用户能读取keytab文件:执行ls -l $WINRM_KERBEROS_KEYTAB,确保Jenkins用户有读权限。
  • 检查kinit是否成功:在脚本里添加klist命令,查看票据是否生成,比如:
    kinit -V -k -t "$WINRM_KERBEROS_KEYTAB" "$user"
    klist  # 输出票据信息,确认生成成功
    
  • 确认CIFS版本兼容:vers=2.1是否和Windows服务器匹配,如果服务器支持更高版本(比如3.0),可以尝试替换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 22:05:25