У меня есть DMZ с веб-сервером под управлением Ubuntu 11.04 и сервером приложений под управлением Ubuntu 11.10. Я настроил все так, что могу scp с веб-сервера на сервер приложений, запустив
ssh-keygen
ssh-copy-id [email protected]
где 192.168.1.6 — локальный IP-адрес сервера приложений, а peter — имя моей учетной записи. Однако я хотел бы скопировать файлы в ответ на вызов через веб-сайт на базе LAMP с помощью команды в файле PHP. Моя проблема в том, что «пользователь» моих веб-приложений — www-data, который не является реальным пользователем, поэтому я не могу создать для него ключи.
Я попробовал описанную процедуру.здесь. Затем я сделал
su
su www-data
на веб-сервере (я предполагаю, что "сервер" согласно обсуждению в Беркли). К сожалению, меня все еще просят ввести пароль, когда я пытаюсь выполнить scp для сервера/клиента приложений.
Я пытался
scp -vv /var/www/Src/*.txt 192.168.1.6:/var/www/Dest
Вывод был почти таким же, как когда я (успешно) scp из аккаунта peter. Однако эти последние несколько строк отличаются.
debug1: Authentications that can continue: publickey,password
debug1: Offering DSA public key: /var/www/.ssh/id_dsa
debug2: we sent a publickey packet, wait for reply
debug1: Authentications that can continue: publickey,password
debug1: Offering ECDSA public key: /var/www/.ssh/id_ecdsa
debug2: we sent a publickey packet, wait for reply
debug1: Authentications that can continue: publickey,password
debug2: we did not send a packet, disable method
debug1: Next authentication method: password
[email protected]'s password:
Я был бы очень признателен, если бы кто-нибудь мог мне сказать или помочь найти, в чем проблема.
решение1
Прочитав ссылку, которую вы дали: убедитесь, что вы используете authorized_keys, а не authorized_keys2. Последний уже много лет не поддерживается и вообще не работает в некоторых версиях OpenSSH.
Самый простой способ диагностировать это — отладить экземпляр SSH-сервера. На сервере выполните:
# /usr/sbin/sshd -ddep 2222
... который запускает демон SSH в режиме отладки, прослушивая порт 2222. Повторите команду scp следующим образом:
$ scp -o port=2222 ...
... и посмотрим, что скажет сервер.
Что касается безопасности Джона: если вы решите продолжить использовать учетную запись www-data, вы можете ограничить ее ключ только определенными действиями (например, передачей определенных файлов), используя опцию «принудительной команды» в authorized_keys.
решение2
Вы сказали, что пробовали
scp -vv /var/www/Src/*.txt 192.168.1.6:/var/www/Dest
Но ключ, который вы хотели бы использовать, нигде не появляется. Попробуйте:
scp -vvv -i /path/to/private/key /var/www/Src/*.txt 192.168.1.6:/var/www/Dest
В любом случае, вам следует убедиться, что ваше соединение ограничено этой конкретной командой. Я не уверен, что SCP предоставляет способы ограничить команду (например, принудительную команду с SSH). Тогда я бы вместо этого использовал SSH через rsync, чтобы убедиться, что будет запущена только команда rsync. Это предоставляет в основном ту же услугу, что и scp, но ваш ключ затем может быть помечен командой force, что может быть безопаснее.
решение3
Я использовал inotify для реализации метода, предложенного Джоном Гарденьерсом. Это было просто, и теперь работает отлично. Я только что написал приложение C++, которое выполняет scp при изменении файла в каталоге, как это можно сделать из кода PHP. Работает отлично.
Спасибо,
Питер.