在bash脚本中使用Linux命令的正确方法

在bash脚本中使用Linux命令的正确方法,bash,shell,scripting,Bash,Shell,Scripting,在bash脚本中使用Linux命令的最佳和最正确的方法是什么?仅使用依赖于shell路径的ip addr show,正确吗?或者我应该首先找到命令的路径(如whereis ip或command-v ip),将输出分配给某个变量,然后使用该变量吗?我倾向于将路径设置为路径顶部的实用程序,避免对路径的任何依赖。一种潜在的攻击是在运行bash脚本之前设置路径。为每个实用程序设置路径是痛苦的,但它可以防止这种攻击 如果您正在为多个环境进行创作,这些环境中的实用程序位于不同的位置,例如Debian和Mac

在bash脚本中使用Linux命令的最佳和最正确的方法是什么?仅使用依赖于shell路径的
ip addr show
,正确吗?或者我应该首先找到命令的路径(如
whereis ip
command-v ip
),将输出分配给某个变量,然后使用该变量吗?

我倾向于将路径设置为路径顶部的实用程序,避免对路径的任何依赖。一种潜在的攻击是在运行bash脚本之前设置路径。为每个实用程序设置路径是痛苦的,但它可以防止这种攻击

如果您正在为多个环境进行创作,这些环境中的实用程序位于不同的位置,例如Debian和MacOS,我会检查路径,例如

[ -f /usr/bin/grep ] && GREP=/usr/bin/grep || GREP=/bin/grep

就我个人而言,我只是依赖路径并调用“bare”命令

如果不信任用户的路径,可以将其重置为最小默认值:

PATH=$(/usr/bin/getconf PATH)

grep "$pattern" "$file"

确切地说,您需要防止哪些攻击?如果您不信任路径,只需在脚本开始时将其设置为已知的良好值即可。比我经常看到的将命令名存储在变量中的cargo cult反模式更好。或者,不受信任的用户可以编辑您的脚本以使用他们选择的
grep
。如果有什么区别的话,这样做会更容易,因为只需要更改一个赋值。@JohnKugelman是的,将路径设置在顶部是一种方法。攻击可能是路径在脚本之外以某种方式发生了更改,而通常只做一件事的脚本可能会做一些完全不同的事情。这两种脚本都使用
PATH
来确定绝对路径,因此这是一个无用的中间步骤。我希望有时间写一个详细的答案。Cliff备注:使用普通命令,不要担心
$PATH
。在变量中存储绝对命令路径是一种常见的反模式
$PATH
由用户控制,因此如果设置不正确,那是他们自己的错误。他们无法通过改变它来利用任何东西;毕竟,他们总是可以手动运行脚本的命令;或者只是编辑脚本,然后运行它。如果提升权限,只需小心使用
$PATH
。例如,您将看到
su
sudo
具有防止漏洞利用的保护。谢谢您的评论,@JohnKugelman