Не был уверен, что поставить в качестве заголовка, но надеюсь, что приведенное ниже описание достаточно ясно.
Я пишу скрипт на python, где мне в какой-то момент придется настроить устройство цикла и, таким образом, спроситьдля пароля sudo.
Настройка петлевых устройств работает нормально, но у меня возникли некоторые проблемы с stdin / stderr (?), и в нем хранится больше данных, чем мне хотелось бы.
Код до сих пор;
import subprocess
from getpass import getpass, getuser
#these two will be input arguments
loop_device = some loop device
fname = some image file
sudo_password = getpass('[sudo] password for {}: '.format(getuser()))
p = subprocess.Popen(['sudo', '-kSp', '', 'losetup', loop_device, fname], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
out,err = p.communicate((sudo_password+'\n').encode())
print('Out: {}'.format(out)) # for testing
print('Err: {}'.format(err)) # for testing
При указании на действительный файл / устройство обратной связи вывод на терминал:
[sudo] password for user:
Out: b''
Err: b'[sudo] password for user: '
Если я, например, указываю на файл, который несуществует, вывод:
Out: b''
Err: b'[sudo] password for user: losetup: /path/to/image/file/: failed to set up loop device: No such file or directory\n'
По сути, я бы хотел избежать того, чтобы err
содержал часть b'[sudo] password for user:
, чтобы было легче выполнять проверки ошибок и т. д., например,
if err:
do something
else:
keep running
В качестве альтернативы можно было бы просто присвоить c = b'[sudo] password for user: '
и проверить err[len(c):]
или что-то в этом роде, но я предполагаю, что есть лучший способ, который я пропускаю?