Как ввести пароль Bash через Python? - PullRequest
0 голосов
/ 03 сентября 2018

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

Итак, я делаю скрипт на python для установки моих любимых пакетов в arch-linux, так что, например, если мне когда-нибудь придется делать новую установку, я могу просто загрузить свой скрипт, и все мои пакеты (или только один пакет) будут установлены. Я хочу, чтобы мой скрипт мог устанавливать пакеты из разных менеджеров пакетов.

Пока что он работает с pacman по умолчанию, когда я использую os.system () и запускаю его с помощью sudo

os.system('echo %s; echo y) |sudo -S sudo %s -S %s) % (prefix, package_manager, package_name)

что может перевести на

os.system('echo password123; echo y) |sudo -S sudo pacman -S python-setuptools)

Но проблема возникает, когда я использую его с yaourt (я знаю, что это небезопасно и больше не поддерживается, но я просто использую его для тестирования)

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

Итак, я попробовал это с

y | yaourt -S package_name

Обходит все подтверждающие сообщения, но застревает в консоли при пароле. Я попытался найти команду, которая может ввести, скажем, x на y, а затем, когда дело доходит до пароля, я могу ввести его всего одной строкой кода.

Я также попробовал модуль подпроцесса с методами .Popen () и .communicate (), где я говорю что-то вроде

p = subprocess.Popen('yaourt -S sublime-text-dev', stdin = subprocess.PIPE, stdout=subprocess.PIPE, shell=True)

p.communicate(b'password123')

но он все еще застревает на этапе ввода пароля.

Я не хочу использовать модуль Pexpect, потому что это не пакет по умолчанию с python, и вам нужно установить pip, чтобы он заработал, и я хочу иметь возможность запускать мой скрипт без необходимости устанавливать что-либо вручную .

Вот моя функция на всякий случай

def install_package_suggestion(package_dictionary, sudo_password): 
package_name = input('Enter name of package to install: ').lower()

if package_name not in package_dictionary:
    print(package_name + ' is not in the suggestion list')
else :
    package_manager = package_dictionary[package_name][0]
    prefix = '(echo %s;echo y;)|sudo -S sudo' % (sudo_password) if package_manager == 'pacman' else 'echo %s|' % (sudo_password)
    command = '%s %s -S %s' % (prefix, package_manager, package_name)

    res = os.system(command)

Если кто-нибудь сможет мне помочь, я буду очень признателен!

...