Uruchom ssh-agent po zalogowaniu

Mam stronę jako zdalny repo Git ściągający z Bitbucket.com używając aliasu SSH. Mogę ręcznie uruchomić SSH-agenta na moim serwerze, ale muszę to zrobić za każdym razem, gdy loguję się przez SSH.

Uruchamiam ręcznie SSH-agenta:

eval ssh-agent $SHELL

Potem dodaję agenta:

ssh-add ~/.ssh/bitbucket_id

Potem pojawia się, gdy to robię:

ssh-add -l
I jestem gotowy. Czy jest jakiś sposób, aby zautomatyzować ten proces, więc nie muszę tego robić za każdym razem, gdy się loguję? Na serwerze działa RedHat 6.2 (Santiago).
Author: random, 2013-09-18

10 answers

Proszę przejrzeć ten artykuł. Może okazać się to bardzo przydatne:

Http://mah.everybody.org/docs/ssh

Na wszelki wypadek, gdyby powyższy link kiedyś znika, przechwytywam główny fragment rozwiązania poniżej:

To rozwiązanie od Josepha M. Reagle przez Daniela Starina:

Dodaj to do swojego .bash_profile

SSH_ENV="$HOME/.ssh/environment"

function start_agent {
    echo "Initialising new SSH agent..."
    /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
    echo succeeded
    chmod 600 "${SSH_ENV}"
    . "${SSH_ENV}" > /dev/null
    /usr/bin/ssh-add;
}

# Source SSH settings, if applicable

if [ -f "${SSH_ENV}" ]; then
    . "${SSH_ENV}" > /dev/null
    #ps ${SSH_AGENT_PID} doesn't work under cywgin
    ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
        start_agent;
    }
else
    start_agent;
fi

Ta wersja jest szczególnie przyjemna, ponieważ sprawdzi, czy uruchomiłeś już ssh-agent a jeśli nie może go znaleźć, uruchomi go i zapisze ustawienia, aby były użyteczne przy następnym uruchomieniu powłoki.

 267
Author: Litmus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-16 07:05:55

Na Arch Linuksie, poniższe działa naprawdę świetnie (powinno działać na wszystkich dystrybucjach opartych na systemd):

Utwórz usługę użytkownika systemd, umieszczając w ~/.config/systemd/user/ssh-agent.service:

[Unit]
Description=SSH key agent

[Service]
Type=forking
Environment=SSH_AUTH_SOCK=%t/ssh-agent.socket
ExecStart=/usr/bin/ssh-agent -a $SSH_AUTH_SOCK

[Install]
WantedBy=default.target

Ustawia powłokę tak, aby miała zmienną środowiskową dla gniazda (.bash_profile, .zshrc, ...):

export SSH_AUTH_SOCK="$XDG_RUNTIME_DIR/ssh-agent.socket"

Włącz usługę, więc zostanie ona uruchomiona automatycznie po zalogowaniu i uruchom ją:

systemctl --user enable ssh-agent
systemctl --user start ssh-agent

Dodaj następujące ustawienie konfiguracji do pliku konfiguracyjnego ssh ~/.ssh/config (działa to od SSH 7.2):

AddKeysToAgent  yes

To poleci klientowi ssh, aby zawsze dodawał klucz do działającego agenta, więc nie ma potrzeby wcześniejszego dodawania go przez ssh.

 48
Author: spheenik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-16 18:03:00

Przyjęte rozwiązanie ma następujące wady:

  • to skomplikowane w utrzymaniu;
  • ocenia plik pamięci, który może prowadzić do błędów lub naruszenia bezpieczeństwa;
  • uruchamia się, ale go nie zatrzymuje, co jest bliskie pozostawieniu kluczyka w stacyjce.

Jeśli Twoje klucze nie wymagają wpisywania hasła, proponuję następujące rozwiązanie. Dodaj do swojego .bash_profile very end (Edytuj listę kluczy do swoich potrzeb):

exec ssh-agent $BASH -s 10<&0 << EOF
    ssh-add ~/.ssh/your_key1.rsa \
            ~/.ssh/your_key2.rsa &> /dev/null
    exec $BASH <&10-
EOF

MA następujące zalety:

  • znacznie prostsze rozwiązanie;
  • sesja agenta kończy się po zakończeniu sesji bash.

MA możliwe wady:

  • interaktywne polecenie ssh-add wpłynie tylko na jedną sesję, co w rzeczywistości jest problemem tylko w bardzo nietypowych okolicznościach;
  • bezużyteczny, jeśli wymagane jest wpisanie hasła;
  • uruchomiony shell staje się non-login (co nie ma wpływu na nic AFAIK).

