相关疑难解决方法(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万
查看次数

使用 find 只找到前几个匹配的文件?

假设*.txt一个目录中可能有数百个文件。我只想找到前三个*.txt文件,然后退出搜索过程。

如何使用该find实用程序实现这一目标?我快速浏览了它的手册页,似乎不是这样的选择。

find

21
推荐指数
2
解决办法
2万
查看次数

如何在算术表达式中安全地使用关联数组?

一些类似 Bourne 的 shell 支持关联数组:(ksh93自 1993 年以来)、zsh(自 1998 年以来)、bash(自 2009 年以来),尽管 3 之间的行为存在一些差异。

一个常见的用途是计算某些字符串的出现次数。

但是,我发现以下内容:

typeset -A count
 (( count[$var]++ ))

对某些值不起作用$var,我听说如果 的内容处于或可能处于攻击者的控制之下,它甚至会构成任意命令执行漏洞$var

这是为什么?有问题的价值观是什么?我该如何解决它?

security bash ksh zsh associative-array

17
推荐指数
1
解决办法
610
查看次数

不给 printf 使用格式会带来安全后果吗?

格式良好的printf通常有一个可以使用的格式:

$ var="Hello"
$ printf '%s\n' "$var"
Hello
Run Code Online (Sandbox Code Playgroud)

但是,不提供格式可能会产生什么安全隐患?

$ printf "$var"
Hello
Run Code Online (Sandbox Code Playgroud)

由于变量扩展被引用,应该不会有任何问题,不是吗?

shell security printf

15
推荐指数
2
解决办法
2930
查看次数

shell脚本“if”语句中引用变量的区别?

这两个 Bash if 语句有什么区别?例如

if [ "$FOO" = "true" ]; then
Run Code Online (Sandbox Code Playgroud)

对比

if [ $FOO = "true" ]; then
Run Code Online (Sandbox Code Playgroud)

有什么不同?似乎这两个语句的工作方式相同。

shell bash shell-script quoting

10
推荐指数
1
解决办法
1万
查看次数

如何反转shell参数?

我知道可以"$@"使用数组进行反转:

arr=( "$@" )
Run Code Online (Sandbox Code Playgroud)

使用此答案,反转数组。

但这需要一个具有数组的外壳。

也可以使用tac

set -- $( printf '%s\n' "$@" | tac )
Run Code Online (Sandbox Code Playgroud)

但是,断裂,如果参数有空格,制表符或换行符(假设的缺省值$IFS),或者包含通配符(除非通配符被禁用预先)并移除空元素,并需要GNUtac命令(使用tail -r是GNU系统的稍微更便携式外但某些实现在大输入时失败)。

有没有一种方法可以在不使用数组的情况下可移植地反转 shell 位置参数,即使参数包含空格、换行符或通配符或可能为空也能正常工作?

shell-script posix

10
推荐指数
3
解决办法
2036
查看次数

打印 1-50 之间的数字

x=1
while [ $x -le 50 ]
do
    echo $x
    $x=(($x + 1))
done
Run Code Online (Sandbox Code Playgroud)

我已经写了上面的代码。在许多编程语言中似乎是一项简单的任务,却为我提供了这个错误。

solution.sh: line 5: syntax error near unexpected token `('
solution.sh: line 5: `    $x=(($x + 1))'
Run Code Online (Sandbox Code Playgroud)

如何调试 bash 中的错误。有没有IDE?

bash shell-script

8
推荐指数
4
解决办法
5万
查看次数

字符串与 [[ 测试中的整数的比较

我一直在寻找Kusalananda和xhienne之间的讨论在这里,在这里它提到[ "" -ge 2 ]不是一个有效的测试产生的错误bash --posix和其他POSIX兼容的炮弹。

bash-4.3$ [ "" -gt 10 ]
bash: [: : integer expression expected
bash-4.3$ [ '' -gt 10 ]
bash: [: : integer expression expected
Run Code Online (Sandbox Code Playgroud)

那里一切都很好。出于好奇,我对[[.

bash-4.3$ [[ "" -gt 10 ]] && echo "YES"
bash-4.3$ [[ "" -gt 0 ]] && echo "YES"
bash-4.3$ [[ "" -gt -1 ]] && echo "YES"
YES
bash-4.3$ [[ "" -eq 0 ]] && echo "YES"
YES
Run Code Online (Sandbox Code Playgroud)

如您所见,没有错误,它实际上被评估为数字表达式,其中 "" 等于 …

command-line bash posix

7
推荐指数
1
解决办法
6981
查看次数

这个带有睡眠的“while”循环倒计时不起作用

我的脚本有一些问题bash,但我不知道为什么。该脚本旨在将输入(以分钟为单位)转换为秒,然后开始倒计时直到达到零,此时脚本应停止。

当我sleep 1在中间添加一个时,它就不再倒计时了;为什么会发生这种情况?

代码:

if [ -z $1 ];
then
     read NUMBER
else NUMBER=$1
fi
SECONDS=$(( NUMBER * 60 ))

while [ $SECONDS -gt 0 ]
do
      sleep 1
      SECONDS=$(( SECONDS - 1))
      echo $SECONDS remaining
done

echo end
Run Code Online (Sandbox Code Playgroud)

linux scripting bash

7
推荐指数
2
解决办法
1544
查看次数

预期条件二元运算符

var="$(command1 -l '$var2' -c 'command2|grep -c "search"')"
if [[ var !=0 ]]; then
fi
Run Code Online (Sandbox Code Playgroud)

为什么我得到“预期条件二元运算符”。我已经搜索过并且。我看到 [[]] 是一个测试语句,但为什么它不起作用?

linux shell bash test variable

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