Привет, я создаю приложение 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