Ho scritto collegamenti Python per libssh2. Libssh2 è una libreria lato client che implementa il protocollo SSH2.
import socket
import libssh2
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('exmaple.com', 22))
session = libssh2.Session()
session.startup(sock)
session.userauth_password('john', '******')
channel = session.channel()
channel.execute('ls -l')
print channel.read(1024)
Non l'ho provato, ma questo modulo pysftp potrebbe aiutare, che a sua volta usa paramiko. Credo che tutto sia lato client.
Il comando interessante è probabilmente .execute()
che esegue un comando arbitrario sulla macchina remota. (Il modulo include anche .get()
e .put
metodi che alludono maggiormente al suo carattere FTP).
AGGIORNAMENTO:
Ho riscritto la risposta dopo che il post sul blog a cui avevo originariamente collegato non è più disponibile. Alcuni dei commenti che fanno riferimento alla vecchia versione di questa risposta ora sembreranno strani.
Puoi codificarlo tu stesso usando Paramiko, come suggerito sopra. In alternativa, puoi esaminare Fabric, un'applicazione python per fare tutte le cose che hai chiesto:
Fabric è una libreria Python e uno strumento da riga di comando progettato per semplificare la distribuzione di applicazioni o l'esecuzione di attività di amministrazione del sistema tramite il protocollo SSH. Fornisce strumenti per eseguire comandi shell arbitrari (come un normale utente di accesso o tramite sudo), caricare e scaricare file e così via.
Penso che questo si adatti alle tue esigenze. Inoltre non è una libreria di grandi dimensioni e non richiede l'installazione del server, sebbene abbia dipendenze da paramiko e pycrypt che richiedono l'installazione sul client.
L'app era qui. Ora può essere trovato qui.
* The official, canonical repository is git.fabfile.org
* The official Github mirror is GitHub/bitprophet/fabric
Ci sono molti buoni articoli su di esso, anche se dovresti stare attento perché è cambiato negli ultimi sei mesi:
Implementazione di Django con Fabric
Strumenti del moderno Python Hacker:Virtualenv, Fabric e Pip
Implementazione semplice e facile con Fabric e Virtualenv
Successivamente:Fabric non richiede più l'installazione di paramiko:
$ pip install fabric
Downloading/unpacking fabric
Downloading Fabric-1.4.2.tar.gz (182Kb): 182Kb downloaded
Running setup.py egg_info for package fabric
warning: no previously-included files matching '*' found under directory 'docs/_build'
warning: no files found matching 'fabfile.py'
Downloading/unpacking ssh>=1.7.14 (from fabric)
Downloading ssh-1.7.14.tar.gz (794Kb): 794Kb downloaded
Running setup.py egg_info for package ssh
Downloading/unpacking pycrypto>=2.1,!=2.4 (from ssh>=1.7.14->fabric)
Downloading pycrypto-2.6.tar.gz (443Kb): 443Kb downloaded
Running setup.py egg_info for package pycrypto
Installing collected packages: fabric, ssh, pycrypto
Running setup.py install for fabric
warning: no previously-included files matching '*' found under directory 'docs/_build'
warning: no files found matching 'fabfile.py'
Installing fab script to /home/hbrown/.virtualenvs/fabric-test/bin
Running setup.py install for ssh
Running setup.py install for pycrypto
...
Successfully installed fabric ssh pycrypto
Cleaning up...
Questo è per lo più cosmetico, tuttavia:ssh è un fork di paramiko, il manutentore per entrambe le librerie è lo stesso (Jeff Forcier, anche l'autore di Fabric), e il manutentore ha in programma di riunire paramiko e ssh sotto il nome paramiko. (Questa correzione tramite pbanka.)
Se vuoi evitare qualsiasi modulo extra, puoi usare il modulo subprocess per eseguire
ssh [host] [command]
e catturare l'output.
Prova qualcosa come:
process = subprocess.Popen("ssh example.com ls", shell=True,
stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output,stderr = process.communicate()
status = process.poll()
print output
Per gestire nomi utente e password, puoi utilizzare subprocess per interagire con il processo ssh oppure puoi installare una chiave pubblica sul server per evitare la richiesta della password.