Выполнить команду на удаленной машине в Python

Я пишу программу на python на Ubuntu, чтобы выполнить команду ls -l на RaspberryPi, подключиться к сети.

Кто-нибудь может мне помочь, как мне это сделать?

Ответ 1

Конечно, есть несколько способов сделать это!

Допустим, у вас есть Raspberry Pi на хосте raspberry.lan и ваше имя пользователя - irfan.

подпроцесс

Это библиотека Python по умолчанию, которая запускает команды.
Вы можете заставить его запускать ssh и делать все, что вам нужно на удаленном сервере.

в его ответе есть царапина. Вам определенно следует сделать это, если вы не хотите использовать какие-либо сторонние библиотеки.

Вы также можете автоматизировать ввод пароля/парольной фразы с помощью pexpect.

paramiko

paramiko - сторонняя библиотека, которая добавляет поддержку протокола SSH, поэтому она может работать как SSH-клиент.

Пример кода, который будет подключаться к серверу, выполнять и ls -l результаты команды ls -l будет выглядеть так:

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()

ткань

Вы также можете добиться этого с помощью fabric.
Fabric - это инструмент развертывания, который выполняет различные команды на удаленных серверах.

Он часто используется для запуска чего-либо на удаленном сервере, так что вы можете легко поместить свою последнюю версию веб-приложения, перезапустить веб-сервер и все остальное с помощью одной команды. На самом деле, вы можете запустить одну и ту же команду на нескольких серверах, и это здорово!

Хотя он был создан как инструмент для развертывания и удаленного управления, вы все равно можете использовать его для выполнения основных команд.

# 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.

Это похоже на ввод cd/ и ls -l на удаленном сервере, поэтому вы получите список каталогов в корневой папке.

Затем запустите в оболочке:

fab list_files

Он запросит адрес сервера:

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

Небольшое примечание: Вы также можете назначить имя пользователя и право хоста в команде fab:

fab list_files -U irfan -H raspberry.lan

Или вы можете поместить хост в переменную env.hosts в вашем fabfile. Вот как это сделать.


Затем вам будет предложено ввести пароль SSH:

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

И тогда команда будет выполнена успешно.

[[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
...

Ответ 2

Простой пример из здесь:

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

Он делает именно то, что вы хотите: подключается через ssh, выполняет команду, возвращает результат. Не требуется сторонняя библиотека.

Ответ 3

Вы можете использовать метод ниже с Linux/Unix, встроенной в команду ssh.

   import os
   os.system('ssh [email protected]  bash < local_script.sh >> /local/path/output.txt 2>&1')
   os.system('ssh [email protected]  python < local_program.py >> /local/path/output.txt 2>&1')