Я пытаюсь создать небольшую программу на python3 для моего друга, которая установит и настроит настройку nessarcary для его сервера Ubuntu.
Я хочу, чтобы он мог запустить программу, дать некоторую основную информацию и иметь возможность просто оставить программу для запуска.
Дело в том, что для этого мне нужен файл python для отправки пароля к CL при запросе команд sudo.
Я попытался сделать это для обновления сервера Ubuntu:
os.system('sudo aptitude update && sudo aptitude dist-upgrade')
os.system(password)
После того, как программа запросила пароль с этим:
password=input('Please Enter Your Password')
Но это не сработало. CL просто сидит и ждет, когда пользователь введет пароль вручную. В любом случае, можно ли обойти это?
Спасибо!
Существуют некоторые решения, которые вставляют пароль автоматически, но поскольку они видимы в открытом тексте на мгновение, это опасно, и Вы не должны использовать их. Некоторые методы обсуждены здесь.
Это - надлежащий способ запустить программу Python как корень:
import os
import sys
import subprocess
def main():
status, output = subprocess.getstatusoutput("apt-get update")
return status
if __name__ == '__main__':
if os.getuid():
print("This program needs to be run with root privileges,")
print("please use `sudo ./{0}` to execute it".format(*sys.argv))
sys.exit(100)
else:
sys.exit(main())
И метод открытого текста:
Это опасно, Ваш пароль будет видим пользователям в системе в ясном рекомендоваться, пароли никогда не должны храниться нигде, никогда.
password = "password1"
subprocess.getstatusoutput(
"echo {} | sudo -S apt-get update".format(password))
На связанной ноте лучший способ предложить пользователю пароль использует getpass:
import getpass
password = getpass.getpass(prompt='Password: ')
Это не распечатает пароль как на экране, в то время как пользователь вводит, как Вы ожидали бы в системе Linux.
import os
import sys
import subprocess
def main():
print("hello world, we're root!")
return 0
if __name__ == '__main__':
if os.getuid():
os.system("sudo python3 " + ' '.join(sys.argv))
sys.exit(100)
else:
sys.exit(main())
Это решение, вместо того, чтобы спросить пользователя, выполняет себя как корень при необходимости.