WOLF 2018 Ответов: 2

Как мне преобразовать данные в строку


я пытаюсь сделать свою собственную корневую оболочку для своего сервера, чтобы я мог работать на внутренней стороне его, но каждый раз, когда я пытаюсь проверить, есть ли вход == "выход", он просто не проверяет его и продолжает. извините, что это написано неправильно, я не англичанин. я просто не могу понять, что я делаю не так. кроме того, я пытаюсь работать с несколькими клиентами и буду добавлять логин, и мне нужно знать, как сравнить данные recv и проверить их, чтобы логин работал, и я просто не знаю, что происходит не так.

Что я уже пробовал:

import socket
import threading
import json
import hashlib
from subprocess import PIPE, Popen

decode_utf8 = lambda data: data.decode("utf-8")

def main():
    s = socket.socket()
    s.bind(('127.0.0.1', 12344))
    s.listen(5)
    while True:
        r, addr = s.accept()
        print("Connected to by {}".format(str(addr)))
        threading.Thread(target=login(r)).start()

def login(r):
    read = open('data.json', 'r')
    data = json.load(read)
    while True:
        input_user = r.recv(1024)
        user = decode_utf8(input_user)
        try:
            password = data[str(user)]['password']
            input_user = r.recv(1024)
            pwd = decode_utf8(input_user)
            passdata = hashlib.sha256(pwd.encode().hexdigest()
            if passdata == password:
                rootShell(r)
            else:
                r.send('Wrong Password or Username')
                r.close()
        except:
            r.send('Wrong Password or Username')
            r.close()

def rootShell(r):
    while True:
        input_data = r.recv(1024)
        data = decode_utf8(input_data)
        print(data)
        try:
            if data.lower().startswith("exit"):
                r.send('Goodbye and see you later')
                r.close()
            else:
                r.send(cmdline(data))
        except:
            r.send("Error Running Command")

def cmdline(command):
    process = Popen(
        args=command,
        stdout=PIPE,
        shell=True
    )
    return process.communicate()[0]

main()

Richard MacCutchan

Добавьте некоторый код, чтобы точно отобразить то, что было получено первым, и каков результат после вызова decode_utf8(input_data) Не стоит просто предполагать, что ваш код будет работать.

WOLF 2018

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

это я подключаюсь к нему

root@Unknown:~# nc 127.0.0.1 12344
whoami
корень

это вывод скрипта python

каталог /usr/Бен/вместо python2.7 /root/wolf-python-projects/server.py
Подключено к ('127.0.0.1', 39468)
whoami

root-это то, что сервер сказал мне, что я есть. (ну да, я корень)

Richard MacCutchan

Но вы не показали данные, которые вы вводите, и то, что Python интерпретирует их как.

WOLF 2018

я набрал whoami

2 Ответов

Рейтинг:
9

WOLF 2018

Я нашел способ сделать это, преобразовав байты в шестнадцатеричный код и удалив “a0” at из байтов, а затем преобразовав его обратно в строку

data = r.recv(1024)
данные = кодеков.кодирование(сведения, ‘наговор’)
ул. данные = (сведения).заменить(‘А0’, ‘)
вернуться кодеки.расшифруйте(сведения, ‘наговор’)


Рейтинг:
1

#realJSOP

Попробуйте это (никаких гарантий, просто удар в темноте):

if (data.lower() == "exit"):


или может быть

if (data.lower().startswith("exit")):


WOLF 2018

нет, я знаю, что ввел выход во всех строчных буквах. но он просто не отвечает. ps но я все же попробовал

WOLF 2018

хорошо, спасибо, чувак, что второй сработал, но почему я не могу просто сравнить его как строку? потому что я собираюсь добавить логин и ну мне нужно проверить совпадает ли имя пользователя и пароль

#realJSOP

Я не разработчик python (пока). Я просто думал о разных способах, которыми струна не будет сравнивать то, как вы думаете. Держу пари, что это как-то связано с тем, что вы конвертируете его в строку UTF8, прежде чем сравнивать.

WOLF 2018

вот что я думаю. теперь я получаю эту ошибку

Обратная трассировка (самый недавний призыв последнего):
Файл "/root/wolf-python-projects/server.py", строка 41, in <module>
главный()
Файл "/root/wolf-python-projects/server.py", строка 15, в основном
нарезание резьбы.Поток(target=rootShell(r))
Файл "/root/wolf-python-projects/server.py", строка 31, в корне
r.send("ошибка выполнения команды")
Файл "/usr/lib/python2.7/socket.py", строка 174, in _dummy
возникает ошибка(файл, 'неверный дескриптор файла')
socket.error: [Errno 9] плохой файловый дескриптор

#realJSOP

Лучшее, что я могу порекомендовать для этого, - это google, учитывая мой недостаточный опыт работы с python.