Я пишу программу на python на Ubuntu, чтобы выполнить команду ls -l
на RaspberryPi, подключиться к сети.
Кто-нибудь может мне помочь, как мне это сделать?
Я пишу программу на python на Ubuntu, чтобы выполнить команду ls -l
на RaspberryPi, подключиться к сети.
Кто-нибудь может мне помочь, как мне это сделать?
Конечно, есть несколько способов сделать это!
Допустим, у вас есть Raspberry Pi на хосте raspberry.lan
и ваше имя пользователя - irfan
.
Это библиотека Python по умолчанию, которая запускает команды.
Вы можете заставить его запускать ssh
и делать все, что вам нужно на удаленном сервере.
в его ответе есть царапина. Вам определенно следует сделать это, если вы не хотите использовать какие-либо сторонние библиотеки.
Вы также можете автоматизировать ввод пароля/парольной фразы с помощью pexpect
.
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
...
Простой пример из здесь:
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, выполняет команду, возвращает результат. Не требуется сторонняя библиотека.
Вы можете использовать метод ниже с 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')