【问题标题】:"sudo su && somecommand" doesn't run somecommand“sudo su && somecommand”不运行 somecommand
【发布时间】:2016-12-21 21:45:55
【问题描述】:

我今天创建了一个 Jenkins 作业,它的作用是让 Jenkins 用户登录另一台服务器并运行两个由 && 分隔的命令:

ssh -i /creds/jenkins jenkins@servername.com "sh -c 'sudo su && df'"

日志部分工作正常,然后它运行 sudo su 命令并成为 root 但它从不运行第二个命令(即df)。

我什至手动执行此操作,并从 Jenkins 机器登录到另一台服务器(服务器名称)。然后运行sh -c "sudo su && df" 没有运气。

你能帮忙吗?

提前致谢

【问题讨论】:

  • sudo su 启动一个新的shell;该命令在该 shell 退出之前不会退出。最重要的是,df 不在那个 shell 中运行。你可能只想要ssh -i /creds/jenkins jenkins@servername.com 'sudo df'
  • 从什么时候开始需要root权限才能运行df
  • 其实第二个命令不是df。我打了一个例子。我想运行这个命令:lxc exec containername bash
  • sudo lxc exec containername bash,然后。不需要&&,也不需要登录shell(由su - 或最好是sudo -i 创建),除非lxc 取决于在点文件中设置的环境变量。
  • ...要清楚,当您以交互方式运行 sudo su 并获得提示时,当您在该提示下时,sudosu(或他们使用的进程) exec 替换自己)仍在运行,并且它们(或它们的 PID 替换为的后继进程 - 可以是进程 sudosu 被告知执行)继续运行,直到您退出该提示。这就是为什么当您编写一个命令等待sudo(以及您告诉sudo 启动的su 的副本)在它继续执行其他操作之前退出时,它会失败。

标签: bash shell jenkins command-line


【解决方案1】:

如果您尝试以 root 身份运行 df 命令,则应改为使用 sudo df

这是因为使用sudo su && df,您基本上是先执行sudo su,然后再执行df

还要确保你的 jenkins 用户可以是没有密码的 sudo。

【讨论】:

    【解决方案2】:

    sudo su 启动第二个 shell,包含 && df 的命令正在等待在非 root shell 中执行,就在sudo su shell 成功退出之后。

    【讨论】:

      【解决方案3】:

      这可能是您正在寻找的:

      sh -c 'sudo su - root -c "df"'
      

      编辑:请注意,我通常不使用或提倡使用sudo su - root -c 类型的结构。但是,我看到过在通过sudo/gksudo 调用时程序不能正常工作,但通过su/gksu 调用时可以正常工作的罕见情况——在这种情况下,给定用户应该尝试使用@ 987654325@ 首先,如果这不起作用,则可能不得不求助于sudo su - root -c 或类似的方法,作为处理“行为不端”程序的一种解决方法。由于 OP 在他的帖子中使用了一些类似的语法,我认为他的情况可能是这样一种解决方法,所以我在我的答案中保留了 sudo su - root -c 类型的结构。

      【讨论】:

      • sudo du -c root -c "df"sudo df基本相同
      • 它们非常相似,但我见过一些程序不能与 sudo/gksudo 一起工作但它可以与 su/gksu 一起工作的情况(我没有解释为什么会发生这种情况,但我做到了看到它发生)。
      • 是的,但是在这里您要依赖 both sudosu 工作,而不是仅依赖其中一个或另一个功能。两全其美。
      • ...现在,个区别——su - root默认生成一个登录shell,所以你得到了所有的环境变量,这可能是您所指的“案例”——但您也可以通过 sudo 使用 -i 参数来获得它。
      • ...坦率地说,有时登录 shell 是错误的!如果您不相信服务的主目录不会被攻击者修改,那么您肯定不希望在以该服务的用户身份调用命令时运行登录 shell。准确地理解你的代码做了什么(以及为什么某些东西会起作用或不起作用)对于做出关于你想要或不想要哪些行为的明智决定至关重要。此外,通常情况下,sudosu 会有不同的 PAM 配置——在单个命令期间调用这两者很少是有意选择的行为。
      【解决方案4】:

      当您执行sudo su && df 时,sudo su 将立即启动子进程,而无需等待命令的&& df 部分执行,当您点击Ctrl + D 时,它会退出子进程并进入父shell,那是您的 && df 将执行的时间。您应该使用此处的字符串来执行此操作,它可能不是最好的选择,但它可以工作并且它不会启动新的子进程

      sh -c "sudo su" <<<df
      

      注意:不要用任何引号将

      【讨论】:

        猜你喜欢
        • 2014-12-29
        • 1970-01-01
        • 2019-02-19
        • 1970-01-01
        • 2022-01-20
        • 2020-05-15
        • 1970-01-01
        • 2019-12-22
        • 2019-02-12
        相关资源
        最近更新 更多