#python #pycharm #subprocess #passwords
#python #pycharm #подпроцесс #пароли
Вопрос:
Итак, я довольно новичок в программировании / кодировании, и у меня есть два вопроса.
- В чем разница между
subprocess.run
иsubprocess.call
? Поскольку не имеет значения, какой из них я использую в приведенном ниже коде, я получаю тот же результат. - Я пытаюсь написать программу с использованием PyCharm CE для изменения MAC-адреса моего MacBook, и это код, который у меня есть до сих пор:
import subprocess
subprocess.run("ifconfig en0 | grep ether", shell=True) #this shows me the current MAC address
subprocess.run("sudo ifconfig en0 ether xx:xx:xx:xx:xx:xx", shell=True) #this changes the MAC address to xx:xx:xx:xx:xx:xx
Поскольку я использовал sudo
его, он запрашивает мой пароль в терминале, и я пытаюсь найти способ узнать, как я могу ввести пароль в программе, не вводя его в терминале.
Кто-нибудь может мне помочь?
Заранее спасибо!
Ответ №1:
Это сработает…
subprocess.run("echo mypassword | sudo -S ifconfig en0 ether xx:xx:xx:xx:xx:xx", shell=True)
Ответ №2:
Я считаю, что подпроцесс ведет себя больше как файловый объект. Вы можете открыть подпроцесс, отправить строку и / или запросить строку, но вы не можете по-настоящему «контролировать» подпроцесс (если только вы не создадите механизм для этого). Лучшим модулем IMO для мониторинга подпроцесса является модуль pexpect. В этом модуле вы можете открыть подпроцесс и дождаться возврата определенной строки, а затем отправить строку информации в этот точный момент.
input_program.py (этот файл должен быть исполняемым вашей системой)
#!/bin/env python3
x = input('Please type a password here:')
open('password.txt','w').write(x)
my_program.py
import pexpect
sub_p = pexpect.spawn('./input_program.py')
sub_p.expect('Please type a password here:')
sub_p.sendline('PASSWORD')
sub_p.close()
В этом конкретном примере исполняемый файл сохраняет пароль в файл (просто чтобы мы знали, что программа действительно запущена). Затем мы запустили эту программу в подпроцессе, который немедленно напечатал некоторый текст (в подпроцессе мы не видим текст в нашем текущем процессе, если только мы не внедрили подпроцесс в текущий процесс). Затем мы подождали (это блокируется, пока не увидит запрошенную строку), пока не увидели точные байты, которые сообщили нам, что подпроцесс готов получить наш пароль. Затем мы отправили подпроцессу пароль, ПАРОЛЬ.
Таким образом, у нас есть полный контроль над поиском байтов, которые выполняет подпроцесс. Мы можем отправлять пароль несколько раз или отвечать на вопросы, которые выдает нам программа, и т. Д. Мы даже можем внедрить то, что делает подпроцесс, в текущий процесс, что позволяет нам вручную вводить пароль, если мы хотим.