使用sudo权限在当前shell中执行shell脚本

sha*_*har 45 linux bash shell

为了在当前shell中执行shell脚本,我们需要使用句点.source命令.但为什么它不适用于sudo权限?

我有一个名为执行权限的脚本setup.sh.当我使用一段时间时,我得到了这个:

$ sudo . ./setup.sh 
sudo: .: command not found
Run Code Online (Sandbox Code Playgroud)

source命令也会产生类似的错误.我错过了什么吗?如何在同一个shell中使用sudo权限运行脚本?

提前致谢..

Jas*_*seC 104

我不确定这是否会破坏任何规则

sudo bash script.sh
Run Code Online (Sandbox Code Playgroud)

似乎对我有用.

  • 这不是问题的"确切"答案.它不会在当前shell中执行脚本. (4认同)
  • 我认为因为你实例化一个具有root权限的shell并在其中运行脚本. (3认同)
  • 这是问题的确切答案 (2认同)
  • 这不会像“source”或“.”那样在同一/当前 shell 中运行脚本。它运行一个新的 bash shell 作为“sudo”的子进程(它本身作为当前 shell 的子进程运行)。这对于大多数脚本来说都很好(这是运行脚本的正常方式),但对于必须在当前 shell 中运行的任何内容,它都不会这样做。 (2认同)

Dav*_*ani 32

我认为你对采购和执行脚本之间的区别感到困惑.

执行脚本意味着创建一个新进程并运行该程序.该程序可以是shell脚本,也可以是任何其他类型的程序.由于它是一个子流程,程序中更改的任何环境变量都不会影响shell.

获取脚本只能与bash脚本一起使用(如果您正在运行bash).它有效地键入命令,就像你执行它们一样.这很有用,因为它允许脚本更改shell中的环境变量.


运行脚本很简单,只需输入脚本的路径即可..是当前目录.因此./script.shscript.sh在当前目录中执行该文件.如果命令是单个文件(例如script.sh),它将检查PATH变量中的所有文件夹以查找脚本.请注意,当前目录不在PATH中,因此您无法script.sh通过运行在当前目录中执行文件script.sh,您需要运行./script.sh(除非当前目录在PATH中,例如您可以ls/bindir中运行).

采购脚本不使用PATH,只搜索路径.请注意,这source不是程序 - 否则它将无法更改当前shell中的环境变量.它实际上是一个内置命令的bash.搜索/bin/usr/bin-你不会找到一个source程序在那里.因此,要script.sh在当前目录中获取文件,您只需使用source script.sh.


sudo如何与此互动?好的sudo需要一个程序,并以root身份执行.例如sudo ./script.sh执行script.sh,在子进程中但以root身份运行.

那怎么sudo source ./script.sh办?记住source不是程序(而是内置的shell)?Sudo期待一个程序名称,所以它搜索一个名为的程序source.它找不到一个,所以失败了.如果不创建新的子进程,则无法获取以root身份运行的文件,因为在启动后无法更改程序的运行程序(在本例中为bash).

我不确定你真正想要的是什么,但希望这会为你清除它.


这是一个具体的例子.script.sh使用以下内容在当前目录中创建文件:

#!/bin/bash    
export NEW_VAR="hello"
whoami
echo "Some text"
Run Code Online (Sandbox Code Playgroud)

使其可执行 chmod +x script.sh.

现在观察bash会发生什么:

> ./script.sh
david
Some text
> echo $NEW_VAR

> sudo ./script.sh
root
Some text
> echo $NEW_VAR

> source script.sh
david
Some text
> echo $NEW_VAR
hello
> sudo source script.sh
sudo: source: command not found
Run Code Online (Sandbox Code Playgroud)


Gor*_*son 29

你想做的事是不可能的; 您当前的shell在您的常规用户ID下运行(即没有root访问权限sudo会给您),并且无法授予其root访问权限.什么sudo是创建以root身份运行的新*sub*进程.子进程可以只是一个常规程序(例如在根进程中sudo cp ...运行cp程序),也可以是根子shell,但它不能是当前的shell.

(它实际上甚至比这更不可能,因为sudo命令本身作为当前shell的子进程执行 - 这意味着在某种意义上它已经为时已晚,无法在"当前shell"中执行任何操作,因为它不是它的位置执行).

  • @dalesikkema:`sudo bash myscript.sh`将在子shell中运行脚本,而不是当前的shell.如果这适用于您的情况,那很好 - 但这个特殊问题是关于在当前shell*中以root*身份运行脚本. (16认同)
  • 我不确定为什么这是@ JaseC下面的答案似乎对我有用的答案.sudo bash myscript.sh正是我所寻找的,以及OP似乎要求的东西. (5认同)
  • 由于单词选择不正确,整个模棱两可的前提。“要在当前shell中执行shell脚本,我们需要使用一个句点”不,那个句点不执行,它会获取,插入,读取或解释。执行意味着完全不同的PID。因此,我们不清楚他们是否/为什么会关心当前外壳的PID。 (3认同)

lox*_*xxy 5

基本上sudo期望,一个可执行文件(命令)可以跟随并提供一个 .

因此错误.

试试这种方式 $ sudo setup.sh


  • 但是这需要setup.sh在PATH中. (2认同)