如何在jenkins exec命令中使用sudo命令

时间:2013-09-20 17:28:31

标签: linux bash shell jenkins

我正在使用jenkins来运行我的构建。

我的一个步骤是复制某些文件并使用sudo将它们放在/ etc / init中

    <exec command="ssh -A ${host-used} '/etc/init.d/ConvertDaemon stop'" outputProperty="result" escape="false">
    </exec>
    <echo msg="${result}" />

    <exec command="ssh -A ${host-used} 'sudo Console/cake init_runners copy_runners_into_initd'" outputProperty="result" escape="false" />
    <echo msg="${result}" />

${host-used} returns www-data@ip-address

问题是第二个命令。

当我运行第一个命令时,我可以在jenkins的控制台日志中看到我的结果。

对于第二个命令,我收到no tty present消息

所以我把第二个命令改为

    <exec command="ssh -t ${host-used} -A ${host-used} 'sudo Console/cake init_runners copy_runners_into_initd'" outputProperty="result" escape="false" />
    <echo msg="${result}" />

我得到了

 Pseudo-terminal will not be allocated because stdin is not a terminal

我如何克服这个问题?

更新

我也试过这个。

    <exec command="ssh -t -t ${host-used} -A ${host-used} 'sudo Console/cake init_runners copy_runners_into_initd'" outputProperty="result" escape="false" />
    <echo msg="${result}" />

我得到了:

bash: www-data@ipaddress: command not found
Connection to ipaddress closed.

我想强调一下命令是否正确使用。但我无法阅读该消息。


UPDATE2:

有时候你会问一个问题,但是你意识到你想问的问题不是你要解决的 REAL 问题。

这个问题是这样的。

我想做的就是执行jenkins运行的一些命令,并查看打印出的命令。这些命令碰巧需要sudo。

Jenkins基本上ssh作为另一个用户www-data来执行这些命令。

我在jenkins中为那些需要sudo的命令打印结果时遇到了麻烦。

在一个可爱的星期六和一些非常有用的SO答案一起工作,我意识到我可以简单地尝试执行那些没有sudo的命令,而不是让jenkins ssh作为root。

有效。

我将用这种方法回答这个问题,因为这就是我想要的 - 在jenkins中执行一些命令并查看它们的打印输出。

5 个答案:

答案 0 :(得分:1)

正在加入的用户没有可用的命令。

如果查看错误,则连接无法运行命令并断开连接

通过这个我不是说sudo我的意思是你在sudo之后所做的事情

Console/cake init_runners copy_runners_into_initd

如果您真的以用户身份运行并运行上述命令,它可能会工作但不能通过您的jenkins脚本,因为可能是您缺少某些环境变量,这些变量是按照正常情况进行ssh时定义的得到一个会议。

我建议使用完整路径,包括:

哪个sudo

sudo is /usr/bin/sudo

sudo放弃的完整路径确保它与此毫无关系。

<强>已更新

嗨Kimsia

感谢您回复评论,现在确认您已经修复了,我仍然认为您使用sudo所做的事情有些缺失,因为返回消息明确指出命令未找到。对我来说,看起来虽然你运行sudo你实际上的路径无法运行console / cake,即找不到命令!

如果您仍然希望沿着sudo路线走下去,可以尝试一些事情,因为我确实认为安全性比打开root ssh访问更安全。

  1. 使用-i运行sudo以获取root的配置文件,然后实际将目录更改为Console文件夹和cake命令所在的位置。
  2.   

    &lt; exec command =“ssh -t -t -A $ {host-used}'sudo -i cd   /路径/到/ cakephp中/应用程序;控制台/蛋糕init_runners   copy_runners_into_initd'“outputProperty =”result“escape =”false“/&gt;

    1. 是不是可以编写一个sudo在
    2. 中的shell脚本
      #!/bin/bash
      function ssh_and_run_cake() { 
      
       echo "Working on $hostname --- $instance --::"
       $ssh -t $hostname "sudo su -i '
          echo \"CD Folder run cake init -----------------\";
          cd /path/to/cakephp/app; 
          Console/cake init_runners copy_runners_into_initd;
          echo \"All done------------------------\";
       '";
      
      }
      
      function rollout_cake() {
      
         #for hostname in ${h[@]}; do
      
      
              hostname="yourhost"
      
              ssh_and_run_cake
        # done
      
      }
      
           

      rollout_cake

      从jenkins web界面使用execute shell脚本,然后调用此脚本并执行你想要的内容。

      我看到詹金斯用这种方法很好地解决了这个问题

      只要在第二个函数中定义主机名,就更新了shell脚本。

      然后,您需要使用jenkins Web前端部署选项来执行shell脚本并定义完整路径脚本。该脚本应该位于jenkins服务器的本地文件系统

答案 1 :(得分:1)

我认为您不需要两次指定主机。

<exec command="ssh -t -t -A ${host-used} 'sudo Console/cake init_runners copy_runners_into_initd'" outputProperty="result" escape="false" />
<echo msg="${result}" />

答案 2 :(得分:0)

Jenkins无法打印出使用sudo执行的某些命令的结果。

因此,最好的方法是简单地允许jenkins以root身份ssh来执行那些没有sudo的命令。

  1. 允许jenkins用户以root身份ssh而无需密码。
  2. 阅读this,了解如何在没有密码的情况下登录ssh。
  3. 然后,像这样编写命令: <exec command="ssh -A ${root-used} 'Console/cake init_runners copy_runners_into_initd'" outputProperty="result" escape="false" /> <echo msg="${result}" />
  4. 请注意,${root-used}的值应为root@ipaddress

答案 3 :(得分:0)

如果用户以前连接的是交互式帐户,则Jenkins无法执行sudo命令。这可以通过使sudoer广告非交互式来解决。

在目标linux框上尝试此命令:

echo "%sudo ALL=(ALL) NOPASSWD: *command*" >> /etc/sudoers

答案 4 :(得分:0)

虽然我知道OP只是想测试一些东西,允许任何用户无密码ssh访问root可能会被安全意识所忽视。我发现igor-chubin可能是允许jenkins在this answer中使用提升权限运行特定命令/脚本的最合适的方法。