为了账号安全,请及时绑定邮箱和手机立即绑定

在Python脚本中使用sudo

/ 猿问

在Python脚本中使用sudo

慕莱坞森 2019-09-13 15:10:26

在Python脚本中使用sudo

我正在尝试编写一个小脚本来在每次执行脚本时挂载VirtualBox共享文件夹。我想用Python做,因为我正在尝试用它来学习脚本。


问题是我需要权限才能启动mount命令。我可以将脚本作为sudo运行,但我更喜欢它自己创建sudo。


我已经知道将密码写入.py文件是不安全的,但我们谈的是一个根本不重要的虚拟机:我只想点击.py脚本并让它运行起来。


这是我的尝试:


#!/usr/bin/env python

import subprocess


sudoPassword = 'mypass'

command = 'mount -t vboxsf myfolder /home/myuser/myfolder'


subprocess.Popen('sudo -S' , shell=True,stdout=subprocess.PIPE)

subprocess.Popen(sudoPassword , shell=True,stdout=subprocess.PIPE)

subprocess.Popen(command , shell=True,stdout=subprocess.PIPE)

我的python版本是2.6


查看完整描述

3 回答

?
白板的微信
sudoPassword = 'mypass'command = 'mount -t vboxsf myfolder /home/myuser/myfolder'p = os.system('echo %s|sudo -S %s' % (sudoPassword, command))

试试这个,让我知道它是否有效。:-)

还有这个:

os.popen("sudo -S %s"%(command), 'w').write('mypass')


查看完整回答
反对 回复 2019-09-16
?
慕仰0522570

许多答案都集中在如何使您的解决方案工作,而很少有人建议您的解决方案是一个非常糟糕的方法。如果你真的想“练习学习”,为什么不练习使用好的解决方案呢?硬编码密码正在学习错误的方法!

如果你真的想要的是一个无密码的mount该卷,也许sudo并不需要在所有!我可以建议其他方法吗?

  • 使用/etc/fstab如MENSI建议。使用选项usernoauto让常规用户挂载该卷。

  • 使用Polkit无密码的行为:配置.policy文件为您的脚本<allow_any>yes</allow_any>,并在下降/usr/share/polkit-1/actions

  • 编辑/etc/sudoers以允许您的用户sudo无需输入密码即可使用。

以上所有内容都允许无密码root权限,不需要您对密码进行硬编码。选择任何方法,我可以更详细地解释它。

至于为什么硬编码密码是一个非常糟糕的主意,这里有一些很好的链接供进一步阅读:

  • http://www.security-faqs.com/why-you-shouldnt-hard-code-your-passwords-when-programming.html

  • https://security.web.cern.ch/security/recommendations/en/password_alternatives.shtml

  • https://security.stackexchange.com/questions/92465/whats-more-secure-hard-coding-credentials-or-storing-them-in-a-database

  • https://blogs.manageengine.com/it-security/passwordmanagerpro/2010/02/17/use-of-hard-coded-credentials-a-dangerous-programming-error-cwe.html

  • https://www.csoonline.com/article/3038302/application-development/hard-coded-passwords-remain-a-key-security-flaw.html




查看完整回答
反对 回复 2019-09-16
?
慕尼黑8549860

将密码传递给sudostdin:

#!/usr/bin/env pythonfrom subprocess import Popen, PIPE

sudo_password = 'mypass'command = 'mount -t vboxsf myfolder /home/myuser/myfolder'.split()p = Popen(['sudo', '-S'] + command, stdin=PIPE, stderr=PIPE,
          universal_newlines=True)sudo_prompt = p.communicate(sudo_password + '\n')[1]

注意:您可以配置无密码sudo或SUDO_ASKPASS命令,而不是在源代码中硬编码密码。



查看完整回答
反对 回复 2019-09-16

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信