相关疑难解决方法(0)

忘记在 bash/POSIX shell 中引用变量的安全隐患

如果您已经关注 unix.stackexchange.com 一段时间了,那么您现在应该知道,echo $var在 Bourne/POSIX shell(zsh 是例外)中的列表上下文(如)中不加引号的变量具有非常特殊的含义,并且除非你有很好的理由,否则不应该这样做。

在这里的许多问答中详细讨论了它(例如:为什么我的 shell 脚本会因空格或其他特殊字符而窒息?何时需要双引号?shell 变量的扩展以及 glob 和 split 对其的影响引用vs 不带引号的字符串扩展)

自从 70 年代末 Bourne shell 首次发布以来就是这种情况,并且没有被 Korn shell 改变(David Korn 最大的遗憾之一(问题 #7))或者bash大部分复制了 Korn shell,这就是POSIX/Unix 是如何指定的。

现在,我们仍然在这里看到许多答案,甚至偶尔会公开发布未引用变量的 shell 代码。你会认为人们现在已经学会了。

根据我的经验,主要有 3 类人会省略引用他们的变量:

  • 初学者。这些可以被原谅,因为它是一种完全不直观的语法。我们在这个网站上的职责是教育他们。

  • 健忘的人。

  • 即使经过反复锤击也不相信的人,他们认为Bourne shell 的作者肯定没有打算让我们引用所有变量

如果我们揭露与此类行为相关的风险,也许我们可以说服他们。

如果您忘记引用变量,那么最糟糕的事情是什么。真的有那么糟糕吗?

我们在这里谈论什么样的漏洞?

在什么情况下会出现问题?

shell security bash shell-script quoting

241
推荐指数
3
解决办法
3万
查看次数

bash 如何解释条件中没有周围空格的相等运算符?

以下脚本的行为与我预期的不同。在条件中的 '=' 周围添加空格使其按照我想要的方式执行,但它让我思考,它在条件中实际上在做什么?

#!/bin/bash
S1='foo'
S2='bar'
if [ $S1=$S2 ];
then
    echo "S1('$S1') is equal to S2('$S2')
fi
echo $S1
echo $S2
Run Code Online (Sandbox Code Playgroud)

输出是:

S1('foo') is equal to S2('bar')
foo
bar
Run Code Online (Sandbox Code Playgroud)

S1 和 S2 的内容与它们分配的内容没有变化,因此 = 不执行分配。

shell scripting bash

5
推荐指数
2
解决办法
1780
查看次数

Grep 命令未返回预期的测试结果

我试图在将条件附加到 profile.d 文件之前进行比较

Agrep -F 'TMOUT' /etc/profile.d/sh.local准确地显示了我的期望,但是测试总是显示正确。在所有这些示例中,我已经将我想要的信息附加到 sh.local 但如果它存在我不想再做一次。

[ ! `grep -Fq 'TMOUT' /etc/profile.d/sh.local` ] && echo $?
0
[ ! `grep -Fq 'NOT_PRESENT' /etc/profile.d/sh.local` ] && echo $?
0
Run Code Online (Sandbox Code Playgroud)

尽管这是针对 .ebextension 命令的测试在我什至尝试部署之前都失败了,但我想最终结果应该是这样的,但我显然错了。我试过使用 $(grep) 和 `grep`。还有 ==1 对 !

[ ! `grep -Fq 'TMOUT' /etc/profile.d/sh.local` ] && echo $?
0
[ ! `grep -Fq 'NOT_PRESENT' /etc/profile.d/sh.local` ] && echo $?
0
Run Code Online (Sandbox Code Playgroud)

作为记录,这是 Amazon Linux 2 和以下命令吐出以下内容

  01_hard_5.4.5_shell_timeout:
    test: "[ $(grep -Fxq 'TMOUT' /etc/profile.d/sh.local) ==1 ]"
    command: | …
Run Code Online (Sandbox Code Playgroud)

shell bash test

4
推荐指数
1
解决办法
356
查看次数

标签 统计

bash ×3

shell ×3

quoting ×1

scripting ×1

security ×1

shell-script ×1

test ×1