如何在不要求密码的情况下在脚本中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