首页 文章

使用sudo时找不到命令

提问于
浏览
118

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

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

-bash: ./foo.sh: Permission denied .

当我使用 sudo ./foo.sh 时,我明白了

sudo: foo.sh: command not found .

为什么会发生这种情况以及如何解决?

8 回答

  • 1

    Permission denied

    为了运行脚本,文件必须具有 an executable permission bit set .

    为了完全理解Linux file permissions,您可以学习 chmod 命令的文档 . chmod,更改模式的缩写,是用于更改文件权限设置的命令 .

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

    ls -l foo.sh
    

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

    以下是在您的情况下如何解决 Permission Denied error 的摘要 .

    $ 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
    

    所有者具有读写访问权限,但是 - 表示缺少可执行权限

    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
       ^  ^  ^
    

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

    Using sudo results in Command not found

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

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

    PATH环境变量包含搜索命令的目录列表 . 每个用户根据需要设置自己的PATH变量 . 查看设置运行的内容

    env | grep ^PATH
    

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

    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
    

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

    foo.sh 所在的目录不存在于root用户的PATH变量中,因此找不到命令错误 .

  • 10

    其他解决方案我实际上可以通过正确调用它来使用当前的 PATH (使用 env 命令)和/或环境的其余部分(使用 -E 选项)_117339_s .

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

    事实上,人们可以用它来制造别名:

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

    (也可以将别名命名为 sudo ,替换原始 sudo . )

  • 127

    检查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
    
  • 3
    • 检查您是否具有脚本的执行权限 . 即 chmod +x foo.sh

    • 检查该脚本的第一行是 #!/bin/sh 还是其中的一行 .

    • 对于sudo,你在错误的目录中 . 检查 sudo pwd

  • 1

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

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

    看看this answer,了解将软链接放入哪个目录 .

  • 1

    即使你明确地给出了文件的路径,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
    

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

  • 66

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

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

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

    请注意,在添加PATH时我需要明确,因为超级用户的HOME是/ root

  • 6

    如果您在使用上述指南时遇到问题,请尝试 chmod u+x foo.sh 而不是 chmod +x foo.sh . 当其他解决方案没有时,这对我有用 .

相关问题