Подтвердить что ты не робот

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

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

exec('rsync -au /var/www/html/f1/ [email protected]:/var/www/html/f2/');
4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

    ~/.ssh/authorized_keys 
    

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

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

    ~/.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/');

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

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

Ответ 4

Здесь, как вы укажете, где SSH возьмет ваши ключи:

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

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

Ответ 5

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

# on command line    
echo 'rsync -au /var/www/html/f1/ [email protected]:/var/www/html/f2/' > sync_files

# On command line
chmod +x sync_files

<?php
// in php
exec('sync_files');
?>