Я заранее прошу прощения, если мне не ясно в этом посте, но я постараюсь быть максимально ясным.
Итак, я делаю скрипт на 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)
Если кто-нибудь сможет мне помочь, я буду очень признателен!