【问题标题】:Access is denied when running mkdir command from Jenkins从 Jenkins 运行 mkdir 命令时访问被拒绝
【发布时间】:2023-07-05 16:58:01
【问题描述】:

我正在尝试创建一个新目录并将文件复制到其中。所以我正在使用“执行批处理命令”的工作。

首先我尝试运行:robocopy source destination /e.
然后我尝试了:mkdir destination。在这两种情况下,我都收到“拒绝访问”消息。

如果我自己手动尝试,我可以创建一个目录并将文件复制到其中。
目标是远程计算机的共享文件夹:\computerName\sharedFolder\

有人知道如何通过 Jenkins 获得访问权限吗?

【问题讨论】:

    标签: jenkins mkdir


    【解决方案1】:

    我知道这篇文章有点老了,但我发现了两个效果很好的解决方案,所以我发布它以防有人需要它。

    首先:允许当前运行的磁盘使用 在您的“执行批处理命令”上,您可以添加一行:

    net use \\server\folder /USER:domain\user password
    

    然后你可以在你的命令中使用 \server\folder 并且它会工作。 Jenkins 甚至可以处理凭证,因此没有纯文本。

    第二种解决方案是以特定用户身份启动 Jenkins,以便所有命令都以该用户身份运行。 为此:

    1. 在 Windows 中打开服务应用程序
    2. 搜索詹金斯
    3. 右键,属性
    4. 在“登录”选项卡上配置您要使用的凭据
    5. 重启 Jenkins

    我希望这对某人有所帮助

    【讨论】:

      【解决方案2】:

      要找出运行作业的用户,请在 Jenkins 中创建一个“临时”作业。给它一个“执行 Windows 批处理命令”构建步骤并输入“set”作为批处理命令的文本。如果您受影响的作业正在 Windows 从站上运行,请确保该作业在同一从站上运行。运行作业。您的控制台将显示该作业已知的环境变量列表,就像您在桌面上的命令提示符窗口中键入“set”一样。不同之处在于在底部附近,命令窗口中“USERDOMAIN”和“USERNAME”显示的用户名将是您(您登录的用户);在控制台输出中,它将是运行 Jenkins 作业的用户帐户。

      该用户实际上可能没有登录权限。而且,如果 Jenkins 作为服务运行,您不能只在命令窗口中设置共享:Jenkins 作业在不同的 Windows“会话”下运行,并且该会话不会看到您在登录会话中创建的共享。

      让您摆脱困境的一种不太安全的方法是为您的工作添加用户名(字符串参数)和密码(密码参数)的参数。在您需要访问驱动器之前,无论是在同一构建步骤中还是在该构建步骤之前运行的“执行 Windows 批处理命令”步骤中,运行“@net use : \computername\sharename %% /USER:%% /坚持:没有”。 (例如:“@net 使用 p:\COMPUTER\SHARE %PASSWORD% %USER% /persistent:no”)。 “@”将防止密码显示在日志中。 (但是,密码将与作业相关联,如果启用“允许重建”,密码将在 Jenkins 中编码。)确保完成后清理(“net use /delete”),您可能需要测试和在尝试连接之前清理驱动器号,以防之前的作业在未释放驱动器号的情况下失败。

      在这种情况下,您必须为运行作业时可以访问共享的人输入用户名和密码。您可以使用预先填写的这些值对隐藏参数进行编码,但这意味着用户的用户名和密码被编码到作业定义中,并且隐藏密码参数的默认值不会在 Jenkins 配置文件中加密。

      肯定有更安全的方法可以在 Jenkins 服务会话中启用驱动器共享,但根据您的环境,这可能“足够好”,可以让您克服现在面临的障碍。我在不是 Jenkins 管理员的环境中使用过类似的技巧,并且我对 Jenkins 从属服务器的访问权限非常有限(也没有管理员权限)。

      【讨论】:

      • 谢谢你,你真棒。虽然这样可行,但我想知道是否有办法隐藏密码?或者我应该为这份工作创建一个新帐户?建议我应该做什么?非常感谢!
      • 当你说“隐藏密码”时,你是什么意思?它不应该出现在哪里?如果您在命令前面使用了“@”,DOS 将不会回显该命令。如果您的参数是“密码”参数,则该作业运行的值应该被加密。你在别的地方看到了吗?
      • 如果你转储你的环境——我通常会这样做——你可以使用“set | findstr -v (PASSWORD_PARAMETER_NAME)”删除密码,例如,“set | findstr -v PASSWORD”。
      【解决方案3】:

      在我的设置中,Jenkins 从服务在特定用户(名为 jenkins)下运行。
      它使验证特定用户的访问权限变得容易。
      当然 jenkins 需要对远程文件夹具有写入权限,包括物理磁盘和共享。

      【讨论】:

        最近更新 更多