Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Security 为什么有人会在调用实用程序之前用'which'设置shell变量?_Security_Shell_Unix_Theory_Bsd - Fatal编程技术网

Security 为什么有人会在调用实用程序之前用'which'设置shell变量?

Security 为什么有人会在调用实用程序之前用'which'设置shell变量?,security,shell,unix,theory,bsd,Security,Shell,Unix,Theory,Bsd,我曾经与另一位经验更丰富的程序员合作,他会以以下方式将几乎所有的实用程序调用放入shell脚本中: FOO=`which foo` $FOO -bar 在和他一起工作了一年多之后,我很清楚他不是那种突发奇想做这些事情的人,但我从来没有真正注意过他,直到他辞职,我不得不开始维护他的代码。我唯一的假设是,作为OpenBSD的支持者和非常安全的想法,它可能与权限有关,或者能够测试运行脚本的用户是否具有权限?然而,为了反驳这一点,我不记得他曾经测试过设置这些变量是否成功。使用“which”这种方式几

我曾经与另一位经验更丰富的程序员合作,他会以以下方式将几乎所有的实用程序调用放入shell脚本中:

FOO=`which foo`

$FOO -bar

在和他一起工作了一年多之后,我很清楚他不是那种突发奇想做这些事情的人,但我从来没有真正注意过他,直到他辞职,我不得不开始维护他的代码。我唯一的假设是,作为OpenBSD的支持者和非常安全的想法,它可能与权限有关,或者能够测试运行脚本的用户是否具有权限?然而,为了反驳这一点,我不记得他曾经测试过设置这些变量是否成功。

使用“which”这种方式几乎是不可行的,但是如果您想指定一个实用程序,它会使维护代码变得更容易。例如,如果您发现自己运行的某个地方安装了两个FOO工具,并且已知其中一个有问题,那么您可以在脚本中硬编码正确的FOO,并且可能已将其路径设置为使用损坏的FOO的用户将不会受到伤害(或者称为不安全的FOO)。通过提前分配值,分配特定的值会局限于一个更改,而不是扩展到脚本中的每个实例。

我想说,代码会显著降低正确性,可能不是安全性。假设您希望在路径中找到
foo
,即
/usr/bin/foo
,并且该实用程序应该解析一些文件并发出一些文本。因此,将脚本发布到生产环境中。然后,某个用户碰巧有一个
$HOME/bin/foo
脚本,可以启动一个音乐应用程序,而这个用户在路径中把~/bin放在/usr/bin之前。现在,对于该用户来说,您的脚本已被破坏。

尽可能尊重您的同事——这被认为是不好的做法(在freenode的#bash;我不能代表其他论坛发言),而且通常是不明智的。在我所看到的大多数情况下,这是以效率的名义进行的,这是由那些没有意识到现代Shell缓存路径自动查找的人完成的,这使得它完全没有必要。我真的有一种感觉,可能就是这样。也许是出于尊重,但我也意识到他以“安全”的名义做了很多事情,从表面上看,这些都是不好的做法。我只是好奇这样做是否有很大的好处,比如确保脚本需要的实用程序(但不总是在默认路径中)不会导致兼容性问题。格伦和查尔斯,谢谢你们的解释。我将不得不开始在#bash中闲逛。这也是cargo cult编程和人们从自动生成的脚本(如autoconf生成的配置脚本)中复制样式的结果@Williampersell:是的,我在每一份工作中都会看到很多这样的情况。您可以查找如何修复某些问题,并找到一篇关于您正在使用的包的博客文章,其中的代码示例是逐字复制的。我发现唯一能解决这个问题的方法是强迫自己在项目时间线允许的范围内从头开始工作。如果您想在以后替换该实用程序而不更改调用它的代码(代码本身就有味道),正确的方法应该是函数包装,而不是无引号的
$FOO
调用。@charles,我同意。我发现像这样指定工具的做法非常可怕,但这很常见。我认为你关于路径缓存的评论可能比我的回答更准确。这与我所想的是他的推理相似。我必须阅读更多关于在shell中编写包装器的内容,这样我才能以更合适的方式来编写包装器。@Mange,那么,假设您希望包装
ls
以始终传递
-l
作为其第一个参数:
ls(){command ls-l“$@”}
将是一个合适的包装器。与别名不同,函数还可以执行条件逻辑,在非最终位置传递额外的命令行参数,在脚本中默认情况下不会禁用&c。是的,我昨天在工作中读了一些关于它的更新。我对没有总是使用最好的方法感到内疚,所以我试图强迫自己改进。好吧--
$PATH
在没有给出完全限定路径的任何情况下都会得到尊重,不管是否使用了
哪个
,这是通常需要的行为--它让用户处于控制之中,允许他们添加自己的包装,等等。