sudo:source:找不到命令

我一直在更新bash的一些默认配置文件,并从我正在关注的教程中看到我可以使用以下命令重新加载新配置文件:

source /etc/bash.bashrc 

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

当我尝试使用时:

 sudo source /etc/bash.bashrc 

我收到错误:

 sudo: source: command not found 

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

– 最初,我使用了一些引用变量的安装程序脚本。 我发现虽然我直接调用脚本时可以访问变量(虽然这会导致后来创建目录的问题,因为我需要root),但是使用sudo调用安装脚本不会。

我用这些简单的命令测试certificate了这一点:

 echo $ENV_VARIABLE sudo echo $ENV_VARIABLE 

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

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

 sudo -s source /etc/bash.bashrc 

问题不在于source是shell内置命令。 实际上是它实际上是在向你发出 command not found错误,但这并不意味着它会起作用。

实际问题是环境变量如何工作。 它们的工作方式如下:每次启动新进程时,如果没有任何反应,它将inheritance其父进程的环境。 因此,使用子shell(例如在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

正如Marcos所说 ,你的主要问题是source是一个shell内置命令,它只影响运行它的shell进程。

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

 sudo bash 

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

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

您可以通过查找要尝试访问的二进制文件的路径来validation这一点。 在我的情况下,我试图称之为“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。

请参阅此video了解分步解决方案

使用bash 进程替换,您可以:

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