Linux中sudo的用法和配置方法
(2012-02-18 10:43:19)
标签:
linux中sudo的用法配置方法it |
分类: 操作系统 |
什么是sudo
sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具。
用户获取root特权的传统方式是以root身份登录或者输入一条su命令并输入root口令。当普通用户在图形界面环境下执行某一条享有特权的命令时,系统将提示用户输入root口令。
Ubuntu安装之后没有提供root口令,从而达到将root账号锁定的目的。这种设置能够阻止任何人以root账号登录(除非启动系统进入恢复模式)。然而,系统中确实存在root账号,这个账号/用户是一些文件的所有者(输入命令ls
sudo工具能够用来运行命令,就像以root身份运行该命令一样。
sudo的优势
n
n
n
n
sudo常见用法
选项 |
含义 |
作用 |
sudo |
Help |
列出使用方法,退出。 |
sudo |
Version |
显示版本信息,并退出。 |
sudo |
List |
列出当前用户可以执行的命令。只有在sudoers里的用户才能使用该选项。 |
sudo |
User |
以指定用户的身份执行命令。后面的用户是除root以外的,可以是用户名,也可以是#uid。 |
sudo |
Kill |
清除“入场卷”上的时间,下次再使用sudo时要再输入密码。 |
sudo |
Sure |
与-k类似,但是它还要撕毁“入场卷”,也就是删除时间戳文件。 |
sudo |
Background |
在后台执行指定的命令。 |
sudo |
Prompt |
可以更改询问密码的提示语,其中%u会代换为使用者帐号名称,%h会显示主机名称。非常人性化的设计。 |
sudo |
Edit |
不是执行命令,而是修改文件,相当于命令sudoedit。 |
如何配置sudo
配置sudo必须通过编辑/etc/sudoers文件,而且只有超级用户才可以修改它,还必须使用visudo编辑。之所以使用visudo有两个原因,一是它能够防止两个用户同时修改它;二是它也能进行有限的语法检查。所以,即使只有你一个超级用户,你也最好用visudo来检查一下语法。
visudo默认的是在vi里打开配置文件,用vi来修改文件。我们可以在编译时修改这个默认项。visudo不会擅自保存带有语法错误的配置文件,它会提示你出现的问题,并询问该如何处理,就像:
>>>
What
此时我们有三种选择:键入“e”是重新编辑,键入“x”是不保存退出,键入“Q”是退出并保存。如果真选择Q,那么sudo将不会再运行,直到错误被纠正。
现在,我们一起来看一下神秘的配置文件,学一下如何编写它。让我们从一个简单的例子开始:让用户foobar可以通过sudo执行所有root可执行的命令。以root身份用visudo打开配置文件,可以看到类似下面几行:
#
#
root
我们一看就明白个差不多了,root有所有权限,只要仿照现有root的例子就行,我们在下面加一行(最好用tab作为空白):
foobar
保存退出后,切换到foobar用户,我们用它的身份执行命令:
[foobar@localhost
ls:
[foobar@localhost
Password:
anaconda-ks.cfg
好了,我们限制一下foobar的权利,不让他为所欲为。比如我们只想让他像root那样使用ls和ifconfig,把那一行改为:
foobar
再来执行命令:
[foobar@localhost
Password:
Sorry,
[foobar@localhost
eth0
...
现在让我们来看一下那三个ALL到底是什么意思。第一个ALL是指网络中的主机,我们后面把它改成了主机名,它指明foobar可以在此主机上执行后面的命令。第二个括号里的ALL是指目标用户,也就是以谁的身份去执行命令。最后一个ALL当然就是指命令名了。例如,我们想让foobar用户在linux主机上以jimmy或rene的身份执行kill命令,这样编写配置文件:
foobar
但这还有个问题,foobar到底以jimmy还是rene的身份执行?这时我们应该想到了sudo
Defaults:foobar
Defaults后面如果有冒号,是对后面用户的默认,如果没有,则是对所有用户的默认。就像配置文件中自带的一行:
Defaults
另一个问题是,很多时候,我们本来就登录了,每次使用sudo还要输入密码就显得烦琐了。我们可不可以不再输入密码呢?当然可以,我们这样修改配置文件:
foobar
再来sudo一下:
[foobar@localhost
anaconda-ks.cfg
当然,你也可以说“某些命令用户foobar不可以运行”,通过使用!操作符,但这不是一个好主意。因为,用!操作符来从ALL中“剔出”一些命令一般是没什么效果的,一个用户完全可以把那个命令拷贝到别的地方,换一个名字后再来运行。