有一些类似cd
或ll
的命令,如果我将它们运行为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 内置命令和外部命令提供的命令的其他示例包括 kill
、test
( [
) 和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>
来终止由与您不同的用户启动的进程。