使用 sudo 时未找到命令

2024-10-14 08:40:00
admin
原创
78
摘要:问题描述:我的主文件夹中有一个名为的脚本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 包管理器

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用