Как дать имя пользователя / пароль для git clone в скрипте, но не хранить учетные данные в .git / config


31

Я клонирую git-репозиторий в скрипт, подобный этому:

git clone https://user:password@host.com/name/.git

Это работает, но мое имя пользователя и мой пароль! теперь хранятся в исходной ссылке в .git/config.

Как я могу предотвратить это, но все же сделать это в сценарии (поэтому нет ручного ввода пароля)?


Вы могли бы, вероятно, обновить происхождение потом:git remote set-url origin https://host.com/name/.git
— ceejayoz

@ceejayoz Да, это возможно. Спасибо за идею. Я все еще надеюсь на решение, которое даже временно не хранит учетные данные.
— Натан

4
Конечно - используйте SSH-аутентификацию с ключом.
— Ceejayoz

2
Есть ли причина, по которой вы используете https вместо SSH? SSH поддерживает ключи.
— мжаасе

1
@MartijnCourteaux Пароль фактически дается сценарию через переменную окружения. Так что я на самом деле: git clone username: $ PASSWORD @ ...
— Натан

Ответы:


20

Метод, который я использую, заключается в том, чтобы фактически использовать git pullвместо клона. Сценарий будет выглядеть так:

mkdir repo
cd repo
git init
git config user.email "email"
git config user.name "user"
git pull https://user:password@github.com/name/repo.git master

Это не будет хранить ваше имя пользователя или пароль в .git/config. Однако, если не будут предприняты другие шаги, имя пользователя и пароль в виде открытого текста будут видны, пока процесс выполняется из команд, которые показывают текущие процессы (например ps).

Еще одно предложение, которое я хотел бы сделать (если вы не можете использовать ssh), - это использовать токен OAuth вместо обычного имени пользователя / пароля, поскольку он немного более безопасен. Вы можете создать токен OAuth в настройках своего профиля: https://github.com/settings/tokens .

Затем с помощью этого токена команда pull будет

git pull https://$OAUTH_TOKEN:x-oauth-basic@github.com/name/repo.git master

Я не могу использовать токены авторизации. Я не использую GitHub, но частный сервер.
— Натан

3
Также следует отметить, что имя пользователя и пароль будут видны, например, psво время выполнения извлечения (по крайней мере, если вы не запретили пользователям видеть процессы друг друга)
— derobert

Очки за использование присяги. Это именно то, что мне было нужно в производстве / постановке / разработке.
— RobotHumans

миллион благодаря тебе, приятель. потраченные впустую часы n часов n наконец-то ваш ответ пришёл к ответу. : thumbsup
— JasdeepSingh

17

IMO лучшее решение - использовать пользовательский GIT_ASKPASSпомощник и предоставить пароль в качестве другой переменной среды. Так, например, создайте файл git-askpass-helper.shкак:

#!/bin/sh
exec echo "$GIT_PASSWORD"

а затем запустить git clone https://username@hostname/repoс переменными среды GIT_ASKPASS=/path/to/git-askpass-helper.shи GIT_PASSWORD=nuclearlaunchcodes.

Это имеет то преимущество, что пароль не будет виден и в списке процессов.


+1 за креативное решение. Это будет немного более безопасно, чем git pullрешение, и позволит вам сохранить пароль в виде открытого текста в качестве секрета в выбранном вами инструменте автоматического развертывания.
— FGreg

13

Вы можете ввести свои кредиты подключения в вашем ~/.netrcфайле. Что-то вроде:

machine host.example.net
login bart
password eatmyshorts

Просто убедитесь, что этот файл изменен на 600. Если вы используете Windows, может пригодиться следующая ссылка: https://stackoverflow.com/questions/6031214/git-how-to-use-netrc-file-on- окна к копи-пользователя-и-пароль

Лично у меня есть тенденция использовать ключи SSH для аутентификации (если вы, конечно, разрешены).


Ну, это оставило бы мой пароль внутри ~ / .netrc. Я тоже этого не хочу.
— Натан

2

Изучив десятки SO-сообщений, блогов и т. Д., Я опробовал каждый метод, и вот что я придумал. Это охватывает ВСЕ.

См. Описание Git Credentials & Private Packages

Это все способы и инструменты, с помощью которых вы можете безопасно аутентифицировать git для клонирования репозитория без интерактивного запроса пароля .

  • Открытые ключи SSH
    • SSH_ASKPASS
  • Токены доступа к API
    • GIT_ASKPASS
    • .gitconfig вместо
    • .gitconfig [учетные данные]
    • .git-учетные
    • .netrc
  • Бонус: работает с частными пакетами
    • node / npm package.json
    • python / pip / eggs needs.txt
    • рубиновые камни Gemfile
    • Голанг go.mod

Лучшие варианты для хранения без открытого текста

Из того, что здесь предлагается, SSH Keys GIT_ASKPASSили git credential storeиспользование OS Keychain Manager могут быть лучшим выбором.

Поскольку GIT_ASKPASS, вероятно, наименее понят из 3, я подробно опишу это здесь, а остальные находятся в чит-листе.

GIT_ASKPASS

Как создать GIT_ASKPASSскрипт:

echo 'echo $MY_GIT_TOKEN' > $HOME/.git-askpass

Как это использовать:

export MY_GIT_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
export GIT_ASKPASS=$HOME/.git-askpass
git clone https://token@code.example.com/project.git

Скрипт получает стандартный ввод в виде:

Password for 'scheme://host.tld':

Сценарий получает Git ENV, такие как:

GIT_DIR=/Users/me/project/.git
GIT_EXEC_PATH=/usr/local/Cellar/git/2.19.0_1/libexec/git-core
GIT_PREFIX=

Подробнее в чит-листе .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.