bash中的“ true”的目的是什么?然后”


20

我已经一起破解了这个bash脚本,该脚本可以测试用户是否具有超级用户特权,如果没有,它会要求他们。最终,我试图反转第二个“ if”语句,以便删除以下两行(回显“ password ok”和下一行的else)

# Root user only
if [[ "$EUID" != 0 ]]; then
    sudo -k # make sure to ask for password on next sudo
    if sudo true; then
        echo "Password ok"
    else
        echo "Aborting script"
        exit 1
    fi
fi

echo "do my ops"

第四行“真”的目的仅仅是一个空语句吗?

我需要在第四行反转测试,该怎么做?这是我尝试过的:

if sudo false; then  
if sudo true == false; then
if [!(sudo true)]; then

2
如果您要否决这个问题,请您能解释一下我可以做些什么来改善这个问题?这不是正确的溢出站点吗?
马特·帕金斯

4
不确定下降投票来自何处;您是否要否定该声明或使该声明无效?您说要同时消除真实/回声和“其他”,那么您的最终目标是什么?
杰夫·谢勒


1
@ ctrl-alt-delor在该链接之后,看来我需要做的就是在sudo前面加上一个感叹号,然后我可以同时删除回显和其他符号,现在我已经对其进行了测试,可以了,谢谢。
马特·帕金斯

2
顺便说一句,您可能应该将错误消息重定向到错误流:echo "Aborting script" >&2
Toby Speight

Answers:


38

true在bash中不是关键字,它是一个程序,该程序会立即以成功的退出代码退出。同样,false是一个以不成功的退出代码退出的程序。

您可以通过在终端上运行两个程序,然后读取$?包含最后一个程序的退出代码的变量来进行尝试。

true
echo $? # 0
false
echo $? #1

if sudo true不等于if sudo == trueif sudo true正在true使用来运行程序sudo,并检查退出代码。

因此:

if sudo false; then正在false作为sudo 运行程序。返回值始终为假。

if sudo true == false将使用true参数运行程序==false使用sudo。这显然不是您想要的。

if [!(sudo true)] 是无效的语法。

您可能正在寻找的是

if ! sudo true;

12
作为对第一句话的稍加修辞的修正:在bash中true并且false是“ builtins”,这些命令直接由shell解释;通常在类似Unix的系统中,它们还作为独立程序存在于文件系统上。这里的区别并不重要,但是据我所知,sudo true它将运行独立程序,而不是内置的bash。
IMSoP

31
PS:我最喜欢的true和的摘要false是其手册页上的标题:true - do nothing, successfullyfalse - do nothing, unsuccessfully
IMSoP

3
@IMSoP太深了。
Brainplot

2
如果true不存在,问题中的代码将说明为什么可能需要发明它!这是一个最小的程序,只有在其所在的系统真正崩溃的情况下,它才会失败。因此,可以使用它来确定自己的访问凭据是否正确。
nigel222

2
在AT&T SYSV Unix中,“ true”是一个shell脚本/ bin / true,它由注释中的大版权声明等组成。
Lee Daniel Crocker

21

我觉得被接受的答案实际上没有回答您的问题吗?

这样做的目的是检查您是否确实可以sudo

true如接受的答案中所述,如何通过程序执行此检查。


1
本质上是这样。另一种选择是检查用户是否在sudoers组中,但运行起来sudo true也很容易,尽管有点笨拙。
Sergiy Kolodyazhnyy

3
请注意,这也需要sudo安装,因此检查不会完全等效...您可能在sudoers组中,但仍然无法进行sudo。(如果您正在编写脚本以从最小的rootfs tarball设置新图像(可能没有sudo),则可能会出现这种情况。)
Mehrdad

1
如果您不能进行sudo操作,OP希望退出,并摆脱两行,而不是在noop之后再添加其他行。
mckenzm

2
而且,相反,sudo如果您(个人或其他小组的成员)在中列出,您也可以不加入sudoers小组/etc/sudoers。但是,即使sudo true不是绝对可靠的,因为sudo只能授予特定命令的访问权限,所以您可能可以sudo true(但不能)sudo something_else,反之亦然。除了尝试运行您实际上想使用的命令外,没有其他方法可以测试sudo
Dave Sherohman

2
另外,您可以加入该sudoers群组,但不能加入,sudo因为该sudoers群组未在sudoers文件中列出。sudo名称中带有四个字母的组不能有效地表明该组中的用户是否可以使用进行任何特定的操作或执行任何操作sudo
jrw32982支持Monica

5

正如我在此脚本中看到的。它只是在检查是否启用了sudo,就是这样。

true只会返回true。

因此,在这种情况下,如果他们需要使用sudo运行任何命令,它将在启动时首先检查,仅询问一次密码。

条件的工作方式如下:如果sudo正确执行了true命令,它将为if条件返回true,然后启用sudo并用户正确键入了密码,否则您输入的密码错误或sudo未启用,脚本一定不能继续。

其他命令不需要询问sudo密码,因为您的身份验证是在第一次成功完成的(但这取决于sudo配置,因此此脚本在环境配置中有很大关系)

'echo password ok'也证明了这一点。Shell脚本将不再询问密码。


1
唯一通过sudo运行的命令是sudo truesudo -k。后者明确不需要密码。脚本中的其他命令均不通过sudo运行,因此,无论验证是否首次成功,它们当然都不需要密码。
ilkkachu

我写道:“因此,在这种情况下,如果他们需要使用sudo运行任何命令,它将首先在启动时进行检查,仅询问一次密码。”
Luciano Andress Martini
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.