当前位置: 首页>>技术问答>>正文


如何在脚本中使用sudo命令而不需要输入密码?

, ,

问题描述

我想每天自动开启我的系统。所以我在我的Python脚本中使用下面的代码,但sudo每次都要求我输入密码:

os.system('sudo sh -c "echo date \'+%s\' -d \'+ \
       24 hours\' > /sys/class/rtc/rtc0/wakealarm"')

我怎样才能运行这个脚本没有sudo每次都要求输入密码?

最佳解决方法

Please note: Any method which involves putting your login password in plain text, in a command or in a file, is insecure and should NOT be used!

正确的方式来设置sudo,使得只需要您需要的一个特定命令,即echo date... > rtc...,就可以在不需要密码的情况下运行。

第1步。使用该命令创建一个shell脚本

  • 打开gedit(或您最喜爱的编辑器),然后创建脚本pydatertc.sh

  • 只插入这一行,并将其保存到,例如您的主目录:echo date \ ‘+%s\’ -d \’+ 24 hours \’> /SYS /班/RTC /RTC0 /wakealarm

  • 退出编辑器,并从终端中,使脚本可执行

    将其所有权改为

    ,否则另一个有权访问系统的用户可能会编辑它并执行他们想要的任何命令

    不需要你的密码:

    sudo chown root:root /home/username/pydatertc.sh
    sudo chmod 700 /home/username/pydatertc.sh
    

第2步。设置sudo以允许pydatertc.sh在不需要密码的情况下执行

  • 在终端上键入sudo visudo以打开sudo权限(sudoers)文件

  • 在第25行左右,您会看到以下行:%sudo ALL=(ALL:ALL) ALL

  • 在该行下方插入以下行,其中username是您的用户名:用户名ALL =(ALL)NOPASSWD:/home/username/pydatertc.sh

  • 退出编辑器(Ctrl + X如果纳米)

第3步。修改你的python脚本来调用pydatertc.sh

  • 将该行更改为:os.system(‘sudo /home/username/pydatertc.sh’)

现在您的脚本应该运行而不需要密码,并且不会影响您帐户,数据或系统的安全!


仅用于wakealarm(不适用于一般用途!):

仅在此特定情况下,由于/sys/class/rtc/rtc0/wakealarm文件仅控制系统的wake-up警报,否则无害,所以另一种避免密码的替代方法是使用chown获取该文件的所有权(如果您是唯一设置警报的用户) ,或者用chmod +666制作world-writeable;在这种情况下,只需从Python调用中删除sudo,并保持sh -c "...."不变。

次佳解决方法

Warning!

Putting your login password in plain text, in a command or file, is extremely insecure and can compromise your private data and your system. It is highly recommended never to do this even if you think your system is “personal” or in a “safe location”!

如果剧本仅供个人使用,并且您已将其放置在安全的地方,并且您不怕您的帐户被盗等情况,那么下面是一个简单的解决方案:

echo LOGINPASSWD | sudo -S COMMAND HERE

其中LOGINPASSWD是你的登录密码(例如:iloveponies),COMMAND HERE是sudo之后的命令,比如sh -c“echo da .. etc

第三种解决方法

如果您不介意脚本在小时(或白天)的特定时间运行,请将其放在root主目录(/root)中,然后以root用户身份从系统crontab(/etc/crontab)运行脚本。那么你将不必妥协你的安全。

有关如何将脚本添加到crontab的信息,请参阅https://help.ubuntu.com/community/CronHowto

第四种方法

在上面的优秀答案中没有提到的sudo的另一个相关的很好的功能是’timestamp_timeout’变量。这是一个sudo变量,您可以增加以保存交互式密码输入。

例如,在/etc /sudoers(或其中包含的文件之一)中,您可以修改默认值:

# only require a password once every 60 minutes
Defaults timestamp_timeout=60

来自’man sudoers’的完整描述:

timestamp_timeout

        Number of minutes that can elapse before sudo will ask for         a passwd again.  The default is 5, set this to 0 to always         prompt for a password. 

当然,这在从cron运行命令的特定情况下无法提供帮助。但是要意识到这是一件好事。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/572.html,未经允许,请勿转载。