如何在不要求输入密码的情况下在脚本中伪指令?


107

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

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

如何在不sudo每次都要求输入密码的情况下运行该脚本?


4
您应该查看主板手册或BIOS,以查看它是否支持此行为。我知道这回避了问题!=]但这可能是一个足够的解决方案。
Alex Hirzel 2012年

Answers:


149

请注意:任何涉及将登录密码以纯文本,命令或文件形式放置的方法都是不安全的,不应使用!

正确的安装方法sudoecho date... > rtc...允许您需要的一个特定命令(即)运行而无需输入密码。

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

  • 打开gedit(或您喜欢的编辑器),然后创建脚本,例如pydatertc.sh
  • 仅插入此行,并将其保存到例如您的主目录中:
    回声日期\'+%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/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;在这种情况下,只需sudo从Python调用中删除,即可sh -c "...."保持原样。


1
太棒了,这是正确的方法。
roadmr 2012年

1
如此详尽,有用的答案以及确切的方法。
ArtOfCode 2012年

@RobertRosati,非常感谢您建议的编辑-首先,我不应该忘记这一点!
ish 2012年

1
@ m-ric您是否已阅读这些行上方的命令?“否则,另一位有权访问您系统的用户可以在不需要密码的情况下以root用户身份对其进行编辑和执行任何命令”
Tobias Kienzler 2013年

2
我知道这个答案很旧-但这里仍然存在问题:如果文件位于/ home / username中,那么如果该目录可由恶意用户(或非root用户登录)写入,则系统可能受到威胁。妥协)。他们可以删除或重命名该文件,在其位置放置另一个脚本,然后通过-无需密码即可运行脚本sudo。因此,它是更安全把脚本到一个目录只有root可以改变,例如:/ usr / sbin目录/根。否则,它是LGTM。
NVRAM

30

警告!

将登录密码以纯文本形式放在命令或文件中非常不安全,并且可能会损害您的私人数据和系统。这是强烈建议从来没有做到这一点,即使你认为你的系统是“个人”或一个“安全的地方”!

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

echo LOGINPASSWD | sudo -S COMMAND HERE

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


13
@Viswa,请注意,以纯文本形式显示密码非常危险。强烈建议您不要这样做
Anwar 2012年

3
-1如果这似乎是个好主意,那么最好在root帐户上设置一个密码并使用z7sg的解决方案;这同样简单,并且不会造成这个非常危险的安全问题。
布莱斯2012年

4
哈哈!我在回答中有6票赞成票和4票反对票:)但是,伙计们,我是否未清除“个人使用”,“安全的地方”等?除非您将此文件分发出去并且您正在运行ssh服务器,否则不会出现安全问题!如果脚本供个人使用并且放在安全的地方,您在哪里看到安全问题?
hytromo

5
毫无疑问,这是通往黑暗面的道路,而sudo方法不需要。
弗洛伊德(Floyd)

4
好的,告诉我,即使黑客已经以简单用户身份登录到您的帐户,他将如何在/ usr / share / help / lv / ubuntu-help下使用您的密码找到该脚本?
hytromo

21

如果您不介意在某个小时(或白天)在特定时间运行该脚本,请将其放在根目录的主目录(/root)中,然后/etc/crontab以root身份从系统crontab()运行该脚本。这样,您就不必破坏您的安全性。

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


4
如果可能是anacron不是全天候24x7运行的台式机/笔记本电脑,则可能要使用
balki 2012年

这是一个有用的答案,例如,如果您正在编写脚本以检查更新,使用该信息执行某些操作以及向管理员发送有关所需更新的电子邮件。就个人而言,我的许多脚本都用于服务器自动化,因此我倾向于使用sudo crontab -e。+1
拉布2014年

11

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运行命令的特定情况下无济于事。但这是一件好事,要意识到。


0
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 get的密码-S开关将其捕获并将密码传递给sudo


我不确定这会给现有的答案增加什么,大多数最新的BIOS支持会在警报后唤醒...
Elder Geek
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.