![“sudo -s”命令的作用是什么?在本例中如何使用它?](https://linux22.com/image/1083038/%E2%80%9Csudo%20-s%E2%80%9D%E5%91%BD%E4%BB%A4%E7%9A%84%E4%BD%9C%E7%94%A8%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F%E5%9C%A8%E6%9C%AC%E4%BE%8B%E4%B8%AD%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E5%AE%83%EF%BC%9F.png)
我有以下疑问。在我正在遵循的与软件安装相关的教程中,说我必须执行以下命令(我正在将其执行到远程控制shell,因此此步骤列表以该exit
命令结尾):
sudo -s
apt-get update
apt-get install -y build-essential libtool libcurl4-openssl-dev libncurses5-dev libudev-dev autoconf automake screen
exit
我的疑问是:
-s
命令后面的参数到底起什么作用sudo
?
在网上搜索我发现:
‑s [命令] ‑s(shell)选项运行由 SHELL 环境变量指定的 shell(如果已设置)或密码数据库中指定的 shell。如果指定了命令,则该命令将通过 shell 的 ‑c 选项传递给 shell 执行。如果未指定命令,则执行交互式 shell
在我看来,sudo -s
使用 shell 的环境变量执行命令。
但这对我来说并不清楚:在这种情况下,使用环境变量执行的命令是什么?(它只执行sudo -s
而不是sudo -s [command]
)。
答案1
答案很简单,它为你提供了一个 root shell。这就是它在这里的用途。有一个很好的su
Unix.SE 上的、sudo -i
和方法sudo -s
之间的技术比较sudo su
但这实际上与此无关。代码可以使用任何方法,并且都可以正常工作。
这个帮助信息有以下几点含义:
它在环境变量中寻找命令
$SHELL
。如果你运行,echo $SHELL
你可能会看到/bin/bash
。这意味着你将获得 Bash 的根实例。我敢肯定,如果你在zsh
其中,这意味着你将获得 的根实例zsh
。如果
$SHELL
为空,它将恢复/etc/passwd
为该用户定义的默认 shell。如果你提供一个命令(例如
sudo -s whoami
),它实际上正在运行:sudo /bin/bash -c "whoami"
如果您不传递命令,它就不会传递参数
-c
,因此您只会获得一个交互式 shell。
我已经多次使用过“根”这个词。默认 sudo
就是以 root 身份运行程序,但sudo
(和 su) 可以以其他用户身份运行程序(如果您有权限这样做)。我只是为了那些会大喊这sudo -s -u $USER
没有给他们 root shell 的学究才说这些,正如我-s
上面承诺的那样。
在我的最卑微的意见认为,仅仅为了两个命令而成为 root 是非常愚蠢的,更不用说它可能会导致用户意外地以 root 身份运行更多命令。如果您想要或需要以 root 身份运行某些命令,只需在命令前面加上sudo
:
sudo apt-get update
sudo apt-get install -y build-essential libtool libcurl4-openssl-dev libncurses5-dev libudev-dev autoconf automake screen
我对任何建议获取 root shell 的教程都持怀疑态度,除非你确实有大量命令需要运行...即使在那时,也有脚本。
答案2
sudo -s
将像普通用户一样在当前目录中运行命令。例如:
rick@alien:~/askubuntu$ suspendtime
Nov 12 14:06:27 to Nov 12 17:22:21 lasting 11,754 seconds
Nov 12 22:23:37 to Nov 13 04:24:37 lasting 21,660 seconds
(... SNIP ...)
Dec 02 21:58:49 to Dec 03 04:20:52 lasting 22,923 seconds
Dec 03 05:52:43 to Dec 03 16:37:44 lasting 38,701 seconds
Linux uptime 1,859,356 seconds (21 days, 12 hours, 29 minutes, 16 seconds)
45 Suspends 1,173,341 seconds (13 days, 13 hours, 55 minutes, 41 seconds)
Real uptime 686,015 seconds (7 days, 22 hours, 33 minutes, 35 seconds)
rick@alien:~/askubuntu$ sudo suspendtime
sudo: suspendtime: command not found
rick@alien:~/askubuntu$ sudo -H suspendtime
sudo: suspendtime: command not found
rick@alien:~/askubuntu$ sudo -s suspendtime
Nov 12 14:06:27 to Nov 12 17:22:21 lasting 11,754 seconds
(...SNIP...)
Dec 03 05:52:43 to Dec 03 16:37:44 lasting 38,701 seconds
Linux uptime 1,859,431 seconds (21 days, 12 hours, 30 minutes, 31 seconds)
45 Suspends 1,173,341 seconds (13 days, 13 hours, 55 minutes, 41 seconds)
Real uptime 686,090 seconds (7 days, 22 hours, 34 minutes, 50 seconds)
当然,使用-s
而不是在命令前面加上前缀./
可能不会节省太多的时间。