2017-10-17 9 views
-2

Je suis en train de développer un logiciel en C qui doit être SSH sur une autre machine et exécuter des commandes en tant que root.Est-il possible de surcharger le mot de passe attendu par SSH de/dev/tty en C

Quelque chose qui ressemble à ceci:

char* GetPasswd(void); 

void run(char* apnSshCommand) 
{ 
    FILE* lphSshFD = popen(apnSshCommand,"w"); 
    fprintf(lphSshFD,GetPasswd()); 
    fflush(lphSshFD); 
    fprintf(lphSshFD,"#Command to run in shell"); 
    fflush(lphSshFD); 
} 

GetPasswd() serait un rappel à une interface utilisateur graphique où l'utilisateur a tapé le mot de passe

Je sais que le code ci-dessus n'est pas possible puisque SSH regarde à son propre/dev/tty pour fournir le mot de passe pour l'authentification.

J'ai lu des messages tels que this qui provoque une réponse en utilisant ioctl() et fcntl() mais n'en fournit pas. Avec this qui montre qu'il est possible de la ligne de commande mais je n'ai pas été en mesure de le traduire.

L'utilisation attendre est pas une option

L'utilisation des clés SSH sont pas une option

La bibliothèque SSH C est PAS une option

L'utilisation sshpass est PAS un option

Sans ceux-ci, le sur Ce que je peux penser est de commencer un nouveau processus enfant et de rediriger/fermer les descripteurs de fichiers pour contrôler ce à quoi ssh a accès. EDIT: Ces restrictions proviennent du fait que le système sur lequel je travaille est très ancien et ne contient pas d'outils tels que expect, sshpass et la bibliothèque C SSH, et est soumis à de multiples restrictions concernant les sshkeys peut être utilisé

+1

'fprintf (lphSshFD, GetPasswd());' semble erroné. Où est l'argument chaîne de format à 'fprintf()'? – Barmar

+1

Que diriez-vous d'utiliser les clés publiques SSH? – Barmar

+0

'lpSshFD' semble mauvais, vous programmez API Windows? –

Répondre

0

j'ai pu trouver une solution en regardant le code source pour sshpass que j'ai trouvé here

0

cela fonctionne pour moi:

Créer un script appelé pwd.sh qui émet le mot de passe:

#!/bin/bash                             
echo -n mypassword 

ssh Exécuter dans une nouvelle session comme ceci:

SSH_ASKPASS=/path/to/pwd.sh DISPLAY= setsid -w ssh [email protected] <command>    

L'effet de setsid est de courir ssh détaché du terminal de contrôle, qui est ce qui est nécessaire pour qu'il respecte SSH_ASKPASS.

Je n'ai pas essayé, mais je m'attendrais à pouvoir exécuter cette commande à partir de C en utilisant system(). Pour l'anecdote, j'ai testé cela avec OpenSSH_7.2p2 sur Ubuntu.

+1

Marqueurs de note: Stock Solaris doesn N'ayez pas de commande setsid. – dhke

+0

Il est disponible pour OpenSolaris, ce problème n'est peut-être pas insurmontable. Si c'est le cas, il ne devrait pas être difficile de compiler les ~ 40 lignes de C que l'implémentation 'setsid' requiert. Ou simplement l'utiliser comme base pour une autre implémentation d'un wrapper pour 'ssh'. Ou peut-être simplement cuire un effet similaire en utilisant une combinaison de 'nohup',' & ', et de redirection. –