Python Нарезка строки с выводом Paramiko - PullRequest
0 голосов
/ 08 мая 2020

Привет, я создаю приложение python, которое упростит управление несколькими Raspberry Pi в моей сети. Идея состоит в том, что он ускорит выполнение базовых c задач, таких как обновления Pi, путем передачи команд Pi через модуль paramiko python. Я могу сохранять команды в приложении, а затем запускать их с помощью простого ярлыка, вместо того, чтобы входить в систему и вводить их.

Я столкнулся с камнем преткновения в том, что мои команды выполняются, и я получаю результат, но из-за того, как я использую paramiko каждый раз, когда команда запускается, я получаю полный вывод консоли, т.е. все, что появляется, когда вы входите в систему через S SH в моем выводе. Чтобы уменьшить его и отображать только интересующий меня вывод (результат выполненной мной команды). Я пытаюсь использовать метод нарезки строк.

Мой код сначала проверяет вывод на наличие :~$, используя string.find () в качестве первого найденного экземпляра, который будет непосредственно перед командой я использую это как начальную точку для среза. На данный момент я только хочу избавиться от вывода до :~$. Затем я, вероятно, передам результат первого среза в новую строку, а затем поищу user@ в этой строке как конечную точку для среза. я разрезал строку, я не получаю никакого вывода. Иногда я получаю вывод, и это кажется правильным в том смысле, что я ожидаю, что произойдет, но большую часть времени я не получаю вывода, а иногда, если я проверяю длину строки, он вернется к скажем, там есть несколько символов, но я не получаю вывода, когда пытаюсь распечатать переменную (rem1).

Ниже мой код, я запускаю команду, а затем повторяю цикл сценария до тех пор, пока я не пойму второй :~$ в выходных данных, указывающих, что команда завершила выполнение, или пока в выходная переменная. На каждом l oop содержимое output переносится в final_output, которое я использую как полную строку для обработки в конце.

Это может быть долгий способ делать то, что я хочу делать, но, честно говоря, я не мог придумать другого выхода, так как я продолжал сталкиваться с проблемами при попытке использовать интерактивные команды, такие как apt full-upgrade

def interactive_command(connect, ip_addr, port, uname, passwd, admin, issue_cmd):
    affirmative = {'yes', 'y', 'Y', 'Yes', 'ye', 'Ye', ''}
    connect.connect(ip_addr, port, uname, passwd)
    channel = connect.invoke_shell()
    channel.set_combine_stderr(True)
    stdin = channel.makefile('wb')

    channel.send(issue_cmd + '\n')

    if admin != -1:
        print('Sudo detected. Attempting to elevate privileges...')
        channel.send(passwd + '\n')
    else:
        pass

    fin_check = {':~$', ':~ $'}
    ser_check = {'[Y/n]', '(Y/I/N/O/D/Z) [default=N] ?'}
    counter = 0
    prompt_count = 0

    running = True
    monitoring = False
    final_output = ''

    while running:
        stdin
        counter = counter + 1
        #print('Loop Counter: ' + str(counter))

        # allow for 10 while loops to be completed before raising an error.

        if counter == 10:
            print('Unable to establish whether the command has finished running')
            running = False
            print('Counter: ' + str(counter))
            print('Prompt Count: ' + str(prompt_count))

        #print('Prompt Count: ' + str(prompt_count))
        sleep(2)
        if channel.recv_ready():
            output = channel.recv(65535).decode('utf-8')
        else:
            running = False
            monitoring = False
            print('No output detected. Printing last output.')
            break

        final_output = final_output + output
       #print(len(output))

        search = str(output)
        finish = -1

        if search == -1 or finish == -1:
            for y in ser_check:
                search = str(output).find(y)

                if search != -1:
                    print(output)
                    resp = input('Response?: ') + '\n'
                    channel.send(resp)
                    running = False
                    monitoring = True
            next

            for x in fin_check:
                if x in output:
                    prompt_count = prompt_count + 1
                    #print('Prompt Count: ' + str(prompt_count))
                if prompt_count == 2:
                    finish = 1
                    break
                else:
                    finish = -1

                if finish != -1:
                    print('Command Finished')
                    #print('Prompt Count: ' + str(prompt_count))
                    running = False
                    if monitoring:
                        pass
                    else:
                       # print(output)
                        break
            next
        sleep(3)

        while monitoring:
            output = channel.recv(65535).decode('utf-8')
            final_output = final_output + output
            for x in fin_check:
                if x in output:
                    prompt_count = prompt_count + 1
                    #print('Prompt Count: ' + str(prompt_count))
                if prompt_count == 2:
                    finish = 1
                else:
                    finish = -1

                if finish != -1:
                    print('Command Finished')
                    #print('Prompt Count: ' + str(prompt_count))
                    running = False
                    monitoring = False
                    #print(output)
            next
        if prompt_count == 2:
            print('Prompt Count Reached. Command Finished')
            break
        sleep(3)

    print()

    #print(final_output)

    for c in fin_check:
        start_point = final_output.find(c)

        if start_point == -1:
            pass
        else:
            #print(len(final_output))
            #print(start_point)
            start_point = start_point + len(c)
            #print(start_point)
    next

    rem1 = final_output[start_point:]
    print(len(rem1))
    print(rem1)

    print()

    complete = input('Are you finished with this connection? ')

    if complete in affirmative:
        complete = 'Y'

    return complete
...