Dlaczego ssh-agent nie zapisuje mojego niezaszyfrowanego klucza do późniejszego wykorzystania?

12

Za każdym razem, gdy przesyłam SSH do innego serwera z naszego bezgłowego serwera Ubuntu, jestem proszony o hasło do mojego pliku klucza. Nawet jeśli wcześniej łączyłem się z serwerem.

Czy masz jakiś pomysł, dlaczego to może? Może to być coś tak prostego, jak ssh-agentobecnie nie uruchomione lub coś takiego.

Ten sam klucz na moim pulpicie Ubuntu Gnome działa dobrze. Zarówno na serwerze, jak i na komputerze działa Ubuntu 10.10.

ps -ef | grep '[s]sh-agent'
simon     3219     1  0 12:46 ?        00:00:00 ssh-agent
Treffynnon
źródło
1
Najpierw, jak powiedziałeś, sprawdź, czy ssh-agentdziała:ps -ef | grep '[s]sh-agent'
Scott Severance
@mssever Tak, wydaje się, że tak. Zobacz zaktualizowane pytanie.
Treffynnon

Odpowiedzi:

10

Nawet jeśli agent jest włączony, jeśli niektóre zmienne środowiskowe nie są ustawione, nie ma odniesienia do agenta. Ponadto, nawet jeśli wszystko jest w porządku, agent i zmienne, tożsamość nie jest automatycznie wysyłana do agenta: jest to zadanie ssh-askpass, które działa tylko w sesjach X.

Jeśli używasz bash, utwórz plik ~/.bash_profilez tą zawartością:

# 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

zmodyfikuj nazwę pliku ~/.ssh/id_dsazgodnie ze swoimi potrzebami i dodaj ten wiersz do~/.bash_logout

# stuff to add at end of ~/.bash_logout
if ((agent_started)); then
  echo "Killing ssh agent"
  ssh-agent -k
fi

Ostatnia uwaga: nie koliduje to z sesją gnome, ponieważ w takim przypadku ~/.profilejest to tylko źródło i możesz skorzystać z ssh-askpassinterfejsu graficznego, który prosi o hasło i wysyła je do ssh-agent.

enzotib
źródło
Dzięki @enzotib działa świetnie do wprowadzania sshna inne maszyny. Ale nie działa, gdy używasz gitdo wypychania lub ciągnięcia publicznego repozytorium. Czy masz jakieś pomysły, jak mogę to rozwiązać?
Treffynnon
Dodaj funkcję identyczną do ssh(), wywołaj ją git()i zmień ostatnią linię z /usr/bin/sshna /usr/bin/git. Dodaj także ostatnią linię za pomocą export -f git.
enzotib
@enzotib Próbowałem tego, ale teraz, gdy wchodzę sshdo komputera z bash_profileplikiem utworzonym powyżej instalacji, pyta mnie o hasło klucza. Z jakiegoś powodu teraz za każdym razem, gdy ssh w nim pyta, jeszcze zanim wykonałem sshlub git. Na stronie gist.github.com/942082 znajduje się monit o zwrot, gdy loguję się na maszynie naruszającej prawo.
Treffynnon
@Treffynnon: Nie wiem dokładnie, jak gitwchodzić w interakcje sshi nie używam, gitwięc nie mogę spróbować. Zmodyfikowałem, ~/.bash_profileaby uwzględnić git()funkcję, o której wspomniałem powyżej, aby mieć pewność, że moje poprzednie wyjaśnienie było jasne. Wydaje się również, że na podstawie danych wyjściowych zmodyfikowano maszynę serwerową, ale wszystkie moje porady były skierowane tylko do maszyny klienta.
enzotib
@enzotib To prawda. Serwer, na który się loguję, staje się moim klientem, gdy gitwypycham z niego centralną kuźnię / repozytorium, aby plik był we właściwym miejscu. Myślę, że właśnie dałeś mi wskazówkę / pobudziłeś moje myśli. Mam specjalny monit bash, który wyświetla gałąź git pwd. Założę się, że to właśnie powoduje żądanie hasła przy logowaniu do bash, ponieważ próbuje ono uzyskać statystyki przed wyświetleniem monitu o bash!
Treffynnon,
2

Niedawno zacząłem używać ssh-ident:

https://github.com/ccontavalli/ssh-ident

wszystko, co musisz zrobić, to dodać coś takiego:

alias ssh="/path/to/ssh-ident"

w twoim .bashrc. Alternatywnie możesz ln -s /path/to/ssh-ident ~/bin/sshlub inny katalog w swojej ŚCIEŻCE przed /bini /usr/bin.

rabexc
źródło