没有sudo但没有sudo的可执行运行

Mahendran Sakkarai

我在该位置的系统中安装了xampp /opt/lampp之后,我使用以下命令将php位置添加到我的路径变量中

export PATH=$PATH:/opt/lampp/bin

因此,当我php -v使用终端运行时,将获得预期的输出。

PHP 5.6.8 (cli) (built: Apr 20 2015 18:37:47) 
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies

但是当我跑步时sudo php -v我得到了:

sudo: php: command not found

我不知道为什么会这样。将其添加到路径变量时,我做错什么了吗?

编辑:

这个问题不是使用'sudo'运行时环境变量的重复,因为在那个问题中,zetah询问了如何将任意变量传递给python命令。他们是能够执行python使用sudo,但我不能执行php使用sudo

按照此答案,我将PATH添加到sudo使用以下命令:

sudo PATH=$PATH:/opt/lampp/bin php -v

但我得到的输出像以前一样:

sudo: php: command not found

按照此答案,我添加-Esudo,但得到的结果相同:

$ sudo -E php -v
sudo: php: command not found
赞娜

为什么sudo不使用您的PATH

sudo忽略PATH变量的原因是它具有自己的secure_path,并且已确定使用它。

如果您是sudo cat /etc/sudoerssudo grep secure /etc/sudoers,您将看到此路径在您的系统上。我有这条线:

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

的目的sudosecure_path就是尽量使其不太可能与用户sudo的权限会(意外)运行危险代码为根后的路径已被修改,可能包括本地目录。

可以避免通过修改来注释掉该行而完全sudo使用,但这将是一个坏主意,因为它删除了安全措施,并且也没有必要,因为您可以通过各种可取的方式轻松地解决它。secure_path/etc/sudoers

获取sudo使用您的PATH

要覆盖secure_pathsudo使用当前定义的PATH(如muru commented),您可以使用:

sudo env PATH="$PATH" command

请注意,-E标志或仅分配变量不起作用(至少在Ubuntu上)。

$ mkdir junk                            # create a test directory to add to PATH
$ echo "echo foo" > junk/useless        # create a harmless program
$ chmod u+x junk/useless                # make it executable
$ PATH="$PATH":~/junk                   # add directory to PATH

当添加到PATH时,请使用绝对路径(外壳将~在分配变量之前扩展)。我不需要export(这样做无济于事),因为PATH已经导出,更改其值也将导致子进程也继承更改。

$ useless
foo
$ sudo useless
sudo: useless: command not found
$ sudo -E useless
sudo: useless: command not found

人们通常希望这能奏效……man sudo说:

-E, --preserve-env
            Indicates to the security policy that the user wishes to
            preserve their existing environment variables.

但这是行不通的。-E标志不起作用secure_path可能是一个错误

$ sudo PATH="$PATH" useless
sudo: useless: command not found

这不会影响sudo自己的环境,该环境是根据所配置的安全策略设置的/etc/sudoers这包括env_resetsecure_path作为Ubuntu的默认设置,从而导致加载最小的环境,并将PATH设置为中的任何值secure_path

如果sudo能够useless在其自己的路径目录之一中找到调用的命令并运行该命令,则该命令将传递PATH=$PATH到其环境中,如此处所示但是它本身不会使用给定的PATH值。解决方案是运行:

$ sudo env PATH="$PATH" useless
foo

此解决方法使用env命令来设置PATH。与不同sudoenv使用给定变量设置环境,然后查找命令参数并在修改后的环境下运行命令。如上info (coreutils) env invocation所说:

修改要PATH在搜索命令之前生效

设置路径

当您将PATH变量更改为包括目录时/opt/lampp/bin,您使用了以下命令:

export PATH=$PATH:/opt/lampp/bin

这对于当前的shell和所有当前shell的子进程(例如从此shell调用的shell)将是有效的。当您退出此shell并退出其所有子级时,该修改过的PATH变量已被完全遗忘,而当您打开新的shell时,您会发现不包含的旧PATH变量/opt/lampp/bin因此,muru建议的完整命令

sudo env PATH="$PATH:/opt/lampp/bin" php -v

如果您仍未使用已添加的Shell,则很有必要/opt/lampp/bin

要永久更改路径,您需要编辑一些配置文件来修改您的用户环境,或者在外壳启动时由外壳读取。您可以在中添加一行以分配环境变量~/.profile,例如:

PATH="$PATH:/opt/lampp/bin"

然后,注销并重新登录(或运行source ~/.profile以立即查看效果)之后,您将始终能够运行

php -v

或者

sudo env PATH="$PATH" php -v

无需先调整您的PATH。

不太麻烦的选择

一个更方便的解决方法是在secure_path默认路径PATH和默认路径中建立到可执行文件的符号链接,例如:

sudo ln -s /opt/lampp/bin/php /usr/local/bin/php

这样,使用调用命令时sudo您将不需要做任何特殊的事情,也不需要永久或临时地采取任何步骤来调整PATH。

如果要安装的程序的名称与系统进程可能尝试调用的另一个程序的名称相同,请给符号链接一个不同的名称,以避免混淆这些进程。您可以使用以下type命令来检查您要使用的名称是否不是其他命令的名称

