我想每天自动打开我的系统。因此,我在 Python 脚本中使用了以下代码,但sudo
每次都会要求我输入密码:
os.system('sudo sh -c "echo date \'+%s\' -d \'+ \
24 hours\' > /sys/class/rtc/rtc0/wakealarm"')
我怎样才能运行此脚本而不sudo
每次都询问密码?
答案1
请注意:任何将登录密码以纯文本、命令或文件形式保存的方法都是不安全的,不应使用!
正确的方法sudo
这样做是为了设置仅有的您需要的一个特定命令,即echo date... > rtc...
,无需密码即可运行。
步骤 1. 仅使用该命令创建 shell 脚本
- 打开
gedit
(或您最喜欢的编辑器),然后创建脚本,例如pydatertc.sh
- 仅插入此行,并将其保存到例如您的主目录:
echo 日期 \'+%s\' -d \'+ 24 小时\' > /sys/class/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/pydaertc.sh
- 退出编辑器(Ctrl+X如果纳米)
步骤 3.修改 Python 脚本以调用pydatertc.sh
- 将该行更改为:
os.system('sudo /home/用户名/pydaertc.sh')
现在您的脚本应该无需密码即可运行和而不会损害您的帐户、数据或系统的安全!
仅适用于wakealarm
(不适用于一般用途!):
在仅限此特定案例,因为该/sys/class/rtc/rtc0/wakealarm
文件只控制系统的唤醒警报并且在其他方面是无害的,所以避免密码的另一种方法是使用 获取该文件的所有权chown
(如果您是设置警报的唯一用户),或者使用 使其可在全球范围内写入chmod +666
;在这种情况下,只需sudo
从您的 Python 调用中删除 ,保持sh -c "...."
完整即可。
答案2
警告!
将你的登录密码以纯文本形式放在命令或文件中,极其不安全,可能会危及您的私人数据和系统。强烈推荐即使您认为您的系统是“个人的”或处于“安全的位置”,也不要这样做!
如果该脚本仅供个人使用,并且您已将其放在安全的地方,并且您不担心您的帐户被盗等,那么这里有一个简单的解决方案:
echo LOGINPASSWD | sudo -S COMMAND HERE
其中 LOGINPASSWD 是您的登录密码(例如:iloveponies),COMMAND HERE 是您在 sudo 之后的命令,例如 sh -c "echo da.. 等
答案3
如果您不介意脚本在每小时(或一天中)的特定时间运行,请将其放在 root 的主目录 ( /root
) 中,并以 root 身份从系统 crontab ( /etc/crontab
) 运行该脚本。这样您就不必牺牲您的安全性。
看https://help.ubuntu.com/community/CronHowto有关如何将脚本添加到 crontab。
答案4
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