Как избежать ввода парольной фразы для git pull, выполняемой под www-данными
Я застрял на операции, когда мне нужно выполнить команду Git pull, запущенную из сценария PHP. (пользователь добавлен в группу www-data) без ввода парольной фразы. Я обнаружил, что это можно решить с помощью команды:
eval "$(ssh-agent)"
ssh-add
Но эта команда работает только под моим собственным пользователем (например, george). Но если я попытаюсь выполнить следующую команду под www-data в репозитории git cloned:
sudo -u george git pull
Я всегда получаю следующее сообщение
Enter passphrase for key '/home/george/.ssh/id_rsa':
Примечание: я добавляю пользователя в группу www-data, а также в visudo users. Но я не знаю, как решить парольную передачу или избежать ввода парольной фразы.
Большое спасибо за любую помощь.
1 ответ
Есть несколько способов достичь того, что вы хотите:
Самый "правильный", на мой взгляд, способ:
- Создайте специальный ключ SSH для вашего
www-data
пользователя, и убедитесь, что этот ключ не зашифрован паролем - потому что именно эта фраза-пароль запрашивается клиентом SSH для расшифровки ключа, который затем используется для аутентификации. - Разверните этот ключ удаленно (в значительной степени зависит от ваших настроек), чтобы его можно было использовать для доступа для чтения.
Затем вы должны сделать этот ключ читаемым
www-data
пользователь, и только этот пользователь (!), то есть файл ключа должен принадлежатьwww-data
и имеет0600
(-rw-------
) биты разрешений, установленные на нем.Есть несколько способов добиться этого:
- Так как клиент SSH ищет файл ключа под
~/.ssh
каталог (то есть.ssh
каталог под домашним каталогом пользователя), у вас есть несколько вариантов:- Если твой
www-data
у пользователя есть настоящий домашний каталог в файловой системе (вы можете узнать, запустивgetent passwd www-data
), вы могли бы создать.ssh
каталог там и поместите ключ в нем. - В вашем сценарии перетаскивания переопределите
HOME
переменная среды (иexport
его новое значение) перед запускомgit
, так что клиент SSH разрешает домашний каталог в другое место. Остальные должны быть настроены, как описано выше.
- Если твой
- Клиент SSH поддерживает настройку для каждого пользователя, где можно указать, где искать ключ, и даже указать разные ключи для разных серверов. Обратитесь к
ssh_config(5)
страница справочника. - Клиенты SSH обычно поддерживают указание расположения файла ключа в командной строке.
OpenSSH
двоичный файл клиента, обычно используемый в обычных ОС на базе Linux и BSD, поддерживает-i
опция командной строки (расшифровывается как "идентичность"). Итак, еще один способ - написать скрипт-обертку, который просто вызываетssh -i /path/to/the/key/file
и поместите путь к этому сценарию в (export
ред) переменная окруженияGIT_SSH
так что Git вызывает твой скрипт вместоssh
,
- Так как клиент SSH ищет файл ключа под
- Создайте специальный ключ SSH для вашего
С помощью
sudo
это еще один вариант (хотя мне это не нравится), но, скорее всего, новый процесс, запущенный с измененными учетными данными, не наследует определенные переменные среды, существующие в вашем сеансе, которые сообщают клиенту SSH, как связаться с запущенным экземпляромssh-agent
в котором кэширован ваш дешифрованный ключ (да, существование этого агента является причиной того, что вам нужно вводить вашу фразу-пароль только один раз в сеансе интерактивного входа в систему).Так что вы можете прочитать о том, как
ssh-agent
работает и как сделатьsudo
сохранить переменные окружения, связанные с ним, при запуске вашего двоичного файла Git с измененными учетными данными.Я не совсем уверен, что это будет работать, поскольку все еще может быть проблема с правами доступа к сокету домена Unix (или fifo? - я не могу вспомнить в данный момент), предлагаемый работающим экземпляром
ssh-agent
для связи с ним, так что вам нужно будет сделать некоторые исследования.Используйте программу как
sshpass
передать пароль клиенту SSH.Это может быть сделано либо напрямую, либо путем обертывания самого клиента SSH (см. Выше).
Обратите внимание, что этот подход воняет, поскольку подразумевает, что пароль будет храниться где-то в виде открытого текста в каком-то скрипте. Таким образом, вы должны убедиться, что этот скрипт защищен так же, как незашифрованный ключ будет защищен в первом случае.
Еще один вариант - предложить доступ к вашему хранилищу, используя неаутентифицируемый протокол только для чтения (git://
или же file://
схема - в зависимости от того, что применимо). Идея заключается в том, что доступ к хранилищу может осуществляться несколькими способами, и даже разные URL-адреса (с разными схемами, то есть протоколами) могут использоваться для извлечения и отправки для одного и того же имени удаленного устройства.