繁体   English   中英

持续集成-带有SSH的exec rsync静默失败

[英]Continuous integration - exec rsync with ssh fails silently

我已经花了几天的时间来绞尽脑汁,却一无所获。

我有一个Jenkins持续集成服务器,该服务器都在AWS上构建到单独的nginx Web服务器。

问题

当构建服务器用户通过PHP passthru()运行我的rsync命令时,它默默失败。

为了在构建后在服务器之间移动文件,我正在使用一个PHP脚本,该脚本使用rsyncssh连接来更新Web服务器。 该代码段如下。

PHP:

$rsync = "rsync -avzlO --no-g -e 'ssh -i ".$identity." -o UserKnownHostsFile=/dev/null \
-o StrictHostKeyChecking=no' ".$workspace." root@".$host.":/var/www/public_html/";
echo($rsync);
echo(passthru($rsync));

通过命令行执行此命令(通过php name-of-file.php调用)或仅通过运行echoed命令即可成功执行rsync。 但是,当通过Jenkins服务器调用该命令作为构建后步骤时,该命令会静默失败。

注意:我有权访问ec2-userec2-user用户。 Jenkins运行的用户是jenkins用户。 我已经通过运行echo(exec('whoami'));确认了这一点echo(exec('whoami')); 紧接在rsync之前。

我尝试过的

感觉就像是权限或所有者错误。 我把它们弄乱了,直到我的眼睛快要流血了。

目前,他们的立场如下:

-rw------- 1 jenkins  ec2-user 1679 Feb 12 01:37 jenkins.pem
-rwxrwxr-x 1 jenkins  ec2-user 4097 Feb 12 01:51 push_to_cluster_l4.php

我尝试创建一个新的ssh密钥对,并验证它允许无密码登录到Web服务器。

我试图将passthru()更改为exec()system()

我添加了通过回声记录passthru()调用,管道传输到文件,分配给变量并输出的方法,但无济于事-每次都无提示地失败。

我知道我试图实现的目标是可能的,因为它不仅可以在通过Shell执行时起作用,而且相同的代码可以为部署到我们的其他集群提供动力。 只是有些挂断阻止了新Web服务器上的部署发生。

谢谢参观。

问题是客户端上配置不正确的公共SSH密钥。 它存在时,它不在.ssh目录中,也不属于Jenkins用来连接rsync 解决此问题后,我就可以毫无问题地进行连接。

外卖? 当SSH密钥文件不允许在目标位置进行无密码登录时, rsync静默失败。 希望我的时间和挫败感会在将来帮助一些可怜的灵魂。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM