2016-02-11 1 views
0

J'essaie d'exécuter un ensemble de commandes via ssh à partir d'un script Python. Je suis venu sur le concept here-document et pensé: cool, laissez-moi mettre en œuvre quelque chose comme ceci:ssh + syntaxe ici-document avec Python

command = (('ssh [email protected] /usr/bin/bash <<EOF\n' 
     + 'cd %s \n' 
     + 'qsub %s\n' 
     + 'EOF') % (test_dir, jobfile)) 

try: 
    p = subprocess.Popen(command.split(), stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
except : 
    print ('from subprocess.Popen(%s)' % command.split()) 
    raise Exception 
#endtry 

Malheureusement, voici ce que je reçois:

bash: warning: here-document at line 0 delimited by end-of-file (wanted `EOF') 

Je ne sais pas comment je peux coder que final déclaration de fichier (je devine les caractères newline obtenir de la manière ici?)

Je l'ai fait une recherche sur le site, mais il semble y avoir aucun exemple Python de ce genre ...

+1

N'êtes-vous pas un manque '\ n' juste après' << EOF'? – rodrigo

+0

J'ai changé le code (comme indiqué dans l'OP) mais cela ne fonctionne toujours pas (même erreur) – user2186862

Répondre

1

Voici un exemple de travail minimum, la clé est qu'après << EOF la chaîne restante ne doit pas être fractionnée. Notez que command.split() n'est appelée qu'une seule fois.

import subprocess 

# My bash is at /user/local/bin/bash, your mileage may vary. 
command = 'ssh [email protected] /usr/local/bin/bash' 
heredoc = ('<< EOF \n' 
      'cd Downloads \n' 
      'touch test.txt \n' 
      'EOF') 

command = command.split() 
command.append(heredoc) 
print command 

try: 
    p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
except Exception as e: 
    print e 

Vérifiez en vérifiant que le fichier créé test.txt apparaît dans le répertoire Téléchargements sur l'hôte que vous ssh: ed dans.

Cordialement,
Filip