Zauważ, że kilka ssh-agent procesów nie jest wadą, ponieważ nie zajmują więcej pamięci ani czasu procesora.

 36
Author: midenok,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-08 17:46:14

Stare pytanie, ale natknąłem się na podobną sytuację. Nie myśl, że powyższa odpowiedź w pełni osiąga to, co jest potrzebne. Brakujący element to keychain; zainstaluj go, jeśli jeszcze nie jest.

sudo apt-get install keychain

Następnie dodaj następujący wiersz do swojego ~/.bashrc

eval $(keychain --eval id_rsa)

Uruchomi ssh-agent Jeśli nie jest uruchomiony, połączy się z nim, załaduje zmienne środowiskowe ssh-agent do powłoki i załaduje klucz ssh.

Zmień id_rsa na dowolny klucz prywatny w ~/.ssh ładuj.

Odniesienie

Https://unix.stackexchange.com/questions/90853/how-can-i-run-ssh-add-automatically-without-password-prompt

 33
Author: xelber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-15 10:30:43

Dodaj to do swojego ~/.bashrc:

if [ ! -S ~/.ssh/ssh_auth_sock ]; then
  eval `ssh-agent`
  ln -sf "$SSH_AUTH_SOCK" ~/.ssh/ssh_auth_sock
fi
export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock
ssh-add -l | grep "The agent has no identities" && ssh-add

Powinno to wyświetlać monit o hasło tylko przy pierwszym logowaniu po każdym ponownym uruchomieniu. Będzie nadal używać ssh-agent tak długo, jak będzie działać.

 18
Author: Collin Anderson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-27 17:28:10

Więc używałem podejścia opisanego powyżej, ale wolę, aby agent umarł, gdy moja ostatnia sesja bash się kończy. Jest to nieco dłuższe niż inne rozwiązania, ale jego preferowane podejście. Podstawową ideą jest to, że pierwsza sesja bash rozpoczyna ssh-agent. Następnie każda dodatkowa sesja bash sprawdza czy plik konfiguracyjny (~/.ssh/.agent_env). Jeśli to jest i jest uruchomiona sesja, to źródło środowiska i utworzyć hardlink do pliku gniazda w /tmp (musi być na tym samym system plików jako oryginalny plik gniazda). Ponieważ sesje bash zamykają się, każda usuwa własne łącze twarde. Ostatnia sesja do zamknięcia okaże się, że hardlinki mają 2 Linki (hardlink i Oryginał), usunięcie własnego gniazda procesów i zabicie procesu spowoduje 0, pozostawiając czyste środowisko po zamknięciu ostatniej sesji bash.

# Start ssh-agent to keep you logged in with keys, use `ssh-add` to log in
agent=`pgrep ssh-agent -u $USER` # get only your agents           
if [[ "$agent" == "" || ! -e ~/.ssh/.agent_env ]]; then
    # if no agents or environment file is missing create a new one
    # remove old agents / environment variable files
    kill $agent running
    rm ~/.ssh/.agent_env 

    # restart
    eval `ssh-agent` 
    echo 'export SSH_AUTH_SOCK'=$SSH_AUTH_SOCK >> ~/.ssh/.agent_env             
    echo 'export SSH_AGENT_PID'=$SSH_AGENT_PID >> ~/.ssh/.agent_env             
fi

# create our own hardlink to the socket (with random name)           
source ~/.ssh/.agent_env                                                    
MYSOCK=/tmp/ssh_agent.${RANDOM}.sock                                        
ln -T $SSH_AUTH_SOCK $MYSOCK                                                
export SSH_AUTH_SOCK=$MYSOCK                                                

end_agent()                                                                     
{
    # if we are the last holder of a hardlink, then kill the agent
    nhard=`ls -l $SSH_AUTH_SOCK | awk '{print $2}'`                             
    if [[ "$nhard" -eq 2 ]]; then                                               
        rm ~/.ssh/.agent_env                                                    
        ssh-agent -k                                                            
    fi                                                                          
    rm $SSH_AUTH_SOCK                                                           
}                                                                               
trap end_agent EXIT                                                             
set +x              
 7
Author: Micah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-15 17:46:30

Przepraszam za spóźnienie:

Użytkownicy powłoki fish shell mogą użyć tego skryptu , aby zrobić to samo.

# content has to be in .config/fish/config.fish
# if it does not exist, create the file
setenv SSH_ENV $HOME/.ssh/environment

function start_agent                                                                                                                                                                    
    echo "Initializing new SSH agent ..."
    ssh-agent -c | sed 's/^echo/#echo/' > $SSH_ENV
    echo "succeeded"
    chmod 600 $SSH_ENV 
    . $SSH_ENV > /dev/null
    ssh-add
