为什么我没有“su”的密码?“sudo”的问题

Sta*_*ers 36 sudo chmod

我已经使用 GUI 安装了 Ubuntu,给自己一个密码和所有东西。我不记得复杂的过程。但是,让我担心的是我不知道以下密码:

$ su
Password: <the only password I've ever created on this machine>
su: Authentication failure
Run Code Online (Sandbox Code Playgroud)

我只是不知道该怎么办。我没有遇到麻烦,但我只是想知道这里发生了什么。我还可以将自己锁定在目录之外:

starkers@ubuntu:~/Desktop$ mkdir foobs
starkers@ubuntu:~/Desktop$ sudo chmod 777 -R foobs
sudo: /var/lib/sudo writable by non-owner (040777), should be mode 0700
[sudo] password for starkers: <the only password I've ever created on this machine> 
starkers@ubuntu:~/Desktop$ cd foobs
bash: cd: foobs: Permission denied
Run Code Online (Sandbox Code Playgroud)

我只是有点困惑。我怎么能像这样把自己锁在外面?我认为sudo是这里的关键命令。但是我正在通过 将foobs文件尽可能打开chmod,那么为什么它会将我锁定?

tho*_*ter 69

1. 为什么你没有root密码

虽然您可以为超级用户帐户创建一个密码,允许您使用 以 root 身份登录su,但值得一提的是,这不是 Ubuntu(或越来越多的其他发行版)的常用方法。出于某种原因,Ubuntu默认选择提供 root 登录名和密码。相反,默认的 Ubuntu 安装将用于sudo授予超级用户权限。在默认的 Ubuntu 安装中,安装操作系统的人默认被授予“sudo”权限。

任何拥有完全“sudo”权限的人都可以通过预先挂起sudo他们的命令来“作为超级用户”执行某些操作。例如,要apt-get dist-upgrade以超级用户身份运行,您可以使用:

sudo apt-get dist-upgrade
Run Code Online (Sandbox Code Playgroud)

您几乎可以在网上阅读有关 Ubuntu 的教程的任何地方看到 sudo 的这种用法。这是执行此操作的替代方法。

su
apt-get dist-upgrade
exit
Run Code Online (Sandbox Code Playgroud)

使用 sudo,您可以提前选择哪些用户具有 sudo 访问权限。他们不需要记住 root 密码,因为他们使用自己的密码。如果您有多个用户,您可以通过删除他们的 sudo 权限来撤销一个超级用户的访问权限,而无需更改 root 密码并通知每个人新密码。您甚至可以选择允许用户使用 sudo 执行哪些命令以及禁止该用户执行哪些命令。最后,如果存在安全漏洞,在某些情况下它可以留下更好的审计跟踪,显示哪个用户帐户被盗。

Sudo 使使用超级用户权限执行单个命令变得更容易。使用su,您将永久下降到必须使用exit或退出的超级用户外壳logout。这可能会导致人们在超级用户 shell 中停留的时间超过必要的时间,因为它比稍后注销和再次登录更方便。

使用 sudo,您仍然可以选择使用以下命令打开永久(交互式)超级用户 shell:

sudo su
Run Code Online (Sandbox Code Playgroud)

...并且这仍然可以在没有任何 root 密码的情况下完成,因为sudosu命令授予超级用户权限。

同样,su -您可以使用sudo su -或其快捷方式代替登录外壳sudo -i

但是,这样做时,您只需要注意您是作为每个命令的超级用户。一个很好的安全原则是不要作为超级用户停留超过必要的时间,只是为了减少意外对系统造成某些损坏的可能性(没有它,您只能损坏用户拥有的文件)。

只是为了澄清,如果您选择这样做,您可以为 root 用户提供一个密码,允许以 root 身份登录,如@Oli 的回答中所述,如果您特别想以这种方式进行操作。我只是想让你知道 Ubuntu 的首选约定,sudo并让你知道有一个替代方案。


2. chmod 777 -R 命令的问题

您的问题还有第二部分:您对命令的问题sudo chmod 777 -R foobs

首先,以下警告表明您的机器存在潜在的严重安全问题:

