У меня есть DMZ с веб-сервером под управлением Ubuntu 11.04 и сервером приложений под управлением Ubuntu 11.10. Я настроил все так, чтобы я мог scp с веб-сервера на сервер приложений, запустив
ssh-keygen
ssh-copy-id peter@192.168.1.6
где 192.168.1.6 - это локальный IP-адрес приложения. server и peter - это имя моей учетной записи. Однако я хотел бы скопировать файлы в ответ на вызов через веб-сайт на основе LAMP, используя команду в файле PHP. Моя проблема в том, что «пользователем» моих веб-приложений являются www-data, которые не являются реальным пользователем, поэтому я не могу создавать для них ключи.
Я попробовал описанную процедуру Вот. Я тогда сделал
su
su www-data
на веб-сервере (я предполагаю, что это «сервер» согласно обсуждению в Беркли). К сожалению, у меня все еще спрашивают пароль, когда я пытаюсь подключиться к серверу / клиенту приложений.
Я попытался
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
www-data@192.168.1.6's password:
Я был бы очень признателен, если бы кто-нибудь мог сказать мне или помочь найти, в чем проблема.
Я использовал inotify для реализации метода, предложенного Джоном Гарденерсом. Это было легко, и теперь все работает нормально. Я только что написал приложение на C ++, которое выполняет scp при изменении файла в каталоге, как это можно сделать из кода PHP. Работает отлично.
Спасибо,
Питер
Вы сказали, что пробовали
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, что может быть безопаснее.
Прочитав ссылку, которую вы дали: убедитесь, что вы используете authorized_keys, а не authorized_keys2. Последний не рекомендуется в течение многих лет и вообще не работал в некоторых версиях OpenSSH.
Самый простой способ диагностировать это - использовать отладочный экземпляр SSH-сервера. На сервере запустите:
# /usr/sbin/sshd -ddep 2222
... который запускает демон SSH в режиме отладки, прослушивая порт 2222. Повторите команду scp с помощью:
$ scp -o port=2222 ...
... и посмотрите, что говорит сервер.
На вопросы безопасности Джона: если вы решите продолжить использование учетной записи www-data, вы можете ограничить ее ключ только определенными действиями (такими как передача определенных файлов), используя параметр «принудительная команда» в authorized_keys.