我已经在这个问题上绞尽脑汁待了好几天,而我却无处可去。
我有一个Jenkins持续集成服务器,它在AWS上构建一个单独的nginx web服务器。
我的rsync命令,当构建服务器用户通过PHP passthru()
运行时,会以静默方式失败。
要在构建之后在服务器之间移动文件,我使用的PHP脚本使用rsync
和ssh
来连接以更新网络服务器。该片段在下方。
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-user
用户。 Jenkins运行的用户是jenkins
用户。我已在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密钥对,并验证它是否允许无密码登录到网络服务器。
我尝试将passthru()
更改为exec()
和system()
我已经通过echo添加了passthru()
调用的日志记录,管道传输到文件,分配给变量并输出,无济于事 - 每次都无声地失败。
我知道我想要实现的是可能的,因为它不仅在通过shell执行时起作用,而且相同的代码也支持部署到其他集群。在某个地方只有一些挂断,阻止了部署在新的网络服务器上发生。
谢谢你看看。
答案 0 :(得分:3)
问题是客户端配置错误的公共SSH密钥。虽然它存在,但它不在.ssh
目录中,并且不是Jenkins用来连接rsync
的用户所拥有的。一旦我解决了这个问题,我就可以毫无问题地连接。
外卖?当SSH密钥文件不允许在目的地进行无密码登录时,rsync
将无提示失败。希望我的时间和挫折能帮助将来一些可怜的人。