2015-02-09 14 views

risposta

24

Certo, ci sono diversi modi per farlo!

Diciamo che hai un Raspberry Pi su un host raspberry.lan e il tuo nome utente è irfan.

sottoprocesso

E 'la libreria Python di default che esegue comandi.
È possibile farlo eseguire ssh e fare tutto ciò che è necessario su un server remoto.

scrat has it covered in his answer. Dovresti assolutamente farlo se non vuoi usare alcuna libreria di terze parti.

È inoltre possibile automatizzare la password o la passphrase immesse utilizzando pexpect.

paramiko

paramiko è una libreria di terze parti che aggiunge il supporto SSH-protocollo, in modo che possa funzionare come uno SSH-client.

Il codice di esempio che la connessione al server, eseguire e afferrare i risultati del comando ls -l apparirebbe così:

import paramiko 

client = paramiko.SSHClient() 
client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
client.connect('raspberry.lan', username='irfan', password='my_strong_password') 

stdin, stdout, stderr = client.exec_command('ls -l') 

for line in stdout: 
    print line.strip('\n') 

client.close() 

tessuto

È possibile anche ottenere utilizzando fabric.
Fabric è uno strumento di distribuzione che esegue vari comandi su server remoti.

È spesso utilizzato per eseguire roba su un server remoto, quindi è possibile inserire facilmente la versione più recente dell'applicazione Web, riavviare un server Web e quant'altro con un singolo comando. In realtà, puoi eseguire lo stesso comando su più server, il che è fantastico!

Anche se è stato creato come strumento di distribuzione e gestione remota, è ancora possibile utilizzarlo per eseguire i comandi di base.

# fabfile.py 
from fabric.api import * 

def list_files(): 
    with cd('/'): # change the directory to '/' 
     result = run('ls -l') # run a 'ls -l' command 
     # you can do something with the result here, 
     # though it will still be displayed in fabric itself. 

E 'come digitando cd / e ls -l nel server remoto, in modo otterrete la lista delle directory nella cartella principale.

Quindi eseguire nella shell:

fab list_files 

Si chiederà un indirizzo del server:

No hosts found. Please specify (single) host string for connection: [email protected] 

Una breve nota: è inoltre possibile assegnare un nome utente e una serie proprio nel comando fab:

fab list_files -U irfan -H raspberry.lan 

Oppure potresti inserire un host nella variabile env.hosts nel tuo fabfile. Here's how to do it.


Poi ti verrà richiesta una password SSH:

[[email protected]] run: ls -l 
[[email protected]] Login password for 'irfan': 

E poi il comando verrà eseguito con successo.

[[email protected]] out: total 84 
[[email protected]] out: drwxr-xr-x 2 root root 4096 Feb 9 05:54 bin 
[[email protected]] out: drwxr-xr-x 3 root root 4096 Dec 19 08:19 boot 
... 
+0

come installarlo –

+2

@ IrfanGhaffar7 è possibile installare la libreria Python di terze parti usando 'pip' o' easy_install'. Quindi sarebbe 'pip install fabric'. Controlla la documentazione (ho collegato sia a fabric che a paramiko doc), ha quickstart e tutorial! –

+0

il mio nome host della macchina remota è 'Pi @ 192.168.2.34' e la password è' raspberrypi'. Come faccio a menzionare queste informazioni su Fabric – Fahadkalis

6

semplice esempio dalla here:

import subprocess 
import sys 

HOST="www.example.org" 
# Ports are handled in ~/.ssh/config since we use OpenSSH 
COMMAND="uname -a" 

ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND], 
         shell=False, 
         stdout=subprocess.PIPE, 
         stderr=subprocess.PIPE) 
result = ssh.stdout.readlines() 
if result == []: 
    error = ssh.stderr.readlines() 
    print >>sys.stderr, "ERROR: %s" % error 
else: 
    print result 

Fa esattamente quello che si vuole: si connette tramite ssh, esegue il comando, restituisce in uscita. Non è necessaria alcuna libreria di terze parti.

+0

quando uso questo comando = "ls -l", il suo risultato è in una riga, significa non leggibile ma funziona –

+1

@ IrfanGhaffar7 è perché il 'risultato' è una lista, non un stringa. Puoi fare 'print '' .join (result)' per renderlo leggibile. –

+0

Grazie .... è ok ora –