使用 sudo 时未找到命令

2024-10-14 08:40:00
admin
原创
213
摘要:问题描述:我的主文件夹中有一个名为的脚本foo.sh。当我导航到该文件夹​​并输入时./foo.sh,我得到-bash: ./foo.sh: Permission denied。当我使用时sudo ./foo.sh,我得到sudo: foo.sh: command not found。为什么会发生这种情况?我...

问题描述:

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

当我导航到该文件夹​​并输入时./foo.sh,我得到

-bash: ./foo.sh: Permission denied

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

sudo: foo.sh: command not found

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


解决方案 1:

没有权限

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

为了充分了解 Linux文件权限,您可以研究该命令的文档chmod。chmod是change mode的缩写,是用于更改文件权限设置的命令。

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

ls -l foo.sh

...它将列出文件所有者、组所有者以及文件所有者或文件所属组成员以外的所有人的读、写和执行权限(最后一个权限组有时称为“世界”或“其他”)

以下是针对您的情况如何解决权限被拒绝错误的摘要。

$ 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 

所有者具有读写权限 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
   ^  ^  ^

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

使用 sudo 导致命令未找到

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

root 用户找不到您的命令的原因可能是PATHroot 的环境变量不包含所在的目录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

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

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

解决方案 2:

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

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

事实上,我们可以用它创建一个别名:

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

(也可以直接命名别名sudo,替换原来的sudo。)

解决方案 3:

检查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

解决方案 4:

  1. 检查您是否具有该脚本的执行权限。即chmod +x foo.sh

  2. 检查该脚本的第一行是否是#!/bin/sh或类似内容。

  3. 对于 sudo,你位于错误的目录中。请检查sudo pwd

解决方案 5:

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

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

看一下这个答案,了解应该将软链接放在哪个目录中。

解决方案 6:

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

这是一个有点误导性的错误,但从技术上来说可能是正确的。文件只有在可执行时才是一个命令,因此无法找到。

解决方案 7:

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

解决方案 8:

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

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

解决方案 9:

好的,这是我的解决方案:在 ~/.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。

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

解决方案 10:

如果您对命令行不太熟悉并且正在使用Ubuntu,您可以按如下方式解决问题:

  1. 打开文件所在文件夹窗口

  2. 右键单击可执行文件并选择Properties

  3. 转到Permissions标签并突出显示Allow executing file as program

在此处输入图片描述

通过此解决方案,您可以允许用户将文件作为程序执行,并且不需要 sudo(或更改PATHroot 的环境变量)。

解决方案 11:

好像sudo没有找到命令
要检查你的系统上是否安装了 sudo 包,请输入sudo,然后按 Enter 。如果你已经sudo安装,系统将显示一条简短的帮助消息,否则你会看到类似的内容sudo: command not found

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

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

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

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用