我正在尝试为我的朋友创建一个小型 python3 程序,该程序将安装并配置他 Ubuntu 服务器所需的设置。
我希望他能够启动该程序,提供一些基本信息,然后就可以运行该程序。
问题是,要做到这一点,我需要 python 文件在请求 sudo 命令时将密码发送给 CL。
我尝试这样做来更新 Ubuntu 服务器:
os.system('sudo aptitude update && sudo aptitude dist-upgrade')
os.system(password)
让程序使用以下命令请求密码后:
password=input('Please Enter Your Password')
但它不起作用。CL 只是在那里等待用户手动输入密码。有什么办法可以解决这个问题吗?
谢谢!
答案1
有一些解决方案可以自动输入密码,但由于它们会暂时以明文形式显示,因此很危险,您不应该使用它们。讨论了一些方法这里。
这是以 root 身份运行 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())
此解决方案无需询问用户,而是在必要时以 root 身份运行。