%20%D1%81%20%D0%BA%D0%BB%D1%8E%D1%87%D0%B0%D0%BC%D0%B8%20ssh%20%D0%BE%D0%B1%D1%8B%D1%87%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F%2C%20%D0%BD%D0%BE%20%D1%81%20%D0%BF%D1%80%D0%B0%D0%B2%D0%B0%D0%BC%D0%B8%20%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0%20%D0%BA%20%D1%84%D0%B0%D0%B9%D0%BB%D0%B0%D0%BC%20sudo.png)
Я могу клонировать проект следующим образом:
$ git clone [email protected]:root/myproject.git ~/bla
Но теперь я хочу клонировать его в /var/www
. Поэтому я пробую
$ git clone [email protected]:root/myproject.git ~/var/www
Но увы, у меня нет разрешения писать /var/www
. Sudo спешит на помощь!
$ sudo git clone [email protected]:root/myproject.git ~/var/www
Cloning into 'www'...
[email protected]'s password:
Что это? У меня просят пароль? Нам не нужны эти вонючие пароли!
Я, очевидно, отправляю ssh-ключи пользователя root с запросом, и поскольку они не были импортированы в репозиторий git, мне отказывают. Раньше я временно менял разрешения папки или сначала клонировал ее куда-то, к чему у меня есть доступ, а затем перемещал ее с помощью sudo, но хотел бы узнать, как это сделать правильно.
Итак... Как мне использовать git с ключами ssh обычного пользователя, но с правами доступа к файлам sudo?
решение1
Если у вас ssh
запущен агент, выполните следующие действия:
sudo SSH_AUTH_SOCK="$SSH_AUTH_SOCK" git clone...
По сути, это говорит git
команде, запущенной root
(или ssh
команде, запущенной этой git
командой), использовать вашего ssh
агента (как подключиться к нему, который root
должен иметь такую возможность, поскольку имеет на это все права).
Если у вас не запущен ssh-агент, вы можете запустить его заранее с помощью:
eval "$(ssh-agent)"
(и добавляйте к нему ключи по мере необходимости с помощью ssh-add
).
В качестве альтернативы вы можете использовать
sudo -E git clone...
Пройтикаждыйпеременная окружения во всем sudo
, а не только $SSH_AUTH_SOCK
.
Я бынетполучил предложение @NgOon-Ee в комментарии добавить $SSH_AUTH_SOCK
в env_keep
список. В общем, вы не хотите загрязнять root
среду , так как это пользователь, от имени которого вы запускаете службы. Например, sudo sshd
запуск sshd
службы будет означать, что все ssh
сеансы, запущенные через эту службу, унаследуют вашу $SSH_AUTH_SOCK
, загрязняя среду пользователей чем-то, что они не могут и не должны использовать. Даже для других целевых пользователей, чем root
, передача этой переменной не будет иметь смысла, так как целевой пользователь не сможет использовать этот агент аутентификации.
Теперь, это касается только аутентификации ключей. Если вы также хотите root
унаследовать свои настройки в вашем ~/.ssh/config
, вы не можете сделать это с помощью ssh
переменных окружения, но вы можете сделать это с помощью git
переменных окружения. Например, определение sugit
функции как:
sugit() {
sudo "GIT_SSH_COMMAND=
exec ssh -o IdentityAgent='$SSH_AUTH_SOCK' \
-o User=$LOGNAME \
-F ~$LOGNAME/.ssh/config" git "$@"
}
То есть, укажите git
использовать ssh
команду, которая использует ваш файл конфигурации SSH, агента и имя пользователя вместо root.
Или, может быть, даже лучше, укажите git
запуск ssh
от имени исходного пользователя:
sugit() {
sudo "GIT_SSH_COMMAND=
exec sudo -Hu $LOGNAME SSH_AUTH_SOCK='$SSH_AUTH_SOCK' ssh" git "$@"
}
решение2
Разрешения на файлы (или сокеты) могут быть усложнены, если ключевые файлы (или сокеты) не могут быть прочитаны пользователем, который sudo
запускается как. Это, безусловно, включает в себя root
случаи, когда файлы находятся на сетевом ресурсе, root
на который нет разрешения, или домашний каталог должен быть зашифрован, что может снова запретить root
доступ.
Другой способ в системах Unix, поддерживающих расширенные списки контроля доступа, — это их использование. В этом случае вы можете предоставить дополнительный доступ на запись поверх обычных базовых разрешений:
$ sudo chown apache:www /var/www/html
$ sudo chmod g+s /var/www/html
$ sudo setfacl -m g:webedit:rwx /var/www/html
$ groups
jdoe webedit
$ ls -ld /var/www/html
drwxrwsr-x+ 4 apache www 25 Nov 21 19:42 /var/www/html
$
но у webedit
группы есть разрешения благодаряsetfacl
$ git clone ~/repo /var/www/html
Cloning into '/var/www/html'...
done.
$ ls -al /var/www/html
total 0
drwxrwsr-x+ 4 apache www 25 Nov 21 19:42 .
drwxr-xr-x 4 root root 31 Oct 19 20:39 ..
drwxrwsr-x 3 jdoe www 14 Nov 21 19:42 a
drwxrwsr-x 8 jdoe www 152 Nov 21 19:42 .git
$
Однако существуют различные подводные камни, связанные с расширенными списками контроля доступа, например, проверьте, как ваше программное обеспечение для резервного копирования обрабатывает их и т. д.