Uruchamianie ssh-agent ze skryptu powłoki

19

Próbuję utworzyć skrypt powłoki, który między innymi uruchamia ssh-agent i dodaje klucz prywatny do agenta. Przykład:

#!/bin/bash
# ...
ssh-agent $SHELL
ssh-add /path/to/key
# ...

Problem polega na tym, że ssh-agent najwyraźniej uruchamia kolejną instancję $ SHELL (w moim przypadku bash) iz punktu widzenia skryptu wykonuje wszystko i ssh-add i wszystko poniżej nie jest uruchamiane.

Jak mogę uruchomić ssh-agent z mojego skryptu powłoki i sprawić, by poruszał się dalej po liście poleceń?

Dan
źródło

Odpowiedzi:

8

ssh-agent ma rozpocząć sesję, a po jej zakończeniu sesja użytkownika się kończy. Tak więc każde polecenie po ssh-agent może być wykonane po wylogowaniu.

To, czego chcesz, to takie session-scriptpolecenia sesji, jak to:

#!/bin/bash
ssh-add /path/to/key
bash -i # or other session starter

Potem zacznij ssh-agent session-script.

Michael Suelmann
źródło
Dzięki! Utworzenie osobnego skryptu i zakończenie skryptu exitzałatwiło sprawę.
Dan
2
co to jest skrypt sesji?
Alexander Mills
15

Umieść u góry skryptu następujące elementy:

eval `ssh-agent`

Twój skrypt powinien wyglądać następująco:

#!/bin/bash
eval `ssh-agent`
ssh-add /path/to/key
...
...

Wyjaśnienie

Backticks wokół ssh-agentzbierają swoje wyjście. evalzbiera dane wyjściowe, łączy je w jedno polecenie, a następnie wykonuje polecenie. Następnie możesz użyć, ssh-addaby podać swoje kluczowe dane uwierzytelniające.

Szkot
źródło
9
Właśnie tego potrzebowałem, dzięki, chociaż warto zauważyć, że backty są w drodze do wyjścia. W nowej formie bash powinno byćeval $(ssh-agent)
sibaz
To rozwiązanie nie działało dla mnie, dopóki nie umieściłem bash -ina końcu skryptu.
Adolfo Correa,
6

Zwykle robię coś takiego w skryptach, które wymagają agenta.

#!/bin/bash

# if we can't find an agent, start one, and restart the script.
if [ -z "$SSH_AUTH_SOCK" ] ; then
  exec ssh-agent bash -c "ssh-add ; $0"
  exit
fi

... and so on.

Zasadniczo pierwsza rzecz, którą wykonuje skrypt, sprawdza, czy agent jest uruchomiony. Jeśli nie jest to exec, służy do uruchomienia nowego procesu zamiast skryptu. Agent jest uruchamiany, klucze są dodawane, a na koniec skrypt jest wywoływany ponownie (patrz $0).

Zoredache
źródło
Ale to nie zachowa żadnych parametrów skryptu. A jeśli którykolwiek z parametrów ma spacje, nie będzie łatwo go przekazać.
Denilson Sá Maia,
3
Możesz użyć .. "ssh-add ; $0 $*"lub .. "ssh-add ; $0 $@"zamiast tego, które mogą działać. Co nie byłoby idealne, ale z pewnością działałoby w wielu przypadkach. Najlepszym rozwiązaniem jest prawie zawsze uruchomienie agenta przed czymkolwiek innym, jest to po prostu coś, co może być przydatne w mało znanych przypadkach.
Zoredache,
6

Znalazłem to dla mnie.

eval `ssh-agent` # create the process
ssh-add ~/.ssh/priv_key # add the key
git -C $repo_dir pull # this line is the reason for the ssh-agent
eval `ssh-agent -k` # kill the process

Tworzę proces ssh-agent, dodaję klucz, robię to, co muszę, a następnie zabijam. Nie musisz sprawdzać, czy działa później.

steampowered
źródło
4

W tym przypadku lepiej jest użyć pęku kluczy

Debian / Ubuntu:

apt-get install keychain

RHEL / Fedora / CentOS

yum install keychain

Dodaj w swoim .bashrc:

eval `keychain --eval id_rsa`
ZIADI Mohamed Ali
źródło
Lepszy? Dlaczego to jest lepsze?
JFlo
@JFlo „Lepsze” w tym, że zapisze zmienne env do $ HOME / .keychain / <plik>. Ponowne uruchomienie tej komendy spowoduje pobranie istniejącego agenta ssh, jeśli nadal działa. Następnie można go ponownie wykorzystać między powłokami / skryptami. W niektórych scenariuszach, które nie są super bezpieczne, więc musisz zadzwonić. Dla mnie jest to ulepszenie w stosunku do niektórych skryptów, które napisałem, aby wykonać to samo zadanie
Scott Carlson,
2

Znalazłem rozwiązanie Zoredache'a, że ​​klucz byłby dostępny dla każdej powłoki, która ma ten sam ssh-agent, co powłoka, która wywołała skrypt. Z oczywistych względów bezpieczeństwa chciałem tego uniknąć w skrypcie wymagającym dostępu roota do zdalnego komputera.

Znalazłem umieszczenie następującego shebang u góry skryptu:

#!/usr/bin/ssh-agent bash

ssh-add /path/to/ssh-key
ssh root@remotehost "remote commands"
Andy Wood
źródło
-2

Próbowałem i wiele, a rozwiązaniem, które w końcu zadziałało, było zastąpienie mojego hasła pustym ciągiem.

ssh-keygen -p
Stephan Weinhold
źródło
To bardzo niebezpieczna praktyka. Po co w ogóle zawracać sobie głowę używaniem ssh? Jeśli nie chronisz swojego klucza prywatnego, równie dobrze możesz mówić czystym tekstem.
JFlo,
@JFlo: nie, jeśli system klienta jest wystarczająco bezpieczny, co może być. Zwłaszcza jeśli dodajesz (możesz i robisz) ACL, SELinux lub podobne, co jest łatwe w przypadku pliku statycznego, ale mniej w przypadku losowego gniazda ssh-agent. To powiedziawszy, zwykle nie polecam go jako pierwszego wyboru.
dave_thompson_085
Chociaż jest to bardzo pomocny proces, który zapewniasz, nie sądzę, że odpowiada na pytanie OP.
Alexander Bird