Как дать имя пользователя / пароль для 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
FGreg
источник
Я не могу использовать токены авторизации. Я не использую 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=

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

CoolAJ86
источник