我正在使用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中执行一些命令并查看它们的打印输出。
答案 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访问更安全。
&lt; exec command =“ssh -t -t -A $ {host-used}'sudo -i cd /路径/到/ cakephp中/应用程序;控制台/蛋糕init_runners copy_runners_into_initd'“outputProperty =”result“escape =”false“/&gt;
#!/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的命令。
<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
答案 3 :(得分:0)
sudo
命令。这可以通过使sudoer广告非交互式来解决。
在目标linux框上尝试此命令:
echo "%sudo ALL=(ALL) NOPASSWD: *command*" >> /etc/sudoers
答案 4 :(得分:0)
虽然我知道OP只是想测试一些东西,允许任何用户无密码ssh访问root可能会被安全意识所忽视。我发现igor-chubin可能是允许jenkins在this answer中使用提升权限运行特定命令/脚本的最合适的方法。