shell 如何从命令行检查sudo身份验证是否失败?

izkcnapc  于 2022-11-16  发布在  Shell
关注(0)|答案(1)|浏览(144)

我在bash脚本中为自己做了一个sudo的图形前端。使用gksudo这样的东西对我来说不是一个选择,因为我使用的操作系统没有提供这样的前端。
我是这样设计的-

#!/bin/bash

sudo -S $@ <<< $(/usr/lib/gtkdialog/box_passwd "$USER password" "Enter password" 2>/dev/null)

STATUS=$?
if [ $STATUS -eq 127 ]; then
    /usr/lib/gtkdialog/box_splash -bg red -fg white -timeout 5 -text "sudo not found!"
    exit 1
fi

while [ $STATUS -ne 0 ]; do
    sudo -S $@ <<< $(/usr/lib/gtkdialog/box_passwd "$USER password" "Authentication failed! Please retry" 2>/dev/null)
    export STATUS=$?
done

(Note /usr/lib/gtkdialog/box_passwd/usr/lib/gtkdialog/box_splash特定于此操作系统)。
如果我去掉while循环,它就可以工作。但是程序只会询问密码一次,即使它是错误的。但是目前,while循环很多次都没有结束,因为即使验证是正确的,如果没有找到它运行的程序或程序返回1sudo也可能返回1
那么,如何使这段代码只在sudo的身份验证失败时运行while循环,而在sudo返回1的其他时候不运行while循环呢?

**EDIT:**为了清楚起见,这里使用/usr/lib/gtkdialog/box_passwd作为图形程序,提示用户输入密码,/usr/lib/gtkdialog/box_passwd将密码传递给它得stdout(打印到它得stdout). /usr/lib/gtkdialog/box_splash是一个只创建新窗口并显示一些特定消息得程序

zxlwwiss

zxlwwiss1#

在某些操作系统中,sudo的手册页指定了哪些错误消息将来自sudo。如果您的操作系统这样做,您可以grep stderr来获取这些消息。
否则,sudo在这个部门没有太大的帮助,但是如果您使用sudo很简单(/etc/sudoers中没有花哨的配置,并且sudo没有配置允许的特定命令),那么您可以执行如下操作:

#!/bin/bash

sudo -S true <<< $(/usr/lib/gtkdialog/box_passwd "$USER password" "Enter password" 2>/dev/null)

export STATUS=$?
if [ $STATUS -eq 127 ]; then
    /usr/lib/gtkdialog/box_splash -bg red -fg white -timeout 5 -text "sudo not found!"
    exit 1
fi

while [ $STATUS -ne 0 ]; do
    sudo -S true <<< $(/usr/lib/gtkdialog/box_passwd "$USER password" "Authentication failed! Please retry" 2>/dev/null)
    STATUS=$?
done

sudo "$@"

也就是说,您不运行该命令,而只是运行一个伪命令(在本例中为true,该命令从未失败)。
在默认配置中,sudo会记住您几分钟。
因此,如果您在sudo true成功后立即运行sudo "$@"sudo将不会要求您输入密码来运行实际的命令。

相关问题