操作系统如何知道命令需要sudo?


16
  1. 当您运行可执行文件时,有时操作系统会拒绝您的许可。例如make install,将需要使用前缀作为系统路径运行sudo,而不需要前缀作为非系统路径运行sudo。操作系统如何确定甚至在程序执行某项操作之前,运行可执行文件将需要比用户更多的特权?
  2. 有时,运行程序不会被拒绝,但如果运行,它将能够做更多的事情sudo。例如,du在某个系统目录上运行时,只有使用 sudo它才能访问某个目录。为什么在程序可以运行之前,操作系统为何不拒绝运行此类程序的权限,或者优先选择友好通知更多特权?
  3. 的确,无论何时sudo工作,su也将工作,而无论何时su工作,sudo也将工作?还是与之相比su,用户可以做更多的事情sudo?操作系统如何确定何时sudo工作以及何时su需要?

这个问题是否已为您解答,或者您想了解更多信息?
ctrl-alt-delor 2016年

Answers:


14
  1. 例如,有时“权限被拒绝”消息是由于文件系统权限拒绝您进行写访问而导致的。可执行文件/工具仅检查文件系统是否授予您足够的权限来执行您将要执行的操作,如果文件系统拒绝了它,则会抛出错误。在其他时候,该工具本身会在允许您继续使用之前检查您的用户ID。
  2. sudo您一起运行程序时,将以其他用户名运行该程序。如果该用户比您的用户“能够做更多的事情”,并且sudo配置允许您代表其他用户做这些事情,那么可以,sudo您将可以做更多的事情。但是,这不是必需的。如果您只是sudo在命令行的开头进行操作,则实际上是sudo在使用root,因此通常您可以完成的工作不仅仅是凡人。
  3. 绝对不是。要使用sudo该密码,您需要提供自己的用户密码,然后才可以代表目标用户执行某些操作。要使用su,您需要目标用户的密码,如果拥有密码,就系统而言,您将成为该目标用户,并且可以执行该用户可以执行的任何操作。

也可以看看


谢谢。是“文件系统许可权拒绝您写访问权” =“文件的访问模式没有为用户设置执行位,可以由chmod设置”?
2014年

1
@Tim实际上它=“文件的访问模式没有为用户设置位”。是的,chmod如果您是文件的所有者或,当然可以解决此问题root
Joseph R.

是否需要sudo,是否完全取决于是否未为用户设置执行位?请参见unix.stackexchange.com/q/147052/674
全部

@Tim显然,您首先需要执行位才能运行可执行文件。
Joseph R.

1
@JosephR。不明显。chmod 400 hello && /lib64/ld-linux-x86-64.so.2 ./hello产生一个很好的“ Hello,World!” 输出。
doneal24

24

出于您描述的目的,操作系统不会决定您是否需要sudo才能初始运行该程序。相反,在程序开始运行并尝试执行当前用户不允许执行的操作(例如编写文件/usr/bin以安装新命令)之后,操作系统将阻止文件访问。在这种情况下要采取的措施取决于程序。make停止运行,但du在打印消息后将继续下一个文件/目录。

susudo命令运行具有root权限的程序的两种不同的方式。根据使用的选项,它们的细微差别可能会有所不同,例如启动新程序时环境的内容。操作系统无需决定何时可以工作。


6

su并且sudo是特权程序。 su(在成功认证之后)将实际有效的用户和组ID更改为您su要使用的用户和组的ID 。因此,su类似于login。请注意,su可用于更改为任何用户,而不仅仅是root用户。 sudo还更改了真实有效的用户和组ID。到目前为止susudo它们是相似的(但不相关),除此之外,它们是非常不同的。

使用su,您需要知道目标的密码,并且在通过身份验证后,可以以该用户身份执行任何操作。采用su可以通过设置限制SU_WHEEL_ONLY/etc/login.defs。如果已设置,则只有该组中的用户wheel可以使用su,否则不受限制。除此之外,su是全部还是全部。

sudo与此完全不同。使用sudoer(调用的用户),sudo您可以定义非常复杂的策略。例如,您可以定义策略,其中某些用户只能以某些特权运行某些程序,而其他用户可以以其他特权运行其他程序。/etc/sudoerssudo

