Список файлов в каталоге через сокет Python

Как вы можете отправить команду для отображения списка файлов в каталоге через сокет?

#
# Write a script that connects to 'localhost' port 10000
# You then need to send a command to list the files in the /tmp directory
#

import socket, os, json

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("localhost", 10000))
cmd = json.dumps(os.listdir("/tmp"))
sock.send(cmd.encode())
print(sock.recv(1024).decode())

Это не дает мне абсолютно никакого результата! Что дает?


person Ollie    schedule 20.04.2020    source источник
comment
Ошибка, вероятно, в вашей строке sock.send(cmd). cmd должен быть объектом bytes. os.listdir возвращает список строк. Сначала вы должны объединить список. Затем конвертируйте его в байты. Попробуйте sock.send('\n'.join(cmd).encode('utf8'))   -  person F Trias    schedule 21.04.2020
comment
Он возвращает AttributeError: 'list' object has no attribute 'encode'.   -  person Ollie    schedule 21.04.2020
comment
Я преждевременно нажал Enter, а затем пересмотрел строку. Делает ли пересмотренная линия то же самое?   -  person F Trias    schedule 21.04.2020
comment
Вы действительно должны сказать, на какой номер строки он жалуется. Это 4 строка? Я подозреваю, что listdir нуждается в str, поэтому избавьтесь от «b».   -  person F Trias    schedule 21.04.2020
comment
Ой! Если вы передаете объект bytes в listdir, он возвращает объект списка байтов. Итак, если вы сохраните файл b'/tmp'. Возможно, вам удастся уйти с sock.send(b'\n'.join(cmd)).   -  person F Trias    schedule 21.04.2020
comment
Я попробовал это, и это избавило от ошибок. Однако теперь он вообще ничего не выводит, и если я делаю sock.recv(1024), он просто говорит b''.   -  person Ollie    schedule 21.04.2020
comment
Что находится на другом конце этого сокетного соединения? Это то, что получает список каталогов и будет предоставлять любой ответ, который распечатывает этот код.   -  person jasonharper    schedule 01.05.2020
comment
Среда, в которой я пытаюсь выполнить данные мне инструкции, настроена таким образом, что я не могу (насколько мне известно) видеть серверную часть сокетных соединений, которые я делаю.   -  person Ollie    schedule 01.05.2020
comment
Я предлагаю вам взглянуть на протокол передачи файлов, там уже есть библиотека, встроенная в python, которая может это сделать.   -  person Jose A.    schedule 01.05.2020


Ответы (1)


Я несколько не люблю отвечать на свои вопросы, но я нашел ответ. Я использовал subprocess.Popen вот так:

import socket, subprocess

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("localhost", 10000))

cmd = ["ls", "-a", "/tmp"]
order = subprocess.Popen(cmd)
sock.send(order)

print(sock.recv(1024))
person Ollie    schedule 03.05.2020