Я пытаюсь выполнить с 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 [email protected]:/path/files/folder /opt/lampp/htdocs/dowloadedfiles/", $output, $exit_code);
РЕДАКТИРОВАТЬ:
Я читал это руководство создать ссылку между моим сервером и моей локальной машиной.
Теперь я могу войти с помощью 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]
Я полагаю, вы испытываете проблемы идентичности… 🙂
В любом случае вы запускаете команду как вошедший в систему пользователь.
На PHP вы запускаете команду от имени пользователя вашего веб-сервера (например, Apache часто запускается как www-data
, или же apache
Пользователь …).
Одно возможное решение, которое я вижу (если вышеупомянутое является реальной причиной проблемы), — это добавить вашего пользователя в группу веб-серверов …
Я бы также посоветовал вам проверить журналы ошибок веб-сервера, чтобы убедиться в истинной причине проблемы … 🙂
Ну, после много попыток / ошибок, я закончил вырезать проблему в корне:
Я читал это руководство (как и последний, но лучше объясненный), и я изменил php-файл, который выполняет команду rsync, на удаленный сервер (где находятся файлы) и запустил там файл 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, и все должно работать. По крайней мере, работал на меня …