3

我正在使用 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.

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


更新2:

有时您提出问题,但随后您意识到您要提出的问题并不是您要解决的真正问题。

这个问题是这样的。

我想要做的就是执行一些由 jenkins 运行的命令并查看命令的打印输出。这些命令恰好需要 sudo。

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

对于需要 sudo 的命令,我无法在 jenkins 中打印结果。

在度过了一个愉快的星期六并提供了一些非常有用的 SO 答案之后,我意识到我可以通过将 jenkins ssh 作为 root 来简单地尝试在没有 sudo 的情况下执行这些命令。

有效。

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

4

5 回答 5

1

正在登录的用户没有可用的命令。

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

我的意思不是 sudo 我的意思是你在 sudo 之后做了什么

Console/cake init_runners copy_runners_into_initd

可能是,如果您实际上以用户身份 ssh 并运行上述命令,它可以工作,但不能通过您的 jenkins 脚本,因为您可能缺少一些环境变量,这些环境变量是在您正常 ssh 并获得会话时定义的.

我建议使用所有内容的完整路径,包括:

哪个须藤

sudo is /usr/bin/sudo

sudo 的完整路径可以放心,这与此无关。

更新

嗨,基姆西亚

感谢您的评论,现在确认您已修复,我仍然认为您对 sudo 所做的事情缺少一些东西,因为返回消息清楚地表明找不到命令。在我看来,尽管您运行了 sudo ,但您实际所在的路径无法运行控制台/蛋糕,即找不到命令!

如果您仍然想走 sudo 路线,可以尝试一些事情,因为我相信安全方面比打开 root ssh 访问更安全。

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

<exec command="ssh -t -t -A ${host-used} 'sudo -i cd /path/to/cakephp/app; 控制台/cake init_runners copy_runners_into_initd'" outputProperty="result" escape="false" / >

  1. 难道不能写一个 sudo 所在的 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 界面使用执行 shell 脚本,然后应该调用这个脚本并执行你想要的。

我已经看到詹金斯用这种方法工作得很好

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

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

于 2013-09-20T18:08:17.433 回答
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}" />
于 2013-09-20T23:02:47.413 回答
0

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

因此,最好的方法是简单地允许 jenkins 以 root 身份 ssh 以在不使用 sudo 的情况下执行相同的命令。

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

请注意,${root-used}应该有一个像root@ipaddress

于 2013-09-21T06:23:08.943 回答
0

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

在目标 linux 机器上试试这个命令:

echo "%sudo ALL=(ALL) NOPASSWD: *command*" >> /etc/sudoers
于 2014-03-20T23:53:14.560 回答
0

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

于 2016-04-08T21:58:36.030 回答