Linux Shell脚本调用sudo;如何抑制密码提示

Linux Shell脚本调用sudo;如何抑制密码提示,linux,shell,sudo,Linux,Shell,Sudo,我正在编写一个简单的shell脚本,用于更改网络硬件的mac地址。 其中一条是: sudo ifconfig eth0 hw ether 00:99:99:00:00:00 我的问题是sudo脚本提示输入密码。有没有任何方法可以在不提示用户输入密码的情况下执行此操作?如果您不介意为该特定用户“免费使用”该特定命令,那么最肯定的是: 这里基本上可以看到我的另一个答案: 最简单的办法就是 myuser = NOPASSWD: /sbin/ifconfig 此外,您可以在同一终端(tty/vty)

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

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

我的问题是sudo脚本提示输入密码。有没有任何方法可以在不提示用户输入密码的情况下执行此操作?

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

这里基本上可以看到我的另一个答案:

最简单的办法就是

myuser = NOPASSWD: /sbin/ifconfig

此外,您可以在同一终端(tty/vty)上执行任意命令,
sudo
将身份验证缓存一段时间(或直到
sudo-k
),因此您可以启动脚本,它将“记住”您先前调用的
sudo
中的凭据。我有时在使用
sudo
编写管道时会这样做(前面是
sudo true

您需要一个
sudo
配置行,允许用户在没有密码提示的情况下执行命令

您可以禁用整个用户的密码提示(更危险,但如果您是桌面上唯一的用户,则可能还可以——不要在服务器上执行此操作):

或更严格,仅允许ifconfig命令:

yourusername  ALL= NOPASSWD: /sbin/ifconfig
参见:
mansudoers
mansudo


更安全的方法是:

sudo visudo -f sudoers
然后加上

myuser ALL=NOPASSWD:/sbin/ifconfig

到出现的编辑器窗口。完成后,使用
:x
退出

这里有一个Zenity对话框,它的功能类似于Tman的注释,
虽然密码没有存储在历史记录中。。。 这可能是一个很好的选择

#!/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

您的意思是sudoers文件中的username ALL=NOPASSWD:/sbin/ifconfig吗???我确实试过了,但不起作用。您(1)是否包含空格(2)是否使用了
sudoedit
(或
visudo
)?此外,我完全不建议将ALL用于无密码授权。警告除“受祝福的”工具(如
visudo
)之外的任何其他工具都会在您弄乱sudoers文件时使您的系统无法使用(除非您有根密码再次修复问题)@sehe我同意,使用ALL是相当危险的。如果您不想
sudo
请求密码,而是打印错误,请使用
-n
。我尝试了它,但似乎遇到了新错误sudo:parse error in/etc/sudoers in/18行附近sudo:找不到有效的sudoers源,在尝试编辑sudoers文件时退出。我现在该怎么做???这意味着在/etc/sudoers文件的第18行中有语法错误--您需要修复该错误或对其进行注释。您可以将/etc/sudoers文件中的这一行添加到您的问题中吗?另外:检查我在Ubuntu论坛中提到的链接。我知道我有一个错误,我知道我必须修复它。我已经提到了,问题是没有sudo访问权限,你不能编辑sudoers文件,当我键入sudo时,我会得到这个错误。虽然我确实知道/etc/sudoers:myname ALL=NOPASSWD:ifconfig中第18行中的内容,但确保用户名前面没有空格,这样做会起作用,这是非常不安全的。首先,他们可以从包含命令的脚本中读取密码。其次,密码将存储在shell历史记录之类的地方。一般来说,永远不要在命令行上输入密码。让程序提示它。对于您的特定用例,最好的选择是编辑抖动文件,以便在执行ifconfig命令时不需要密码。
myuser ALL=NOPASSWD:/sbin/ifconfig
#!/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