sudo: /var/lib/sudo writable by non-owner (040777), should be mode 0700
Run Code Online (Sandbox Code Playgroud)

这意味着在某个阶段,您已设置/var/lib/sudo为可全局写入。我想您已经在某个阶段使用类似sudo chmod 777 -R /. 不幸的是,通过这样做,您可能几乎破坏了整个系统中的所有文件权限。这不太可能是唯一一个权限已更改为全球可写的重要系统文件。从本质上讲,您现在拥有一个易于破解的系统,而恢复它的唯一简单方法就是重新安装。

其次,您使用的命令:

sudo chmod 777 -R foobs
Run Code Online (Sandbox Code Playgroud)

在您的主目录中操作文件时,在这种情况下~/Desktop,您不应该使用sudo. 无论如何,您在主目录中创建的所有文件都应该可以由您修改(如果不是,则发生了一些有趣的事情)。

此外,您需要充分了解集体更改文件权限的后果,例如递归执行或对大量文件执行此操作。在这种情况下,您将仔细设置文件权限更改为全球可写。任何其他用户或机器上的任何有问题的服务器软件都可以轻松访问以覆盖所有这些文件和目录。

几乎可以肯定,对于您尝试解决的任何问题,chmod 777 -R [dir]都不是合适的解决方案(正如我上面提到的,有证据表明您也对 /var/lib 中的系统文件进行了处理,我假设还有很多其他问题)地方)。

一些基本的经验法则:

  • 如果您只是在自己的主目录、桌面等中处理自己的文件,则永远不需要使用sudo权限或超级用户权限。如果你这样做了,这是一个警告信号,表明你做错了什么。

  • 您永远不应该手动修改包所拥有的系统文件。例外:除非您专门按照这些包记录的方式执行此操作,例如通过在/etc. 这也适用于更改文件权限。如果教程或解决问题的尝试需要sudo超级用户权限,并且它不仅仅是对 /etc/ 中的配置的更改,那么这是一个警告信号,表明您做错了什么。

  • 我认为“sudo -i”是获取root shell的“官方”方式,而不是“sudo su” (7认同)
  • 是的,你应该在 `sudo su` 上使用 `sudo -i`。 (3认同)

小智 52

默认情况下,超级用户 ( root) 帐户被禁用并且没有任何密码。您可以通过运行来创建一个:

$ sudo passwd root
Run Code Online (Sandbox Code Playgroud)

然后,您将能够通过su使用此密码以 root 身份登录。

至于chmod,正确的命令是:

$ chmod 777 -R foobs
Run Code Online (Sandbox Code Playgroud)

您还可以使用:

$ sudo -i
Run Code Online (Sandbox Code Playgroud)

使用您的密码以 root 身份登录(无需如上所述创建 root 密码)。

  • 不要设置root密码。*不要*设置root密码。 (20认同)
  • 不要使用`sudo su`,因为它会破坏环境并且事情会破裂。而是使用`sudo -i`。 (13认同)
  • @Oli 也许您可以编辑您的问题以添加“sudo su”。这也赋予了终端永久的 su 权限。 (4认同)
  • chmod 777 几乎总是坏的(粘性位除外;与 /tmp 一起使用)。这个答案存在安全风险。另外,设置 root 密码不是 Ubuntu 应该使用的方式;再次引发安全风险。请遵循 neon_overload 的回答。 (4认同)
  • @WChargin 为什么不建议使用 root 帐户/密码?作为 archlinux 用户,我真的很好奇。 (4认同)
  • @Rob `root` 通常只推荐用于执行管理功能的用户(在类似 rhel 的东西上比在 ubuntu 上更常见)。`sudo` 相对于 `su` 的好处在很大程度上是用户不会养成在 root shell(这是一个安全问题)或图形 root 环境(这是一个巨大的安全问题)。但是,root 比用户帐户更容易受到攻击,也就是说,假设您有一个没有防火墙的 ssh 守护进程正在运行。我可以运行 `ssh root@yoursystem`,但我无法在不弄清楚 `you` 的情况下运行 `ssh you@yoursystem`。 (3认同)