【问题标题】:Command not found when using sudo使用 sudo 时找不到命令
【发布时间】:2012-10-11 09:00:33
【问题描述】:

我的主文件夹中有一个名为 foo.sh 的脚本。

当我导航到这个文件夹并输入./foo.sh 时,我得到了

-bash: ./foo.sh: Permission denied

当我使用sudo ./foo.sh 时,我得到了

sudo: foo.sh: command not found.

为什么会发生这种情况,我该如何解决?

【问题讨论】:

    标签: linux bash sudo


    【解决方案1】:

    在 Ubuntu 中,右键单击可执行文件并选择 Properties,转到 Permissions 选项卡并突出显示 Allow executing file as program

    【讨论】:

      【解决方案2】:

      关于使用 sudo 时的“找不到命令”,更简单的方法是编辑secure_path。

      这里完美地描述了: https://superuser.com/questions/927512/how-to-set-path-for-sudo-commands

      【讨论】:

        【解决方案3】:
        似乎找不到sudo 命令

        要检查您的系统上是否安装了 sudo 包,请输入 sudo ,然后按 Enter 。如果你安装了sudo,系统会显示一个简短的帮助信息,否则你会看到类似sudo: command not found

        要安装 sudo,请使用 root 帐户运行以下命令之一:

        apt-get install sudo#如果你的系统基于apt包管理器

        yum install sudo#如果你的系统基于yum包管理器

        【讨论】:

        • 这不能回答问题,因为问题是未在脚本上设置设置的可执行位。
        • 不是sudo命令没找到。输出的意思是 sudo “说”没有找到“foo.sh”命令。
        【解决方案4】:

        如果您对上述指南有疑问,请尝试chmod u+x foo.sh 而不是chmod +x foo.sh。当其他解决方案不起作用时,这对我有用。

        【讨论】:

          【解决方案5】:

          您还可以在超级用户 PATH 中的某个目录(例如/usr/local/bin)中创建指向脚本的软链接。然后它将可供 sudo 使用。

          chmod +x foo.sh
          sudo ln -s path-to-foo.sh /usr/local/bin/foo
          

          查看this answer 以了解将软链接放入哪个目录。

          【讨论】:

            【解决方案6】:

            好的,这是我的解决方案: 在 ~/.bash_aliases 中添加以下内容:

            # ADDS MY PATH WHEN SET AS ROOT
            if [ $(id -u) = "0" ]; then
               export PATH=$PATH:/home/your_user/bin 
            fi
            

            瞧! 现在您可以使用 sudo 执行自己的脚本或设置为 ROOT,而无需每次都执行 export PATH=$PATH:/home/your_user/bin。

            请注意,由于超级用户的 HOME 是 /root,所以在添加 PATH 时我需要明确说明

            【讨论】:

              【解决方案7】:

              即使你明确给出文件的路径,linux 似乎也会说“找不到命令”。

              [veeam@jsandbox ~]$ sudo /tmp/uid.sh;echo $?
              sudo: /tmp/uid.sh: command not found
              1
              [veeam@jsandbox ~]$ chmod +x /tmp/uid.sh
              [veeam@jsandbox ~]$ sudo /tmp/uid.sh;echo $?
              0
              

              这是一个有点误导性的错误,但在技术上它可能是正确的。文件在可执行之前不是命令,因此无法找到。

              【讨论】:

                【解决方案8】:

                到目前为止,我在这里看到的其他解决方案是基于一些系统定义的,但实际上可以让 sudo 使用当前的 PATH(使用 env 命令)和/或其余的环境(使用-E 选项)只需正确调用即可:

                sudo -E env "PATH=$PATH" <command> [arguments]
                

                事实上,我们可以用它来做一个别名:

                alias mysudo='sudo -E env "PATH=$PATH"'
                

                (也可以将别名本身命名为sudo,替换原来的sudo。)

                【讨论】:

                • 我喜欢这个解决方案,Tom,因为您有意识地使用不同的 sudo 调用。无论以何种方式(并且有很多)设置,始终注意使用的 PATH 变量是很重要的。
                • 我相信这是解决 Ubuntu 发行版中面临的command not found 问题的正确且最标准化的解决方案。谢谢大佬。
                • 您可以将别名添加到您的./bashrc 以在会话之间保存
                • 我在使用 mysudo 后得到“权限被拒绝”。
                • 你一开始就没有解释为什么它们不同。
                【解决方案9】:

                权限被拒绝

                为了运行脚本,文件必须设置可执行权限位

                为了全面了解 Linux file permissions,您可以研究chmod 命令的文档。 chmodchange mode的缩写,是用来改变文件权限设置的命令。

                要阅读本地系统的 chmod 文档,请从命令行运行 man chmodinfo chmod。一旦阅读并理解,您应该能够理解运行的输出......

                ls -l foo.sh
                

                ... 这将列出文件所有者、组所有者以及不是文件所有者或文件所属组成员的其他所有人的 READ、WRITE 和 EXECUTE 权限(最后一个权限组是有时称为“世界”或“其他”)

                这里总结了如何解决您的情况中的Permission Denied 错误

                $ ls -l foo.sh                    # Check file permissions of foo
                -rw-r--r-- 1 rkielty users 0 2012-10-21 14:47 foo.sh 
                    ^^^ 
                 ^^^ | ^^^   ^^^^^^^ ^^^^^
                  |  |  |       |       | 
                Owner| World    |       |
                     |          |    Name of
                   Group        |     Group
                             Name of 
                              Owner 
                

                Owner 有读写权限 rw 但 - 表示缺少可执行权限

                chmod 命令解决了这个问题。 (组和其他只对文件设置了读取权限,不能写入或执行)

                $ chmod +x foo.sh               # The owner can set the executable permission on foo.sh
                $ ls -l foo.sh                  # Now we see an x after the rw 
                -rwxr-xr-x 1 rkielty users 0 2012-10-21 14:47 foo.sh
                   ^  ^  ^
                

                foo.sh 现在就 Linux 而言是可执行的。

                使用 sudo 导致找不到命令

                当您使用 sudo 运行命令时,您实际上是以超级用户或 root 身份运行它。

                root 用户没有找到您的命令的原因可能是root 的PATH 环境变量不包含foo.sh 所在的目录。因此找不到该命令。

                PATH 环境变量包含搜索命令的目录列表。每个用户根据自己的需要设置自己的 PATH 变量。 看看它被设置为运行什么

                env | grep ^PATH
                

                以下是先以普通用户身份运行上述env 命令然后以root 用户身份使用sudo 运行的一些示例输出

                rkielty@rkielty-laptop:~$ env | grep ^PATH
                PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
                
                rkielty@rkielty-laptop:~$ sudo env | grep ^PATH
                [sudo] password for rkielty: 
                PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
                

                请注意,虽然相似,但在这种情况下,非特权用户 (rkielty) 和超级用户在 PATH 中包含的目录并不相同

                foo.sh所在的目录不在root用户的PATH变量中,因此command not found错误。

                【讨论】:

                • @Nakilon 如果你把它放在一个包含完整细节的问题中,我应该能够为你进一步解决它。问题可能是哪个 shell(您的第一个命令 shell 或 sudo 启动的 shell)评估了 $PWD
                • @Rob: 那么如何使sudoPATH 与用户的相同呢?
                • @Rob:与此同时,我找到了一种方法(请参阅下面的答案)。
                • 我喜欢你解释的方式!谢谢:)
                • @Tom 你可以更改 /etc/sudoers 中的secure_path
                【解决方案10】:

                在 sudo 上检查 secure_path

                [root@host ~]# sudo -V | grep 'Value to override'
                Value to override user's $PATH with: /sbin:/bin:/usr/sbin:/usr/bin
                

                如果$PATH 被覆盖,请使用visudo 并编辑/etc/sudoers

                Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
                

                【讨论】:

                • 谢谢!这有助于解决 sudo 无法运行命令的谜团。
                • 你一开始就没有解释为什么它们不同。
                • @PhilipRego - 这些答案已有 6 年的历史,如果您觉得多个答案的详细信息不足...尝试就您正在寻找的内容提供一些建议,或者最好还是编辑提供您发现缺少的详细信息的答案。
                【解决方案11】:
                1. 检查您是否拥有脚本的执行权限。即chmod +x foo.sh
                2. 检查该脚本的第一行是否为#!/bin/sh 或类似的。
                3. 对于 sudo,您位于错误的目录中。检查sudo pwd

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2020-01-10
                  • 2022-01-04
                  • 2023-04-05
                  • 1970-01-01
                  • 2014-07-06
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多