Shell脚本调用sudo时如何禁止密码提示

10
我正在编写一个简单的shell脚本,用于更改网络硬件的MAC地址。 其中一行是:

sudo ifconfig eth0 hw ether 00:99:99:00:00:00

我的问题与sudo有关,脚本提示输入密码。有没有什么方法可以在不提示用户输入密码的情况下完成操作?

5个回答

8

如果您不介意让特定用户免费使用该特定命令,那么最肯定是:

请参考我在这里给出的其他答案:Shell脚本-Sudo权限随时间丢失

可能可行的最简单的方法是:

myuser = NOPASSWD: /sbin/ifconfig

此外,您可以在同一终端(tty/vty)上对任意命令使用sudo,并且sudo会缓存身份验证一段时间(或者直到sudo -k),因此您可以启动脚本,它将“记住”您早期使用sudo时的凭据。我有时在使用sudo组合管道时这样做(只需在其前面加上sudo true)。

你的意思是在sudoers文件中添加类似于 username ALL=NOPASSWD: /sbin/ifconfig 的内容吗?我尝试了,但它没有起作用。 - ro ko
1
是的。你是否(1)包括了空格(2)使用了sudoedit(或visudo)?此外,我完全不建议使用ALL来进行无密码授权。警告 除了“神圣”的工具(如visudo)之外的任何其他工具,在您搞砸sudoers文件时都会使您的系统无法使用(除非您有root密码来修复问题)。 - sehe
@sehe 我同意,使用 ALL 是相当危险的。 - Tilo
如果您不想让 sudo 要求输入密码,而是打印错误信息,请使用 -n - gitaarik

3
echo "password" | sudo -S ifconfig eth0 hw ether 00:99:99:00:00:00

虽然这种方法可以运行,但是它非常不安全。首先,他们可以从包含命令的脚本中读取密码。其次,密码将被存储在像 shell 历史记录之类的地方。总的来说,永远不要在命令行上输入密码。让程序提示您输入密码。针对您特定的用例,最好的选择是编辑 shudders 文件,在执行 ifconfig 命令时不需要密码。 - W3t Tr3y

2
你需要添加一个sudo配置行,允许用户执行该命令而无需输入密码。你可以为整个用户禁用密码提示(这样做更加危险,但如果你是桌面上唯一的用户,可能还可以接受——在服务器上绝不要这样做)。
yourusername  ALL=(ALL) NOPASSWD: ALL

或者更加严格,仅允许使用ifconfig命令:

yourusername  ALL= NOPASSWD: /sbin/ifconfig

请看:man sudoersman sudo http://ubuntuforums.org/showthread.php?t=1132821 http://www.linuxhelp.net/guides/sudo/

我尝试了一下,但好像遇到了新的错误:sudo: parse error in /etc/sudoers near line 18 sudo: no valid sudoers sources found, quitting while trying to edit the sudoers file。现在该怎么办呢? - ro ko
你的/etc/sudoers文件第18行存在语法错误,你需要修复它或将其注释掉。 - Tilo
你能否将你的 /etc/sudoers 文件中的那一行添加到你的问题中?另外,请检查我在 Ubuntu 论坛中提到的链接。 - Tilo
啊!你刚刚把自己锁在系统外面了...你需要通过 su - 成为 root 用户,然后输入 root 密码...接着编辑 sudoers 文件。 - Tilo
你需要在你的用户名前面添加一个制表符。例如,yourusername<hit tab>ALL....(继续)。如果不这样做,将会导致语法错误。 - Shrikrishna Holla
显示剩余3条评论

1
一种更安全的方法是:

sudo visudo -f sudoers

然后添加
myuser ALL=NOPASSWD:/sbin/ifconfig

打开编辑器窗口后,完成操作后使用:x退出。


0

这里有一个类似于Tman评论的Zenity对话框,
尽管密码不会存储在历史记录中... 这可能是一个很好的替代方案

#!/bin/bash
ENTRY=`zenity --password`
case $? in
0)
pw=$(echo $ENTRY | cut -d'|' -f1)
;;
1)
echo "Stop login.";;
-1)
echo "An unexpected error has occurred.";;
esac
TMP=$(echo "${pw}" | sudo -Sv)
TMP=0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接