[ 分享 ]su 和 sudo 的不同

在下面的帖子的讨论中提到su和sudo的不同。

[ 已解决 ] 关于普通用户和 root 用户的命令不相同的问题

其中有说道说到sudo与su的命令差别可以更安全,但有人就说:能sudo不就是可以su了么?其实我原来也是这样想的。
我觉得这么不合理的现象不会出现才对。
于是我去研究了一下。发现果然并不是这样的!

具体详细的看下面。
wiki.archlinux.org/index.php/Sudo_%28%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%29#.E5.AF.86.E7.A0.81.E8.BF.87.E6.9C.9F.E6.97.B6.E9.97.B4

PS0:又一次验证了wiki的强大。

我来简单说一下

用下面命令可以打开配置文件,文件的路径是/etc/sudoers(注意需要root的)

visudo

会看到以下的内容。

Defaults !insults

Uncomment to enable logging of a command’s output, except for

sudoreplay and reboot. Use sudoreplay to play back logged sessions.

Defaults log_output

Defaults!/usr/bin/sudoreplay !log_output

Defaults!/sbin/reboot !log_output

In the default (unconfigured) configuration, sudo asks for the root password.

This allows use of an ordinary user account for administration of a freshly

installed system. When configuring sudo, delete the two

following lines:

Defaults targetpw
ALL ALL = (ALL) ALL

Runas alias specification

User privilege specification

root ALL = (ALL) ALL

看见那个

ALL     ALL = (ALL) ALL

了没有,

第一个ALL指所有用户
第二个ALL指所有主机
第三个括号里的ALL指的是以什么样的身份
第四个ALL指的是命令

简单举个例子

aman ALL=(root) /sbin/shutdown

的意思就是说aman用户可以在所有的主机上以root的身份运行/sbin里的shutdown命令

看上面的配置会发现默认所有用户都可以使用sudo

网上还有一种说法是把sudo开放个某个用户后,sudo后只要输入自己的密码就好了。
不知道别的发行版怎么样,反正openSUSE不是这样的。
也就是说你还是要输入root密码的。
那么还不是可以sudo就可以su。

其实细想以下你会发现,那个转化成自己密码的功能其实是多余的!
因为你是可以跳过密码认证的!

如下

aman ALL = (root) NOPASSWD:/sbin/shutdown

那么你就是只把shutdown这一个命令开放给了aman,不需要输入root密码。
就算aman把/sbin加入环境变量也没关系,(加入环境变量不需要root)。他同样只可以使用shutdown这一个命令。而保护了其他的权限。

PS1:顺便说说,关机命令shutdown和/sbin的问题。那么多关机命令到底选那个,理论上是shutdown是最安全的。但是他开放给多个用户就不安全了。
如果是个人使用的话把/sbin加入环境变量我觉得问题不大。其实在多用户的情况下就算不加入其他人也可以找到它的,关键是管理好权限,有了sudo以后,其实问题都可以很好地解决了。

PS2:一般的linux用户还是桌面用户为主,一般会感觉权限管理什么的其实没什么用。我的电脑我一个人用搞什么权限。我的意见是:你既然选择了学习linux这个操蛋的操作系统,干嘛不做得专业一点。

我记得 su 和 sudo 最大的区别是就 su 之后采用的就是 root 的环境配置,而 sudo 只是提升权限而采用仍是原来用户的环境配置。就好像有些程序 su 后可以运行,但是 sudo 就会报 display 错误之类的~如有错误,勿喷~

对的对的,我也看到这个的资料了。就在我给你那篇本论坛的帖子里貌似也有,本来想写进去。
su 不是可以加一个用户名参数么
用法:su 选项 ]… -] 用户 参数 ]… ]

可以这样的

su aman

然后输入密码(aman 的密码)
就是以 aman 的身份登录了,这个我觉得其实可以理解为以另外的身份登录,是整个和你有关的相关变量都变了(比如你 cd 一下,就是回到 aman 的主目录了,而不是你原来的)。这时在用户参数省缺时默认为 root 账户而已。说白了,root 也就是个账户罢了。

但是很多人在用 sudo 的时候遇到的问题是用 root 密码的而且不知道如何配置,这样所谓的暂时提升权限就没有意义了(从安全性来讲变得和 su 几乎没有差别了)。如果是多用户的话还是会把 root 密码泄露。我主要想讲这个。其实我觉得主要是权限的改变,环境配置什么的还不是很重要,比如 root 账户的 PATH 里有 /sbin ,一般的没有,可以改.bashrc 啊。而且都不需要 root 权限。

还有,谢谢你的评论。

In the default (unconfigured) configuration, sudo asks for the root password.

This allows use of an ordinary user account for administration of a freshly

installed system. When configuring sudo, delete the two

