2011-11-07 4 views
8

Ho una classe C++ utilizzata per avviare e comunicare con processi esterni (in qualche modo simile a Qt's QProcess - non possiamo usare Qt poiché stiamo lavorando su un piccolo sistema embedded). Utilizza le chiamate di sistema pipe e dup2 per stabilire un collegamento tra processo padre e figlio. Il problema è che non funziona con ssh, scp e altri programmi che prevedono una password. Ho messo a punto ssh e sembra che apra/dev/tty e in qualche modo lo usi per leggere la password dalla riga di comando. C'è un modo per inserire la password dalla mia classe o per rilevare che un'appliazione si aspetta input da qualche altra fonte rispetto a stdin (non deve essere affatto portatile)?Come posso reindirizzare la password a ssh in C++?

+10

Non si desidera inviare la password. Quello che vuoi fare è leggere ssh e usare le tue chiavi private nella directory ~/.ssh –

+0

Usa l'autenticazione con chiave pubblica o dai un'occhiata a askpass e ssh-agent – sehe

+0

vedi [sshpass] (http://sourceforge.net/projects/sshpass /) – ephemient

risposta

7

È prassi comune per i programmi ssh leggere le password direttamente dai terminali. È necessario allocare uno pseudo-terminale ed eseguire ssh all'interno di questo terminale pseudo per acquisire questo I/O. La pagina pty man (sezione 7, man 7 pty) è una buona introduzione.

Vorrei ripetere che di solito non si vogliono fornire password per ssh, ci sono molte migliori opzioni di autenticazione. Utilizzare un'autenticazione a chiave pubblica per i processi che dovrebbero e possono essere eseguiti senza l'input dell'utente.

+0

+1 per il suggerimento della chiave pubblica. Qualunque altra cosa probabilmente inserirà la password in chiaro nel programma (male). – jedwards

+0

Probabilmente hai ragione riguardo alle falle nella sicurezza, ma voglio solo che questa libreria che sto scrivendo sia flessibile come va. Spetterà all'utente finale se farà le cose ssh in modo corretto o no. – Zbigh1

2

Cerca qualche programma che lo faccia già, ad esempio lftp.

O strace questo Perl one-liner per avere un'idea di che cosa si dovrebbe fare:

perl -MNet::OpenSSH -e 'Net::OpenSSH->new(localhost, password => foo)' 

Si riduce soprattutto per l'assegnazione di una coppia di pseudo-tty sul processo di maestro, si biforcano e impostando la parte schiavo di la pty sul bambino come l'attuale tty prima di exec'ing ssh.