Как получить только удаленные операции git для запуска события ssh-add для ssh-agent? - PullRequest
2 голосов
/ 26 апреля 2011

Я недавно задал вопрос в AskUbuntu о том, чтобы ssh-agent автоматически сохранял мой защищенный паролем ключ для последующего повторного использования без необходимости повторного ввода парольной фразы во время входа в систему bash (без GUI / Gnome ). Я получил хороший bash-скрипт в ответ, но, к сожалению, он вызван запросом ключевой фразы независимо от операции git. Я только хочу, чтобы мне предложили, если их ключ отсутствует в ssh-agent и выполняется удаленная операция git.

Это связано с тем, что я использую $(__git_ps1 "[%s]") в приглашении bash для отображения ветки git текущего рабочего каталога (pwd). Поэтому, когда я захожу в машину по ssh, он сразу же запрашивает у меня пароль, прежде чем он может отобразить приглашение bash!

Текущий скрипт из ответ на мой вопрос по AskUbuntu выглядит так:

В ~/.bash_profile:

# File: ~/.bash_profile

# source ~/.profile, if available
if [[ -r ~/.profile ]]; then
  . ~/.profile
fi

# start agent and set environment variables, if needed
agent_started=0
if ! env | grep -q SSH_AGENT_PID >/dev/null; then
  echo "Starting ssh agent"
  eval $(ssh-agent -s)
  agent_started=1
fi

# ssh become a function, adding identity to agent when needed
ssh() {
  if ! ssh-add -l >/dev/null 2>-; then
    ssh-add ~/.ssh/id_dsa
  fi
  /usr/bin/ssh "$@"
}
export -f ssh

# another example: git
git() {
  if ! ssh-add -l >/dev/null 2>-; then
    ssh-add ~/.ssh/id_dsa
  fi
  /usr/bin/git "$@"
}
export -f git

Итак, как вы можете видеть, функция git запускается при каждой операции git.

Я думал, что git будет использовать ssh для установления соединения, но он не вызывает функцию ssh() в приведенном выше сценарии. Как git выполняет ssh-операции? Имеет ли он прямой доступ к / usr / bin / ssh, а не полагается на путь bash?

У вас есть лучший способ сделать это или хороший обходной путь для текущего сценария?

Ответы [ 2 ]

3 голосов
/ 26 апреля 2011

Вы можете использовать переадресацию агента, даже если вы используете ssh на нескольких хостах рекурсивно.Когда ssh запрашивает ключ в первый раз, ваш локальный агент запускает $SSH_ASKPASS и перенаправляет разблокированный ключ на хост.Обратите внимание, что вы должны включить переадресацию агента (см. man 5 ssh_config ).

В ~ / .ssh / config включить переадресацию для каждого отдельного необходимого хоста:

Host example.org
    ForwardAgent yes

На стороне сервера переадресация агента включена по умолчанию.

Если вы не хотите использовать переадресацию агента по какой-либо причине, то я думаю, что переопределение команды ssh - ваш единственный вариант.

0 голосов
/ 26 апреля 2011

Я бы не советовал использовать парольную фразу в вашем ключе. Такие вещи, как гитолит, не будут хорошо с ним действовать. Попробуйте использовать новый ключ без пароля.

Мои $ 0,02

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...