Python. Реализация удаленного управления

Рейтинг: 0Ответов: 1Опубликовано: 16.07.2023

Всем привет! Хочу реализовать управление через консоль удаленной машины посредством Python. Знаю, что уже есть готовые решения а la TeamViewer или Radmin, но хотелось бы написать что-то свое. Первое, что приходит на ум - это сокеты. Т.е. слушается определенный порт и через него идет обмен данными. Вот код, только он пока еще сырой:

import socket
import time
import subprocess

listener = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listener.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
IP = socket.gethostbyname(socket.gethostname())
PORT = 6969
listener.bind((IP, PORT))
listener.listen(0)
connection, address = listener.accept()

connection.send("Hello!".encode('utf8'))
connection.send("\r\n".encode('utf8'))
    
while True:
    while True:
        data = connection.recv(1024).decode("utf8")
        cmd = data
        res = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)

        time.sleep(3)

        result = res.stdout
        connection.send(result)

        if not data:
            break 
        

Вроде, все хорошо, но беда в том, что подобное работает лишь если я и удаленная машина находимся в одной подсети. Доступа к маршрутизатору и возможность настроить port forwarding для доступа извне, разумеется, нет.

Есть идея перевернуть все вверх наголову и сделать так, чтобы удаленная машина стала вместо сервера клиентом, т.е., скажем так, делала каждые 5 секунд GET-запрос и получала через это дело команду для выполнения и передавала результат исполнения предыдущей команды. И написать для этого дела небольшое web-приложение...

Насколько адекватно такое решение? Может есть другие варианты кроме этих?

Ответы

▲ 0

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

Создание небольшого веб-приложения на удаленной машине, которое будет слушать входящие GET-запросы и выполнять команды, звучит как хорошая идея. Вы можете использовать фреймворк Flask для создания такого веб-приложения. Вот пример, демонстрирующий основные шаги:

from flask import Flask, request

app = Flask(__name__)

@app.route("/", methods=["GET"])
def execute_command():
    cmd = request.args.get("cmd")
    if cmd:
        # Выполнение команды и получение результата
        result = execute_shell_command(cmd)
        return result
    else:
        return "No command provided."

def execute_shell_command(cmd):
    # Выполнение команды в оболочке и получение результата
    res = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
    return res.stdout

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=6969)

На удаленной машине вы можете запустить это веб-приложение, и оно будет слушать входящие GET-запросы на порту 6969. Вы можете использовать браузер или другой инструмент для отправки GET-запросов с командами на удаленную машину. Результат выполнения команды будет возвращен в ответе на GET-запрос.

Затем вы можете разработать клиентскую программу на другой машине, которая будет периодически отправлять GET-запросы с командами на удаленную машину и обрабатывать результаты.

Однако, учтите, что это простой пример и не учитывает безопасность или аутентификацию. При реализации удаленного управления в реальном применении, важно учесть меры безопасности, чтобы предотвратить несанкционированный доступ к удаленной машине.