2016-11-11 27 views
6

Mam próbkę sh skryptu na moim środowisku Linux, która w zasadzie prowadzony jest ssh-agent dla bieżącej powłoki, dodaje klucz do niego i prowadzi dwie git polecenia:Jak sprawdzić, czy ssh-agent jest już uruchomiony w bashu?

#!/bin/bash 
eval "$(ssh-agent -s)" 
ssh-add /home/duvdevan/.ssh/id_rsa 

git -C /var/www/duvdevan/ reset --hard origin/master 
git -C /var/www/duvdevan/ pull origin master 

Script faktycznie działa dobrze, ale za każdym razem Uruchom to Otrzymuję nowy proces, więc myślę, że może to być problem z wydajnością i może zakończyć się bezużyteczne procesy tam.

Przykładem wyjścia:

Agent pid 12109 
Identity added: /home/duvdevan/.ssh/custom_rsa (rsa w/o comment) 

Ponadto, wraz z tym wszystkim, jest to możliwe, aby znaleźć istniejący ssh-agent proces i dodać moje klucze do niego?

+3

Wypróbuj '$ SSH_AGENT_PID'. – choroba

+0

Jeśli chcesz zabić proces po jego utworzeniu, możesz zapisać jego PID w zmiennej i nazwać ją tak: kill -9 $ PID_SSH_AGENT' – alok

+0

Uważam, że stworzenie skryptu odpowiedzialnego za uruchomienie agenta jest niewłaściwe. Załóżmy, że agent * działa * i wymaga od każdego użytkownika upewnienia się, że ma już agenta (zwykle uruchamianego przez początkową powłokę logowania). – chepner

Odpowiedz

3

Ponadto, wraz z tym wszystkim, można znaleźć istniejący proces ssh-agent i dodać do niego moje klucze?

Tak. Możemy zapisać informacje o połączeniu w pliku:

# Ensure agent is running 
ssh-add -l &>/dev/null 
if [ "$?" == 2 ]; then 
    # Could not open a connection to your authentication agent. 

    # Load stored agent connection info. 
    test -r ~/.ssh-agent && \ 
     eval "$(<~/.ssh-agent)" >/dev/null 

    ssh-add -l &>/dev/null 
    if [ "$?" == 2 ]; then 
     # Start agent and store agent connection info. 
     (umask 066; ssh-agent > ~/.ssh-agent) 
     eval "$(<~/.ssh-agent)" >/dev/null 
    fi 
fi 

# Load identities 
ssh-add -l &>/dev/null 
if [ "$?" == 1 ]; then 
    # The agent has no identities. 
    # Time to add one. 
    ssh-add -t 4h 
fi 

ten kod jest z pitfalls of ssh agents który opisuje zarówno pułapek, co aktualnie robi, z tym podejściem, i jak należy użyć ssh-ident to zrobić dla Ciebie .


Jeśli chcesz tylko uruchomić ssh-agent, jeśli to nie działa i nic nie zrobić inaczej:

if [ $(ps ax | grep [s]sh-agent | wc -l) -gt 0 ] ; then 
    echo "ssh-agent is already running" 
else 
    eval $(ssh-agent -s) 
    if [ "$(ssh-add -l)" == "The agent has no identities." ] ; then 
     ssh-add ~/.ssh/id_rsa 
    fi 

    # Don't leave extra agents around: kill it on exit. You may not want this part. 
    trap "ssh-agent -k" exit 
fi 

Jednak to nie zapewnia ssh-agent będzie dostępny (tylko dlatego, że to działa nie oznacza, że ​​mamy $ SSH_AGENT_PID dla ssh-add do połączenia się).

0

Można modyfikować linia nr 1 do:

PID_SSH_AGENT=`eval ssh-agent -s | grep -Po "(?<=pid\).*(?=\;)"` 

a potem na końcu skryptu można zrobić:

kill -9 $PID_SSH_AGENT 
+2

Po pierwsze, $ nazwa zmiennej odnosi się do zmiennej, nie można jej ustawić w ten sposób. Po drugie, dlaczego chcesz to zrobić, jeśli 'eval ssh-agent' już ustawia $ SSH_AGENT_PID? – Friek

+0

Niestety, nie wiedziałem, że ustawia tę zmienną. I tak, $ nie powinno tam być. Dzięki. – alok

6

Jeśli chcesz go zabić zaraz po wyjściach skryptów , można po prostu dodać to po linii eval:

trap "kill $SSH_AGENT_PID" exit 

czyli

trap "ssh-agent -k" exit 

$SSH_AGENT_PID zostaje ustawiony w eval of ssh-agent -s.

Powinieneś być w stanie znaleźć uruchomiony ssh-agentów poprzez skanowanie przez /tmp/ssh-* i zrekonstruować SSH_AGENT zmiennych z nim (SSH_AUTH_SOCK i SSH_AGENT_PID).

+0

Dlaczego nie powinienem po prostu dodać 'kill -9 $ SSH_AGENT_PID' na końcu mojego skryptu, jak powiedział @alok w swoim komentarzu do pytania? – omerowitz

+0

Jeśli sam skrypt zostanie zabity (z sygnałem przerywanym) podczas działania, polecenie to nie zostanie uruchomione. Z pułapką to zrobi. – Friek

+0

Ponadto, 'kill -9' nigdy nie powinno być konieczne, z wyjątkiem zabicia programowego podsłuchu podczas programowania. 'kill' samo w sobie powinno wystarczyć prawie w każdym przypadku. – chepner

7

Nie, naprawdę, jak sprawdzić, czy ssh-agent jest już uruchomiony w bashu?

Odpowiedzi do tej pory nie wydaje się, aby odpowiedzieć na oryginalne pytanie ...

Oto, co działa dla mnie:

if ps -p $SSH_AGENT_PID > /dev/null 
then 
    echo "ssh-agent is already running" 
    # Do something knowing the pid exists, i.e. the process with $PID is running 
else 
eval `ssh-agent -s` 
fi 

ta została zaczerpnięta z:https://stackoverflow.com/a/15774758

Powiązane problemy