Esecuzione di ssh-agent da uno script di shell


19

Sto cercando di creare uno script di shell che, tra le altre cose, avvia ssh-agent e aggiunge una chiave privata all'agent. Esempio:

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

Il problema con questo è che ssh-agent dà il via a un'altra istanza di $ SHELL (nel mio caso, bash) e dal punto di vista dello script viene eseguito tutto e ssh-add e tutto ciò che lo segue non viene mai eseguito.

Come posso eseguire ssh-agent dal mio script shell e mantenerlo in movimento nell'elenco dei comandi?

Risposte:


8

ssh-agent dovrebbe iniziare una sessione e quando termina la sessione dell'utente è finita. Quindi qualsiasi comando dopo ssh-agent verrebbe forse eseguito dopo la disconnessione.

Quello che vuoi è uno session-scriptche contenga i tuoi comandi di sessione in questo modo:

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

Quindi inizia ssh-agent session-script.


Grazie! Creare uno script separato e terminare lo script con ha exitfatto il trucco.
Dan,

2
che cos'è uno script di sessione?
Alexander Mills,

15

Inserisci quanto segue nella parte superiore dello script:

eval `ssh-agent`

Il tuo script dovrebbe apparire così:

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

Spiegazione

I backtick in giro ssh-agentraccolgono il suo output. evalraccoglie quell'output, lo concatena in un singolo comando e quindi esegue il comando. Quindi è possibile utilizzare ssh-addper fornire le credenziali chiave.


9
Questo è esattamente ciò di cui avevo bisogno, grazie, anche se vale la pena sottolineare che i backtick stanno uscendo. Nella nuova forma bash, dovrebbe essereeval $(ssh-agent)
sibaz

Questa soluzione non ha funzionato per me fino a quando non ho inserito bash -ila fine della sceneggiatura.
Adolfo Correa,

6

Tendo a fare qualcosa del genere negli script che richiedono un agente.

#!/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.

Fondamentalmente la prima cosa che fa lo script controlla se un agente è in esecuzione. In caso contrario, viene utilizzato per avviare un nuovo processo al posto dello script. L'agente viene avviato, vengono aggiunte le chiavi e infine viene nuovamente richiamato lo script (vedere il $0).


Ma ciò non manterrà alcun parametro di script. E se uno qualsiasi dei parametri ha spazi bianchi, non sarà facile passarli.
Denilson Sá Maia,

3
È possibile utilizzare .. "ssh-add ; $0 $*", o .. "ssh-add ; $0 $@"invece, che potrebbe funzionare. Il che non sarebbe perfetto, ma funzionerebbe sicuramente in molti casi. La soluzione migliore è quasi sempre avere il tuo agente in esecuzione prima di ogni altra cosa, questo è solo qualcosa che potrebbe essere utile in casi oscuri.
Zoredache,

6

Ho trovato che funziona per me.

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

Creo il processo ssh-agent, aggiungo la chiave, faccio quello che devo fare, quindi lo uccido. Non è necessario verificare se è in esecuzione in un secondo momento.


4

In questo caso è meglio usare il portachiavi

Debian / Ubuntu:

apt-get install keychain

RHEL / Fedora / CentOS

yum install keychain

Aggiungi nel tuo .bashrc il seguente:

eval `keychain --eval id_rsa`

Meglio? Perché è meglio?
JFlo,

@JFlo "Meglio" in questo, salverà le variabili env in $ HOME / .keychain / <file>. L'esecuzione di quel comando riprenderà un agente ssh esistente se è ancora in esecuzione. Può quindi essere riutilizzato tra shell / script. In alcuni scenari che non sono super sicuri, quindi devi effettuare quella chiamata. Per me, è un miglioramento rispetto ad alcuni script che avevo scritto per svolgere lo stesso compito
Scott Carlson,

2

Ho scoperto con la soluzione di Zoredache che la chiave sarebbe disponibile per qualsiasi shell che condividesse lo stesso agente ssh della shell che ha chiamato lo script. Volevo evitarlo in uno script che richiedeva l'accesso root a una macchina remota, per ovvi motivi di sicurezza.

Ho trovato mettendo il seguente shebang nella parte superiore della sceneggiatura funziona:

#!/usr/bin/ssh-agent bash

ssh-add /path/to/ssh-key
ssh root@remotehost "remote commands"

-2

Ho provato molto e la soluzione che alla fine ha funzionato è stata la sostituzione della mia passphrase con una stringa vuota.

ssh-keygen -p

Questa è una pratica molto pericolosa. Perché preoccuparsi di usare ssh? Se non proteggi la tua chiave privata, potresti anche parlare in chiaro.
JFlo,

@JFlo: non se il tuo sistema client è sufficientemente sicuro, come potrebbe essere. Soprattutto se aggiungi (puoi e fai) ACL, SELinux o simili, il che è semplice con un file statico ma meno con il socket randomizzato di ssh-agent. Detto questo, di solito non lo consiglierei come prima scelta.
dave_thompson_085 il

Sebbene sia un processo molto utile che fornisci, non credo che risponda a nulla della domanda del PO.
Alexander Bird,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.