外壳重定向

外壳重定向

有一些类似cdll的命令,如果我将它们运行为sudo,它们的执行就会“中断”。

sudo当命令前面有命令时,知道哪些命令会以这种方式“中断”的经验法则是什么?

这些数据可以帮助我和其他新手编写更稳定的脚本。

答案1

仅有的外部命令可以通过 运行sudo

须藤

该程序分叉(启动)一个新进程,以使用超级用户(或其他用户,如果使用sudo该选项)的有效权限启动外部命令。-u这意味着不能指定 shell 内部的命令;这包括 shell 关键字、内置命令、别名和函数。

查明某个命令是否可用作外部命令(而不是 shell 内部命令)的最佳方法是运行,type -a command_name它会显示包含指定可执行文件的所有位置。

示例 1:Shell 内置

在这种情况下,该cd命令只能作为 shell 内置命令使用:

$ type -a cd
cd is a shell builtin

当您尝试使用以下命令运行它时,它会失败sudo

$ sudo cd /
sudo: cd: command not found

示例 2:别名

在这种情况下,该ls命令是外部的 – 但在用户的 shell 中也创建了一个具有相同名称的别名。

$ type -a ls
ls is aliased to `ls -F --color'
ls is /bin/ls

如果我要运行sudo ls,它不会是作为超级用户运行的别名;如果我想要该-F选项,则必须将其显式包含为选项,即sudo ls -F.

示例 3:Shell 内置命令和外部命令

在这种情况下,该pwd命令作为 shell 内置命令和外部命令提供:

$ type -a pwd
pwd is a shell builtin
pwd is /bin/pwd

在这种情况下,外部/bin/pwd命令将运行sudo

$ sudo pwd
/home/anthony

通常作为 shell 内置命令和外部命令提供的命令的其他示例包括 killtest( [) 和echo

使用 sudo 运行内部 shell 命令

如果您确实想以超级用户权限运行内置 shell,则必须将 shell 作为外部命令启动。例如,以下命令bash以超级用户身份运行,并使用cd作为命令行选项提供的内置命令:

$ sudo bash -c "cd /; ls"
bin   etc   lib  media  mnt  ntp.peers  proc  sbin     share  sys
tmp  var boot  dev  home  lost+found  misc   net  opt … …

注意:别名不能使用其-c选项作为命令传递给 Bash。

外壳重定向

另一个需要注意的问题是 shell 重定向发生在当前 shell 的上下文中。如果我尝试跑步sudo /bin/echo abc > /test.file,那是行不通的。我明白了-bash: /test.file: Permission denied。虽然 echo 命令以超级用户权限运行,但它会将其输出打印到我当前的(非特权)shell,并且作为普通用户,我无权写入该/目录。

解决此问题的一种方法是使用sudo启动一个新的 shell(类似于上面的示例):

sudo bash -c "echo abc > /test.file"

在这种情况下,输出重定向发生在特权 shell 的上下文中(该 shell 确实具有写入权限/)。

tee另一个解决方案是以超级用户身份运行命令:

echo abc | sudo tee /test.file

答案2

cd或者ll不是一个程序,但实际上它是shell中的一个内置命令。您可以使用以下命令查看所有可用的内置命令。

复合基因-b

sudo不适用于所有这些命令。

答案3

ll不能与 sudo 一起使用,因为它是别名。别名不适用于 sudo,因为您无法使用 sudo 获得交互式 shell(除非特别要求)

cd情况不同,因为更改到没有 sudo 权限的目录是没有意义的。

按照建议许多内置命令不能与 sudo 一起使用,但其他命令可以,尤其是kill.您需要运行sudo kill <pid>来终止由与您不同的用户启动的进程。

相关内容