我尝试使用PHP执行命令(rsync)将文件夹和文件从远程服务器复制到本地文件夹。
这是我在php中编写的代码。 SSH中的命令工作(本地终端和带putty.exe
的远程),正确复制文件夹和文件。
但它在PHP中不起作用。我能做什么?你知道更好(安全/最佳)的方法吗?
exec("echo superuserpassword | sudo -S sshpass -p 'sshremoteserverpassword' rsync -rvogp --chmod=ugo=rwX --chown=ftpuser:ftpuser -e ssh remoteserveruser@remoteserver.com:/path/files/folder /opt/lampp/htdocs/dowloadedfiles/", $output, $exit_code);
修改 我已阅读此guide以在我的服务器和本地计算机之间创建链接。
现在我可以在没有密码的远程计算机上使用ssh登录。
我改变了命令:
rsync -crahvP --chmod=ugo=rwX --chown=ftpuser:ftpuser remote.com:/path/to/remote/files /path/to/local/files/
此命令在终端中也有效,但是当我用exec php命令发送它时,它再次失败,但是我又得到了另一个错误:127。
正如MarcoS在回答中所说,我检查了error_log。
消息是这样的:
ssh: relocation error: ssh: symbol EVP_des_cbc, version OPENSSL_1.0.0 not defined in file libcrypto.so.1.0.0 with link time reference
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: remote command not found (code 127) at io.c(226) [Receiver=3.1.1]
答案 0 :(得分:1)
我想你遇到了身份问题 ......: - )
在cli上,您以登录用户身份运行命令
在PHP上,您以运行Web服务器的用户身份运行命令(例如,apache通常以www-data
或apache
用户运行...)。
我看到的一个可能的解决方案(如果以上是问题的真正原因),就是将您的用户添加到Web服务器组......
我还建议您检查网络服务器错误日志,以确定问题的真正原因......: - )
答案 1 :(得分:1)
好吧,经过多次尝试/错误后,我完成了在root中解决问题:
我引用了这个guide(就像最后一个,但更好地解释了)并且我将执行rsync命令的php文件更改为远程服务器(文件所在的位置)并在那里运行rsync.php文件,它运作得很好。
使用文件(要复制的文件和rsync.php)在机器中执行
1.- ssh-keygen生成密钥
ssh-keygen
输入空密码并再次重复空密码。
2.- ssh-copy-id将公钥复制到远程主机
ssh-copy-id -i ~/.ssh/id_rsa.pub remoteserveraddressip(xxx.xxx.xxx.xxx)
rsync.php文件:
exec("rsync -crahvP /path/in/local/files/foldertocopy remoteuser@remoteserveraddress:/path/in/remote/destinationfolder/", $output, $exit_code);
完成所有这些后,导航到rsync.php文件,所有文件都必须正常工作。至少为我工作......