Могу подключиться к розетке в моей локальной сети, но не к отдельным (python сокетов) - PullRequest
0 голосов
/ 21 июня 2020

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

У меня очень мало опыта работы с сетями, и я не совсем уверен, какой необходимой информации.

Это код, который я использовал:

Сервер:

import sys
import socket

def create_socket():
    try:
        global host
        global port
        global s
        host = ""
        port = 9999
        s = socket.socket()

    except socket.error as msg:
        print("SocketCreationError: " +str(msg))

def bind_socket():
    try:
        global host
        global port
        global s

        print("binding the port " + str(port)+"...")

        s.bind((host,port))
        s.listen(5)

        
    except socket.error as msg:
        print("SocketBindingError: " + str(msg))
        print("retrying...")
        bind_socket()

def socket_accept():
    conn,address = s.accept()
    print("Connection established. \nIP:"+address[0]+"\nPort:"+str(address[1]))
    print(str(conn.recv(1024), "utf-8"), end="")
    send_command(conn)
    conn.close()

#allows user to send command to client computer
def send_command(conn):
    while True:
        try:
            cmd = input(">")
            if cmd == 'exit':
                conn.close()
                s.close()
                sys.exit()
            if len(str.encode(cmd)) > 0:
                conn.send(str.encode(cmd))
                clientResponse = str(conn.recv(1024),"utf-8")
                print(clientResponse, end="")
        except Exception:
            print("Something went wrong...")

def main():
    create_socket()
    bind_socket()
    socket_accept()

main()

Клиент:

import socket
import os
import subprocess

#connect to socket and send cwd
s = socket.socket()
host = 'myIP'
port = 9999

s.connect((host, port))
s.send(str.encode(os.getcwd()))

#allows form of command line on host pc
while True:
    try:
        data = s.recv(1024)
        outputStr = ""
        
        if data.decode("utf-8") == 'dir':
            dirList = os.listdir(os.getcwd())
            
            for i in dirList:
                print(i)
                outputStr = outputStr + i + "\n"
                
        elif data[:2].decode("utf-8") == 'cd':
            dirTo = data[3:].decode("utf-8")
            print(data[3:].decode("utf-8"))
            os.chdir(os.getcwd() + "\\" + dirTo)
        elif len(data) > 0:
            cmd = subprocess.Popen(data.decode("utf-8"), shell=True,stdout=subprocess.PIPE,stdin=subprocess.PIPE, stderr=subprocess.PIPE)
            outputByte = cmd.stdout.read() + cmd.stderr.read()
            outputStr = str(outputByte, "utf-8")
            print(outputStr)
            
        cwd = os.getcwd()
        s.send(str.encode(outputStr +"\n"+cwd))

#handle something going wrong and just allows to continue
    except Exception:
        cwd = os.getcwd()
        s.send(str.encode("Something went wrong...\n"+ cwd))

Я использую ipv4 адреса. Я думаю, что это может иметь какое-то отношение к переадресации портов на стороне сервера, но опять же, я не уверен?

Заранее спасибо за любые ответы :)

1 Ответ

0 голосов
/ 22 июня 2020

Вы не можете подключиться к своему компьютеру через удаленную сеть из-за переадресации портов. Если вы не знаете, что это такое, я рекомендую взглянуть на статью в Википедии об этом: https://en.wikipedia.org/wiki/Port_forwarding Существует множество различных методов перенаправления портов, самым простым из которых является UPnP / IGD (см. это вверх), но если вы просто заинтересованы в возможности удаленного доступа к вашему компьютеру, вы можете просто использовать S SH (Secure Shell Connection), чтобы сделать это (я думаю, что он работает и в удаленных сетях). Если вы используете Linux, это должно быть довольно легко настроить, просто посмотрите, как это сделать. Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...