的显着特征之一sudo是您可以对其进行配置,以使用户必须使用自己的密码(而不是目标密码)对自己进行身份验证。因此,它sudo已在管理员中变得越来越流行,因为它允许授权用户仅执行定义的特权操作而无需分配超级用户密码,此外您还获得了一定程度的责任感。


2

tl; dr访问由运行应用程序的用户确定,并且sudo以不同的用户身份运行应用程序。

完整版:

操作系统如何知道命令需要sudo?

不知道 UNIX不在应用程序级别而是在文件系统级别管理权限:授予用户访问特定文件的权限。然后,代表用户运行应用程序-每个正在运行的进程都有与之关联的用户。该用户用于确定该应用程序的权限。Sudo的工作方式是代表其他用户(具有与该其他用户相关联的权限)运行应用程序,即root超级。

至于你的例子:

  1. 如果用户对特定目录具有写访问权,则可以make install进入该目录。否则,他们可能root会这样做-通过使用sudo

  2. 如果您无法访问目录中的文件,则du正在运行的文件也无法访问它。root几乎可以访问每个文件,因此sudo dudu代表root)可以访问它们。

难道每当sudo起作用时su也会起作用,而每当su起作用时sudo也会起作用?

是的,没有。是的,如果程序实际上在运行,则它在sudo和下都应该表现相同su。但是,sudo通过/etc/sudoers文件中存储的一组规则,提供可以更精细地控制谁可以运行哪些内容。su更简单-如果您知道目标用户的密码,则可以代表该用户运行程序。

最后说明:应用程序如何处理拒绝访问(终止或忽略或警告用户的方式)取决于应用程序。


1

还没有人可以提供✓,因此我整理了一个可以想到的一切答案。

1运行可执行文件时,有时操作系统会拒绝您的许可。例如,以前缀为系统路径运行make install将需要sudo,而以前缀为非系统路径运行时将不需要sudo。操作系统如何确定甚至在程序执行某项操作之前,运行可执行文件将需要比用户更多的特权?

不,启动可执行文件时未完成。当可执行文件尝试执行某项操作时,此操作完成。

操作系统将检查文件系统权限和功能(文件系统权限未涵盖这些功能,包括降低级别,mknode,一些低级网络内容,杀死其他进程,重启,设置时间等)。如果您没有权限,则不能这样做。根具有全部功能,包括CAP_DAC_OVERRIDE(忽略文件许可权)。

2有时,运行程序不会被拒绝权限,但是如果使用sudo运行该程序,它将能够执行更多操作。例如,在某个系统目录上运行du时,只有使用sudo才能访问某个目录。为什么在程序可以运行之前,操作系统为何不拒绝运行此类程序的权限,或者优先选择友好通知更多特权?

操作系统无法知道该程序将执行的操作。因此,程序要在启动之前检查权限,然后决定要做什么。它不必这样做。

注意:在android上有一个清单,应用程序在其中声明它可以使用的特权。操作系统将终止任何尝试使用未声明的特权的应用程序,并且操作系统并不总是保证可以尊重特权。例如,网络访问可能不可用。

2是否确实在每当sudo起作用时su也将起作用,而每当su起作用时sudo也将起作用?还是使用su,用户可以用sudo做更多的事情?操作系统如何确定何时使用sudo以及何时需要su?

sudosu做大致相同的事情。一些区别是环境变量处理和其他避免此类安全问题。但是,它们都是允许您成为另一个用户的工具,并且都有默认的root用户。

su 是原始工具,它要求您输入要更改为的用户/组的密码。

sudo是较新的版本,默认情况下要求您输入自己的密码,但可以将其配置为接受要切换到的用户/组的密码,或者根本不输入密码。它还允许进行大量配置,将使用哪些命令,针对谁以及如何使用此程序对此机器上的该用户进行身份验证。还有sudoedit这是一部分sudo,可以用来允许编辑为不同的用户,并避免(从编辑器调用exec运行具有升级权限的任意进程)子脱壳编辑出来的安全问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.