如何在不要求输入密码的情况下在脚本中执行命令?

Vis*_*swa 113 python sudo

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

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

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

ish*_*ish 162

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

正确的设置方法sudoecho date... > rtc...允许您需要的一个特定命令,即,无需密码即可运行。

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

  • 打开gedit(或您最喜欢的编辑器),然后创建脚本,例如pydatertc.sh
  • 仅插入这一行,并将其保存到,例如您的主目录:
    echo date \'+%s\' -d \'+ 24 hours\' > /sys/class/rtc/rtc0/wakealarm
  • 退出编辑器,从终端,使脚本可执行并将其所有权更改为root,否则其他有权访问您系统的用户可能会编辑它并以root身份执行他们想要的任何命令,而无需您的密码:
    sudo chown root:root /home/username/pydatertc.sh
    sudo chmod 700 /home/username/pydatertc.sh
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 键入sudo visudo在终端打开须藤权限(sudoers)文件
  • 在第 25 行左右,您将看到这一行: %sudo ALL=(ALL:ALL) ALL
  • 在该行下方,插入以下行,username您的用户名在哪里:
    用户名 ALL=(ALL) NOPASSWD: /home/username/pydatertc.sh
  • 退出编辑器(Ctrl+X如果nano

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

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

现在,您的脚本应该无需密码即可运行,并且不会危及您的帐户、数据或系统的安全性!


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

这种特定情况下,由于该/sys/class/rtc/rtc0/wakealarm文件仅控制系统的唤醒警报并且在其他方​​面是无害的,因此避免密码的另一种选择是获取该文件的所有权chown(如果您是唯一设置警报的用户) , 或者使用chmod +666; 在这种情况下,只需sudo从 Python 调用中删除,保持sh -c "...."原样。

  • 我意识到这个答案很旧——但这里仍然存在一个问题:如果文件位于 **/home/username**,那么 _the 系统可能会被恶意用户(或非被盗用的 root 登录名)_。他们可以删除或重命名文件,在其位置放置另一个脚本,并通过 `sudo` 运行 _that_ 脚本——无需密码。因此,将脚本放在只有 root 可以更改的目录中_更安全_,例如:**/usr/sbin** 或 **/root**。否则,它LGTM。 (4认同)

hyt*_*omo 31

警告!

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

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

echo LOGINPASSWD | sudo -S COMMAND HERE
Run Code Online (Sandbox Code Playgroud)

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

  • @Viswa,请注意,以纯文本形式显示密码非常危险。强烈建议你不要那样做 (15认同)
  • 被否决,这是通往黑暗面的道路,不需要使用 sudo 方法。 (6认同)
  • 哈!我的回答有 6 票赞成和 4 票反对:) 但是为什么伙计们,我不是清楚“个人使用”、“安全场所”等吗?除非您提供此文件并且运行 ssh 服务器,否则不会存在安全问题!如果脚本供个人使用且位于安全位置,您在哪里看到安全问题? (4认同)
  • 好吧,告诉我,即使黑客以简单用户身份登录到您的帐户,他怎么会在 /usr/share/help/lv/ubuntu-help 下找到带有您密码的脚本? (4认同)
  • -1 如果这看起来是个好主意,那么最好只在 root 帐户上设置密码并使用 z7sg 的解决方案;这同样简单,并且不会造成这个非常危险的安全问题。 (3认同)
  • 谢谢,但现在我知道如何在不询问密码的情况下运行 sudo 命令。同时我理解了显示密码的问题。 (2认同)
  • 这是这里最好的答案。不是针对这个特定问题,而是针对非交互式运行 sudo 的一般问题。 (2认同)

z7s*_*7sg 21

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

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

  • 如果那是不能 24x7 全天候运行的台式机/笔记本电脑,您可能想要使用 `anacron` (4认同)

ari*_*ica 11

在上面的优秀答案中没有提到的 sudo 的另一个相关的好特性是 'timestamp_timeout' 变量。它是一个 sudo 变量,您可以增加它以节省交互式密码输入。

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

# only require a password once every 60 minutes
Defaults timestamp_timeout=60
Run Code Online (Sandbox Code Playgroud)

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

时间戳超时

        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.
Run Code Online (Sandbox Code Playgroud)

当然,这在从 cron 运行命令的特定情况下无济于事。但了解这一点是件好事。