Если я запустил команду через php exec (): она не работает. Но если я использую bash, он работает отлично. Подумайте, какая проблема может быть. Я думал, возможно, он выполняет rsync как apache и не разрешает вход в ssh.
exec('rsync -au /var/www/html/f1/ user@000.000.000.000:/var/www/html/f2/');
PHP обычно работает в Apache в mod_php
. Обычно Apache работает как собственная учетная запись пользователя, независимая от реальных людей, которые используют сервер.
Таким образом, файлы ~/.ssh
которые хранят ключ без пароля SSH в домашнем каталоге вашей учетной записи пользователя, недоступны для PHP внутри Apache, поскольку у него нет вашего homedir. Даже если Apache поделился вашим домашним каталогом, у него все равно не было бы прав на чтение этих файлов.
Мое исследование этого материала приводит меня к этому: я могу запустить rsync в php, который, в свою очередь, работает под apache. Но я должен учесть некоторые моменты:
Частный ключ аутентификации (возможно, с пустым паролем) должен быть доступен для пользователя 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 к безлицензионному доступу к серверу, который мне нужен для загрузки изображений. Он работает, как я очарован, по мере необходимости, Спасибо всем, кто пытался помочь в моей проблеме.