sudo:来源:找不到命令


54

我一直在更新bash的一些默认配置文件,并且从我遵循的教程中可以看出,我可以使用以下方法使用新的环境设置重新加载新的配置文件:

source /etc/bash.bashrc

唯一的事情是-新的环境变量仅对我当前的用户可用-在我使用sudo时被忽略了。当我关闭终端会话并重新加入时,它们仅可用于sudo。

当我尝试使用时:

sudo source /etc/bash.bashrc

我得到错误:

sudo: source: command not found

是否有一种简单的方法可以加载新的sudo bash配置文件设置而无需关闭终端并重新启动?

-最初,我使用了一些引用变量的安装脚本。我发现虽然当我直接调用脚本时它们可以访问变量(尽管这会导致以后在创建目录时出现问题,因为我需要成为root用户),但使用sudo调用安装脚本不会。

我通过使用以下简单命令进行测试证明了这一点:

echo $ENV_VARIABLE
sudo echo $ENV_VARIABLE

第一个将输出变量的值,但是第二个将不输出任何内容。


您如何尝试使用sudo中的变量?请注意,如果您使用“ sudo命令$ variable”,它将从您的shell中而不是sudo的环境中替换该变量。
若奥·平托

Answers:


72

问题在于这source是一个bash内置命令(而不是程序-like lsgrep)。我认为一种方法是以root用户身份登录,然后执行source命令。

sudo -s
source /etc/bash.bashrc

3
没错,问题在于这source是内置的shell。sudo su这是一种奇怪的说法-最好只说sudo -ssudo自己说的“以该用户身份启动Shell”。单行版本将无法运行,因为其中的每个命令都由主用户的外壳程序在单独的子进程中运行。
poolie 2011年

1
对。另外,BASH在登录时读取/ etc / bashrc。因此,您最好将'su'与-,-l或--login开关配合使用,以获取该用户的环境:'sudo su-'成为root或'su-$ username'成为另一个用户。

“一行”示例将不起作用,因为su启动了一个新的外壳,并且“源”仅在终止后才运行。第一个示例仅在第二行在root shell 使用时才有效。
loevborg 2011年

sudo -s没有比sudo su。两种方式都不会有任何效果。
loevborg 2011年

1
sudo -s具有启动外壳的类似效果,但对我来说,在执行一个命令时堆叠两个“成为另一个用户”命令似乎并不明智。
poolie 2011年

14

问题不在于sourceshell内置命令。事实上,这实际上是向您抛出command not found错误的原因,但这并不意味着它会起作用。

实际的问题是环境变量如何工作。它们的工作方式是这样的:每次启动新进程时,如果什么都没有发生,它将继承其父级的环境。因此,使用子外壳程序(例如bash在bash实例中键入内容)并查看的输出env应得到与其父对象相似的结果。

但是,由于sudo工作原理(如其联机帮助页所述),sudo尝试剥离用户的环境并为替代用户创建一个“默认”环境,以便命令运行就像调用它的用户具有成为主叫用户(这是预期的行为),因此运行nautilus的方式sudo nautilus应在该/root文件夹处打开一个文件夹,而不是/home/yourusername

所以:

进行类似操作sudo source script.sh,然后sudo command即使将其设置为成功,即使将其设置为成功,也不会成功sudo command

为了传递环境变量,您可以告诉sudo保留环境(通过-E开关;并在sudoers文件中具有适当的权限)和/或将命令设置为sudo VAR1=VALUE1 VAR2=VALUE2 command


4

使用bash 进程替换,您可以执行以下操作:

source <(sudo cat /etc/bash.bashrc)

1
这将如何帮助OP启动新设置来启动根shell?
大师

1
OP实际上正在询问如何从需要sudo用来访问配置文件的外壳中“ ...重新加载新的配置文件...” 。上面提供了一种导入配置文件的方法,同时避免了所sudo: source: command not found提到的问题。
TomDotTom '18年

“唯一的是-新的环境变量仅对当前用户可用-在使用sudo时将被忽略。”
大师

3

正如Marcos所说,这里的主要问题是sourceshell内置命令,该命令仅影响运行它的shell进程。

一种简单的解决方案是仅以root身份启动一个新的shell,bash /etc/bash.bashrc在启动时会自动读取。就是这么简单

sudo bash

2

关闭并重新打开终端不应该改变任何事情。默认情况下,sudo剥离环境。要禁用它,请将-E添加到sudo。


2

发生错误是因为您尝试从命令行调用的二进制文件仅是当前用户PATH变量的一部分,而不是root用户PATH的一部分。

您可以通过定位要访问的二进制文件的路径来验证这一点。就我而言,我试图称其为“ bettercap-ng”。所以我跑了

$ which bettercap-ng
/home/user/work/bin/bettercap`

我检查了该位置是否是我的root用户的PATH的一部分。

$ sudo env | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

所以sudo找不到我要从命令行调用的二进制文件。因此返回未找到的错误命令。

调用如下所示的二进制文件时,可以指示sudo使用当前用户的PATH。

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

实际上,可以使用别名:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.