在 php 中使用 rsync 复制远程文件
Copy remote file with rsync in php
我正在尝试使用 PHP 执行命令 (rsync) 以将文件夹和文件从远程服务器复制到本地文件夹。
这是我在php中写的代码。命令在 SSH 中工作(本地终端和远程 putty.exe
),正确复制文件夹和文件。
但它在 PHP 中不起作用。我能做什么?你知道更好的(secure/optimal)方法吗?
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 在我的服务器和我的本地机器之间创建一个 link。
现在我可以在我的远程机器上使用 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]
我想你遇到了身份问题...:-)
在 cli 上,您是 运行 作为登录用户的命令。
在 PHP 上,您是 运行 作为您的 Web 服务器运行的用户的命令(例如,apache 通常作为 www-data
或 apache
用户运行...)。
我看到的一个可能的解决方案(如果以上是问题的真正原因)是将您的用户添加到网络服务器组...
我还建议您检查网络服务器错误日志,以确定问题的真正原因...:-)
好了,经过很多try/error,我终于把问题切到根上了:
我读了这个guide(和上一个一样,但解释得更好)并且我更改了执行rsync命令的php文件到远程服务器(文件所在的位置)和运行 那里的 rsync.php 文件,它工作得很好。
在机器上执行文件(要复制的文件和rsync.php)
1.- ssh-keygen 生成密钥
ssh-keygen
输入空密码并再次重复空密码。
2.- ssh-copy-id 将 public 密钥复制到远程主机
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 文件,一切都必须正常工作。至少对我有用...
我正在尝试使用 PHP 执行命令 (rsync) 以将文件夹和文件从远程服务器复制到本地文件夹。
这是我在php中写的代码。命令在 SSH 中工作(本地终端和远程 putty.exe
),正确复制文件夹和文件。
但它在 PHP 中不起作用。我能做什么?你知道更好的(secure/optimal)方法吗?
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 在我的服务器和我的本地机器之间创建一个 link。
现在我可以在我的远程机器上使用 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]
我想你遇到了身份问题...:-)
在 cli 上,您是 运行 作为登录用户的命令。
在 PHP 上,您是 运行 作为您的 Web 服务器运行的用户的命令(例如,apache 通常作为 www-data
或 apache
用户运行...)。
我看到的一个可能的解决方案(如果以上是问题的真正原因)是将您的用户添加到网络服务器组...
我还建议您检查网络服务器错误日志,以确定问题的真正原因...:-)
好了,经过很多try/error,我终于把问题切到根上了:
我读了这个guide(和上一个一样,但解释得更好)并且我更改了执行rsync命令的php文件到远程服务器(文件所在的位置)和运行 那里的 rsync.php 文件,它工作得很好。
在机器上执行文件(要复制的文件和rsync.php)
1.- ssh-keygen 生成密钥
ssh-keygen
输入空密码并再次重复空密码。
2.- ssh-copy-id 将 public 密钥复制到远程主机
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 文件,一切都必须正常工作。至少对我有用...