following lines:

Defaults targetpw # ask for the password of the target user i.e. root
ALL ALL=(ALL) ALL # WARNING! Only use this together with ‘Defaults targetpw’!

在/etc/sudoers里面可以找到这个.
应该是默认opensuse是开始时(用户没有自行配置sudo)所有的用户都可以用sudo这个命令的不过要求的密码是root的密码
其他的发行版本好像是一般用户是没有sudo的权限的.需要在

User privilege specification

root ALL=(ALL) ALL
这里添加的是个人用户的sudo权限

Uncomment to allow members of group wheel to execute any command

%wheel ALL=(ALL) ALL

这里添加的是用户组的sudo权限

添加完之后一般的用户就可以用sudo了.要求的输入是该用户的密码.这样子就可以执行一些超级用户的权限的一些命令

在/etc/sudoers把下面两行删除之后在opensuse下面应该是一般用户都用不了sudo的.必须要在sudoers里面添加之后才可以用sudo.而且要求的是该用户的自己的密码而不是root的密码
Defaults targetpw # ask for the password of the target user i.e. root
ALL ALL=(ALL) ALL # WARNING! Only use this together with ‘Defaults targetpw’!

至于添加用户到sudoer里面的方法和楼主说的一样的

这只是我自己的看书和自己试试之后了解到的一些东西.有错希望指出纠正

首先感谢评论。其实我也是在摸索中学习。大家可以交流一下,哈哈。

不好意思是我不严谨了,其实上面的 wiki 也有,我去试验一下,如果是对的话我就加到主贴里。

谢谢。

这是我删除了/etc/sudoers里面

Defaults targetpw # ask for the password of the target user i.e. root
ALL ALL=(ALL) ALL # WARNING! Only use this together with 'Defaults targetpw'!

这两句之后运行sodu的结果

teenvee@opensusu:~> sudo /sbin/shutdown 
teenvee's password:
teenvee 不在 sudoers 文件中。此事将被报告。

可以看到要求输入的密码不是再是root’s password而变成了该用户的password.
因为并没有把teenvee加到sudoers里面去.所以是无法正常使用sudo来执行一些要求管理员权限的命令的

好像有点不对,我的密码和root密码一样的,所以我又创了一个帐号aman。用了另外的密码。并把它添加进sudo组。

现在的关系是我们有三个帐号,root,nirvana(我的),aman(临时创建的)

我添加下面内容

Defaults targetpw # ask for the password of the target user i.e. root
aman ALL=(ALL) ALL # WARNING! Only use this together with ‘Defaults targetpw’!

(让aman以nirvana的身份运行shutdown命令)
aman@linux-nirvana:/home/nirvana> sudo -unirvana shutdown -k
nirvana’s password:

(省缺-u参数,则默认为以root身份)
aman@linux-nirvana:/home/nirvana> sudo shutdown -k
root’s password:

所以我理解的target user应该是括号里的用户(目标的用户嘛),也就是你暂时需要变成的那个用户。

我又试验了一下改为加入

Defaults rootpw # ask for the password of the target user i.e. root
aman ALL=(nirvana) ALL # WARNING! Only use this together with ‘Defaults targetpw’!

注意我把targetpw改为了rootpw
则会有下面输出

aman@linux-nirvana:/home/nirvana> sudo -unirvana shutdown -k
root’s password:

就是说你以nirvana的身份运行shutdown命令也需要root密码。

sudo也和su一样可以加用户参数。所以它不仅可以下放root的权限,其实还可以下放一些组管理原的权限。

这是我试验的结果。你的不一样么。

首先.这里先是指明一个问题

Defaults targetpw # ask for the password of the target user i.e. root
ALL ALL=(ALL) ALL # WARNING! Only use this together with 'Defaults targetpw'!

这两行是需要删除掉或是注释掉的.而并不是修改里面的内容

至于把用户添加到sudoers里面是去是在

## User privilege specification
##
root ALL=(ALL) ALL

这个下面添加
像是你这样子的话可以改成这样

1 aman ALL=(ALL) ALL

这样子的话aman这个账号应该是可以用sudo执行任何命令的
而nirvana是无法使用sudo.应该会和我测试的结果一样是显示
你可以试试.

sudo下放的权限是可以由管理员自己限定的
aman ALL=(ALL) “ALL” 双引号的这个字段可以限定出aman这个用户到底可以用sudo执行那些管理员权限命令.
你可以把一些命令写在这个字段授予aman以sudo方式运行

1赞

哦哦,我知道了,是

Defaults 这一行的问题,把这一行注释掉就可以了。

那就是有三种情况了。

Defaults rootpw 是输入 root 密码
Defaults targetpw 是输入转化方的密码
省缺的话就是输入用户自己的密码。

啊,谢谢。