当前位置: 首页 > 知识库问答 >
问题:

使用sudo时未找到命令

吴炎彬
2023-03-14

我有一个脚本叫做foo。sh在我的主文件夹中。

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

-bash:./foo.sh:权限被拒绝.

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

sudo:foo.sh:命令未找到

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

共有3个答案

锺离阿苏
2023-03-14

检查sudo上的安全路径

[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
冯俊英
2023-03-14

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

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

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

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

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

魏凯捷
2023-03-14

拒绝许可

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

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

要阅读本地系统的chmod文档,请从命令行运行manchmodinfo chmod。一旦阅读和理解,你应该能够理解运行的输出。。。

ls -l foo.sh

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

下面是如何在您的案例中排除权限被拒绝错误的摘要。

$ 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 permisshtml" target="_blank">ion 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的PATH环境变量不包括foo.sh所在的目录。因此找不到该命令。

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

env | grep ^PATH

下面是运行上述env命令的一些示例输出,首先作为普通用户,然后作为根用户使用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)和超级用户路径中包含的目录并不相同。

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

 类似资料:
  • 问题内容: 我的主文件夹中有一个脚本。 当我导航到该文件夹​​并输入时,我得到 。 当我使用时,我得到 。 为什么会发生这种情况,我该如何解决? 问题答案: 没有权限 为了运行脚本,文件必须 设置可执行权限 。 为了完全理解Linux 文件权限,您可以学习命令的文档。chmod是 change mode 的缩写,是用于更改文件的权限设置的命令。 要阅读本地系统的chmod文档,请运行或从命令行运行

  • 我正在学习bash在我的Mac: 在我的Mac中有一个最简单的bash脚本,名为: 但在我的终端中,我想运行它,但失败了: 我不知道为什么会有错误,一切都好。

  • 我让Jenkins在docker内部运行aws ec2实例。我正在使用以下命令启动Jenkins: 以下是我的文件: 在Jenkins作业日志中,当我运行作业时,我得到。如果我删除了第一阶段的“Docker权限”,那么我将开始获得以下。 /var/jenkins_home/workspacetest@tmp /durable-12345/script.sh: 1: /var/jenkins_hom

  • 这是我的Dockerfile的内容。 当我运行Dockerfile来构建docker映像时,我得到以下错误: /bin/sh:1:sudo:未找到 你能帮我解决上面的错误吗?

  • 我是新的Python开发和尝试使用pipenv。我运行命令,它成功运行: 然而,当我在一个新的根项目目录中运行命令时,我收到以下消息:。我怀疑我可能需要修改我的. bashrc,但是我不清楚要向文件中添加什么,或者是否需要修改。

  • 我在Heroku上使用Postgresql数据库托管了一个RoR应用程序,并且一直在使用PG备份工具将数据库从我的应用程序备份到本地机器上。由于该应用程序仍在开发中,它从编程的角度帮助我降低了我的同事对数据库所做的更改。几个月来,我一直在成功地使用PG备份进行捕获和恢复,但最近,当我运行此处所示的典型命令时: 在curl命令执行后,我遇到此错误: 你知道为什么会这样吗?显然,问题是我无法恢复下载的