Rsync через PHP exec () с SSH без пароля ssh login

Если я запустил команду через php exec (): она не работает. Но если я использую bash, он работает отлично. Подумайте, какая проблема может быть. Я думал, возможно, он выполняет rsync как apache и не разрешает вход в ssh.

exec('rsync -au /var/www/html/f1/ user@000.000.000.000:/var/www/html/f2/'); 

Solutions Collecting From Web of "Rsync через PHP exec () с SSH без пароля ssh login"

PHP обычно работает в Apache в mod_php . Обычно Apache работает как собственная учетная запись пользователя, независимая от реальных людей, которые используют сервер.

Таким образом, файлы ~/.ssh которые хранят ключ без пароля SSH в домашнем каталоге вашей учетной записи пользователя, недоступны для PHP внутри Apache, поскольку у него нет вашего homedir. Даже если Apache поделился вашим домашним каталогом, у него все равно не было бы прав на чтение этих файлов.

Мое исследование этого материала приводит меня к этому: я могу запустить rsync в php, который, в свою очередь, работает под apache. Но я должен учесть некоторые моменты:

  • Домашние каталоги должны существовать для пользователя, под учетной записью которого веб-сервер запускается на локальном компьютере (возможно, http) и для удаленного пользователя, под учетной записью, которую вы подключаете к удаленному хосту.
  • Частный ключ аутентификации (возможно, с пустым паролем) должен быть доступен для пользователя http. Соответствующий открытый ключ должен быть добавлен к удаленному

     ~/.ssh/authorized_keys 

    файл. Здесь ~ – домашний каталог удаленного пользователя на удаленном хосте.

  • Локальный файл конфигурации

     ~/.ssh/config 

    должен быть создан. Здесь ~ – домашний каталог пользователя http на локальном хосте. Файл config должен быть доступен только для пользователя http. Он может содержать что-то вроде этого:

     Host * User=www-data IdentityFile=~/.ssh/nopass_rsa Compression=no Ciphers=arcfour StrictHostKeyChecking=no UserKnownHostsFile=/dev/null 

    Здесь User является именем пользователя на удаленном узле, IdentityFile является ключевым файлом. Следующие два параметра ( Compression и Ciphers ) позволяют немного увеличить пропускную способность. И последние два параметра позволяют пропустить проверку ключа хоста.

  • Если вы имеете дело с ~/.ssh каталогом локального http-пользователя и ~ является корневым каталогом для веб-сервера в то же время, то есть проблема с безопасностью: вы (или кто-либо еще) можете получить доступ к вашим файлам ключей, просто набрав

     www.your-domain.com/.ssh/ 

    в браузере. Поэтому отказ в доступе к этому каталогу в конфигурации веб-браузера будет хорошей идеей.

Мой пример php-кода:

 exec('rsync -auq remote.host.com:/archive/ ./backup_bd/'); 

который просто работает …

Думаю, я ответил на ваш вопрос.

Вот как вы указываете, где SSH подбирает ваши ключи:

 exec('rsync -e "ssh -i /home/you/.ssh/id_dsa" ...') 

Я предполагаю, что Apache работает под пользователем, который может читать ваши id_dsa или id_rsa .

сохраните команду в сценарии оболочки, так как она не имеет динамических частей, а затем используйте exec () для выполнения сценария оболочки.

 # on command line echo 'rsync -au /var/www/html/f1/ user@000.000.000.000:/var/www/html/f2/' > sync_files # On command line chmod +x sync_files <?php // in php exec('sync_files'); ?> 

Поскольку ни одно из приведенных выше предложений не будет работать, я должен был разрешить доступ учетной записи пользователя Apache к безлицензионному доступу к серверу, который мне нужен для загрузки изображений. Он работает, как я очарован, по мере необходимости, Спасибо всем, кто пытался помочь в моей проблеме.