2009-09-22 6 views
1

Je me demande si quelqu'un a des idées là-dessus. J'ai un script bash qui devrait mettre ma clé ssh sur une machine distante. Adoptée à partir here, le script lit,Commande shell python - pourquoi ça ne marchera pas?

#!/usr/bin/sh 
[email protected] 
KEY="$HOME/.ssh/id_rsa.pub" 
KEYCODE=`cat $KEY` 
ssh -q $REMOTEHOST "mkdir ~/.ssh 2>/dev/null; chmod 700 ~/.ssh; echo "$KEYCODE" >> ~/.ssh/authorized_keys; chmod 644 ~/.ssh/authorized_keys" 

Cela fonctionne. Le script python équivalent doit être

#!/usr/bin/python 
import os 
os.system('ssh -q %(REMOTEHOST)s "mkdir ~/.ssh 2>/dev/null; chmod 700 ~/.ssh; echo "%(KEYCODE)s" >> ~/.ssh/authorized_keys; chmod 644 ~/.ssh/authorized_keys"' % 
      {'REMOTEHOST':'[email protected]', 
      'KEYCODE':open(os.path.join(os.environ['HOME'], 
             '.ssh/id_rsa.pub'),'r').read()}) 

Mais dans ce cas, je reçois que

sh: line 1: >> ~/.ssh/authorized_keys; chmod 644 ~/.ssh/authorized_keys: No 
such file or directory 

Qu'est-ce que je fais mal? J'ai essayé d'échapper aux citations les plus internes mais le même message d'erreur ... Merci d'avance pour vos réponses.

Répondre

5

Vous avez une question sérieuse - en ce que os.system ne se comporte pas comme vous l'attendez - mais aussi, vous devriez sérieusement repenser l'approche dans son ensemble.

Vous lancez un interpréteur Python - mais ensuite, via os.system, dites à cet interpréteur Python de lancer un shell! os.system ne devrait pas être utilisé du tout en Python moderne (subprocess est un remplacement complet) ... mais en utilisant n'importe quel appel Python qui démarre une instance de shell est exceptionnellement stupide dans ce genre de cas d'utilisation. Maintenant, en termes de problème immédiat, regardez comment vos guillemets nichent. Vous verrez que le devis que vous commencez avant que mkdir soit fermé dans le echo, permettant à votre commande d'être divisée à un endroit que vous n'avez pas l'intention de faire.

Les correctifs suivants cette question immédiatement, mais il est toujours terrible et le mal (commence un sous-shell inutilement, ne vérifie pas correctement l'état de sortie, et doivent être convertis pour utiliser subprocess.Popen()):

os.system('''ssh -q %(REMOTEHOST)s "mkdir ~/.ssh 2>/dev/null; chmod 700 ~/.ssh; echo '%(KEYCODE)s' >> ~/.ssh/authorized_keys; chmod 644 ~/.ssh/authorized_keys"''' % { 
    'REMOTEHOST':'[email protected]', 
    'KEYCODE':open(os.path.join(os.environ['HOME'], '.ssh/id_rsa.pub'),'r').read() 
}) 
+0

Arg! Donc c'était * la citation ... Je suppose que j'aurais pu aussi faire '...' ... '' ... '' ... '' ... '' mais j'ai été momentanément confondue avec la solution bash de le web qui a fonctionné avec les deux ensembles de doubles guillemets imbriqués ... En tout cas merci pour l'admonestation. Je vais aller lire sur sous-processus. – hatmatrix

Questions connexes