如何在不要求密码的情况下在脚本中sudo命令?

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

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

如何在没有sudo每次询问密码的情况下运行此脚本?

请注意:任何涉及以明文,命令或文件forms提供登录密码的方法都是不安全的,不应使用!

正确的方法是设置sudo这样需要你需要的一个特定命令,即echo date... > rtc... ,就可以运行而不需要密码。

步骤1.仅使用该命令创建shell脚本

  • 打开gedit (或您最喜欢的编辑器),并创建脚本,例如pydatertc.sh
  • 仅插入此行,并将其保存到例如您的主目录:
      echo date \'+%s \' -  d \'+ 24小时\'> / sys / class / rtc / rtc0 / wakealarm 
  • 退出编辑器,并从终端,使脚本可执行并将其所有权更改为root ,否则另一个有权访问您系统的用户可能编辑它并以root身份执行他们想要的任何命令而无需您的密码:
     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是您的用户名:
      username ALL =(ALL)NOPASSWD:/home/username/pydatertc.sh 
  • 退出编辑器(如果是nano, 则按Ctrl + X

步骤3.修改python脚本以调用pydatertc.sh

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

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


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

这种特定情况下 ,由于/sys/class/rtc/rtc0/wakealarm文件仅控制系统的唤醒警报,否则无害,另一种避免密码的方法是使用chown获取该文件的所有权(如果您是设置闹钟的唯一用户),或使用chmod +666将其chmod +666世界可写; 在这种情况下,只需从Python调用中删除sudo ,保持sh -c "...."不变。

警告!

将您的登录密码以纯文本forms放入命令或文件中是非常不安全的,并且可能会危害您的私人数据和系统。 强烈建议您不要这样做,即使您认为您的系统是“个人”或“安全的位置”!

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

 echo LOGINPASSWD | sudo -S COMMAND HERE 

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

如果您不介意脚本在一小时(或白天)的特定时间运行,请将其放在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运行命令的特定情况下无济于事。 但要注意这是一件好事。

 export MY_SUDO_PASS="user_password_here" 

要测试它是否正在工作:

 echo $MY_SUDO_PASS > user_password_here 

要运行“sudo apt-get update”,并接受我们之前创建的环境变量的密码:

 echo $MY_SUDO_PASS | sudo -S apt-get update 

从python运行(示例将目录所有权递归更改为username_here):

 python >> import subprocess >> subprocess.call('echo $MY_SUDO_PASS | sudo -S chown -R username_here /home/username_here/folder_to_change_ownership_recursivley', shell=True) 

echo $ MY_SUDO_PASS获取密码-S开关捕获它并将密码传递给sudo