$ type php
bash: type: php: not found

因此,在此系统上,我现在可以创建命令php而不必担心任何错误。如果php将来安装其他提供命令的程序,则可能不得不重新考虑我的配置。

您还可以为该命令创建一个别名并将其添加到您的中~/.bashrc,例如:

alias sudo-php='sudo env PATH="$PATH:/opt/lampp/bin/php"'

然后,您可以(在运行source .bashrc或打开新的shell之后)运行

sudo-php

而不sudo php是以root用户身份运行该程序,并且sudo不会声称自己不知道其位置。

该别名仅在交互式shell中可用,因此不会混淆其他程序。

当然,可以使用来为其创建别名,sudo以使其始终使用您的PATH alias sudo='sudo env PATH="$PATH"',但这是一个坏主意,因为它会使系统的安全性降低。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在没有sudo的情况下运行可执行文件

来自分类Dev

可执行文件在一个帐户下没有sudo特权运行,但在另一个帐户下没有?

来自分类Dev

suid可执行文件没有提升权限,但是`sudo`确实可以提升

来自分类Dev

没有Sudo,流星会不会运行?

来自分类Dev

没有sudo不能运行docker命令

来自分类Dev

运行 sudo startx 后没有屏幕

来自分类Dev

没有“ sudo”的MySQL

来自分类Dev

Ansible:没有密码的sudo

来自分类Dev

没有sudo的递归chmod

来自分类Dev

如何在没有sudo的情况下执行'iftop'

来自分类Dev

在没有sudo的情况下执行mysql

来自分类Dev

在没有密码的情况下执行sudo?

来自分类Dev

在没有密码的情况下执行sudo?

来自分类Dev

在没有sudo的情况下执行mysql

来自分类Dev

如何在没有sudo的情况下运行NPM?

来自分类Dev

sudo su在没有密码提示的情况下运行?

来自分类Dev

在OS X上没有sudo就无法运行“ git”

来自分类Dev

sudo python3运行的版本与没有sudo的运行python3的版本不同

来自分类Dev

没有设置可执行位时,如何从CD运行可执行文件?

来自分类Dev

Ansible:有sudo但没有根

来自分类Dev

C ++ ThreadPool没有并行运行

来自分类Dev

如何在没有sudo的情况下运行pip(适用于Mac)?没有sudo它是行不通的

来自分类Dev

是否可以在以 sudo 启动的 Nodjs 中运行没有 sudo 的 bash 脚本?

来自分类Dev

在没有Sudo的情况下运行Compiz时没有窗口装饰

来自分类Dev

在没有Sudo的情况下运行Compiz时没有窗口装饰

来自分类Dev

运行 os.system 就好像 python 没有用 sudo 执行一样

来自分类Dev

sudo没有密码中断其他sudo -u的使用

来自分类Dev

sudo没有密码中断其他sudo -u的使用

来自分类Dev

当我没有sudo或su时如何安装sudo

Related 相关文章

  1. 1

    在没有sudo的情况下运行可执行文件

  2. 2

    可执行文件在一个帐户下没有sudo特权运行,但在另一个帐户下没有?

  3. 3

    suid可执行文件没有提升权限,但是`sudo`确实可以提升

  4. 4

    没有Sudo,流星会不会运行?

  5. 5

    没有sudo不能运行docker命令

  6. 6

    运行 sudo startx 后没有屏幕

  7. 7

    没有“ sudo”的MySQL

  8. 8

    Ansible:没有密码的sudo

  9. 9

    没有sudo的递归chmod

  10. 10

    如何在没有sudo的情况下执行'iftop'

  11. 11

    在没有sudo的情况下执行mysql

  12. 12

    在没有密码的情况下执行sudo?

  13. 13

    在没有密码的情况下执行sudo?

  14. 14

    在没有sudo的情况下执行mysql

  15. 15

    如何在没有sudo的情况下运行NPM?

  16. 16

    sudo su在没有密码提示的情况下运行?

  17. 17

    在OS X上没有sudo就无法运行“ git”

  18. 18

    sudo python3运行的版本与没有sudo的运行python3的版本不同

  19. 19

    没有设置可执行位时,如何从CD运行可执行文件?

  20. 20

    Ansible:有sudo但没有根

  21. 21

    C ++ ThreadPool没有并行运行

  22. 22

    如何在没有sudo的情况下运行pip(适用于Mac)?没有sudo它是行不通的

  23. 23

    是否可以在以 sudo 启动的 Nodjs 中运行没有 sudo 的 bash 脚本?

  24. 24

    在没有Sudo的情况下运行Compiz时没有窗口装饰

  25. 25

    在没有Sudo的情况下运行Compiz时没有窗口装饰

  26. 26

    运行 os.system 就好像 python 没有用 sudo 执行一样

  27. 27

    sudo没有密码中断其他sudo -u的使用

  28. 28

    sudo没有密码中断其他sudo -u的使用

  29. 29

    当我没有sudo或su时如何安装sudo

热门标签

归档