Skip to content

Python - SSH Modules

Fabric

Install

pip install fabric

Usage

#!/usr/bin/env python
#-*- coding: utf-8 -*-

from fabric.api import *

env.host_string = 'adresse_ip'
env.user = 'user'
env.password = 'password'

L'équivalent de la commande scp:

get(remote_path="/backup/2014.sql.gz", local_path="/home/olivier/2014.sql.gz")

Ou en écriture courte:

get("/backup/2014.sql.gz", "/home/olivier/2014.sql.gz")

Vous pouvez envoyer un fichier via SSH en utilisant la méthode put:

put('/home/olivier/file1.txt', '/backup/file2.txt')

Vous pouvez lancer une commande sur un servant distant comme ceci:

run('python /scripts/script.py')

Executez des scripts avec les droits super utilisateur:

sudo("mkdir /backup/2014")

Paramiko​​​​​​​

Install

pip install paramiko

Usage

Exemple de fonction permettant l'initialisation d'une connexion SSH sur un switch (Avec diffusion de clé préalable):

def connect(user, srv):

    print 'SSH Connect on {0}'.format(srv)

    try:
        conn = paramiko.SSHClient()
        conn.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        conn.connect(srv, username=user)

    except:
        print 'SSH Connect on {0} Problem'.format(srv)
        return 1

    return conn

Ensuite on peut l'initialiser et lancer une commande:

connection = connect('admin', 'server1')
stdin, stdout, stderr = connection.exec_command('ls -l')

Timeout

Il est possible de renseigner une valeur pour le timeout en argument de la fonction connect() (vu plus haut) :

conn.connect('server1', username='admin', timeout=60)

La connection sera donc interrompu si elle n'a pas pu se faire au bout du temps indiqué (en seconde).

Il est aussi possible de mettre une limite sur le temps d'éxécution de la commande ssh. Il y a dans ce cas la 2 possibilités, la première consiste à indiquer un timeout sur la channel de la sortie standard (stdout):

stdout.channel.settimeout(120)

La deuxième méthode consiste à attendre que le signal de fin soit envoyé par la channel de la sortie standard (stdout):

cnt = 1

while not stdout.channel.eof_received:
    print 'command in progress'
    time.sleep(30)

    if cnt is 4:
       print 'time limit exceed (120)'
       break

    cnt += 1
Back to top