end

function test_identities                                                                                                                                                                
    ssh-add -l | grep "The agent has no identities" > /dev/null
    if [ $status -eq 0 ]
        ssh-add
        if [ $status -eq 2 ]
            start_agent
        end
    end
end

if [ -n "$SSH_AGENT_PID" ] 
    ps -ef | grep $SSH_AGENT_PID | grep ssh-agent > /dev/null
    if [ $status -eq 0 ]
        test_identities
    end  
else
    if [ -f $SSH_ENV ]
        . $SSH_ENV > /dev/null
    end  
    ps -ef | grep $SSH_AGENT_PID | grep -v grep | grep ssh-agent > /dev/null
    if [ $status -eq 0 ]
        test_identities
    else 
        start_agent
    end  
end
 2
Author: Daniel Gerber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-11 07:23:17

Żeby dodać jeszcze jedno rozwiązanie: P, wybrałem kombinację rozwiązań @spheenik i @ collin-anderson.

 # Ensure that we have an ssh config with AddKeysToAgent set to true
 if [ ! -f ~/.ssh/config ] || ! cat ~/.ssh/config | grep AddKeysToAgent | grep yes > /dev/null; then
     echo "AddKeysToAgent  yes" >> ~/.ssh/config
 fi
 # Ensure a ssh-agent is running so you only have to enter keys once
 if [ ! -S ~/.ssh/ssh_auth_sock ]; then
   eval `ssh-agent`
   ln -sf "$SSH_AUTH_SOCK" ~/.ssh/ssh_auth_sock
 fi
 export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock

Może być trochę bardziej elegancki, ale jest prosty i czytelny. To rozwiązanie:

  • zapewnia, że AddKeysToAgent yes jest w konfiguracji ssh, więc klucze zostaną automatycznie dodane po użyciu
  • Nie wymaga wpisywania hasła przy logowaniu (ponownie, jednorazowe wpisanie hasła następuje przy pierwszym użyciu)]}
  • po cichu uruchamia agenta ssh, jeśli jeszcze się nie uruchomił one

Komentarze mile widziane:)

 2
Author: Keego,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-12 22:06:21

Rozwiązałem to dodając to do / etc / profile - system wide (lub do user local .profil, lub .bash_profile).

# SSH-AGENT 
#!/usr/bin/env bash
SERVICE='ssh-agent'
WHOAMI=`who am i |awk '{print $1}'`

if pgrep -u $WHOAMI $SERVICE >/dev/null
then
echo $SERVICE running.
else
echo $SERVICE not running.
echo starting
ssh-agent > ~/.ssh/agent_env
fi
. ~/.ssh/agent_env

Uruchamia nowy ssh-agent, jeśli nie jest uruchomiony dla użytkownika, lub ponownie ustawia parametr ssh-agent env, jeśli jest uruchomiony.

 1
Author: TheFrog,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-29 13:39:54

Bardzo lubię twoje odpowiedzi. Znacznie ułatwiło to pracę z cygwin / linux hostów. Połączyłem funkcje początku i końca, aby było bezpieczne.

SSH_ENV="$HOME/.ssh/.agent_env"

function start_agent {
    echo "Initialising new SSH agent..."

    eval `/usr/bin/ssh-agent`
    echo 'export SSH_AUTH_SOCK'=$SSH_AUTH_SOCK >> ${SSH_ENV}
    echo 'export SSH_AGENT_PID'=$SSH_AGENT_PID >> ${SSH_ENV}

    echo succeeded
    chmod 600 "${SSH_ENV}"
    . "${SSH_ENV}" > /dev/null
    /usr/bin/ssh-add;
}

# Source SSH settings, if applicable
if [ -f "${SSH_ENV}" ]; then
    . "${SSH_ENV}" > /dev/null
    #ps ${SSH_AGENT_PID} doesn't work under cywgin
    ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
        start_agent;
    }
else
    start_agent;
fi

# create our own hardlink to the socket (with random name)
MYSOCK=/tmp/ssh_agent.${RANDOM}.sock
ln -T $SSH_AUTH_SOCK $MYSOCK
export SSH_AUTH_SOCK=$MYSOCK

end_agent()
{
    # if we are the last holder of a hardlink, then kill the agent
    nhard=`ls -l $SSH_AUTH_SOCK | awk '{print $2}'`
    if [[ "$nhard" -eq 2 ]]; then
        rm ${SSH_ENV}
        /usr/bin/ssh-agent -k
    fi
    rm $SSH_AUTH_SOCK
}
trap end_agent EXIT
set +x

Thanks again

 1
Author: Knelis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-17 14:58:53