sudo命令情景分析

来自:hazirhtml

转载自:http://www.cnblogs.com/hazir/p/sudo_command.htmlshell

 

Linux 下使用 sudo 命令,可让普通用户也能执行一些或者所有的 root 命令。本文就对咱们经常使用到 sudo 操做情景进行简单分析,经过一些例子来了解 sudo 命令相关的技巧。vim

情景一:用户无权限执行 root 命令

普通用户登陆 shell 以后,若是自身没有权限访问某个文件或执行某个命令时,若该用户得到root受权,那么就能够在须要执行的命令以前加上 sudo,临时切换到root用户的权限,完成相关的操做。在sudo于1980年先后被写出以前,通常用户管理系统的方式是利用su切换为超级用户。可是使用su的缺点之一在于必需要先告知超级用户的密码,而sudo使通常用户不须要知道超级用户的密码便可得到权限。安全

那么哪些用户能够临时得到 root 权限呢?这就须要在 /etc/sudoers 文件中进行配置:bash

受权给单个用户:ide

# User privilege specification
guohl   ALL=(ALL) ALL

上面这个例子中:ui

  • guohl:容许使用 sudo 的用户名
  • ALL:容许从任何终端(任何机器)使用 sudo
  • (ALL):容许以任何用户执行 sudo 命令
  • ALL:容许 sudo 权限执行任何命令

若是咱们想让用户 test 只能在本主机(主机名为guohl-pc)以 root 帐户执行/bin/chown、/bin/chmod 两条命令,那么就应该这样配置:this

# User privilege specification
test   guohl-pc=(root) /bin/chown,/bin/chmod

若是test 登陆以后运行 sudo 命令,不知足上面三个条件命令均失败。spa

受权给用户组:debug

# Allow members of group sudo to execute any command
# (Note that later entries override this, so you might need to move it further down)
%sudo ALL=(ALL) ALL

和受权给单个用户相似,只不过将用户名在这里换成%组名,全部在该组中的用户都按照此规则进行受权。对于该例,全部在 sudo 组内的用户都有在任何终端(第一个ALL)、以任何用户(第二个ALL)、执行任何命令(第三个ALL)的权限,查看 /etc/group 文件能够知道哪些用户属于 sudo 组。

举例:

若是当前账号在 /etc/sudoers 文件中被授予 sudo 的权限,那么你就能够将任何 root 命令做为 sudo 命令的参数,使用 root 权限来执行该命令。举例来讲,挂载一个文件系统只能由 root 来执行,可是一个普通用户也可使用 sudo 来挂载:

$sudo mount /dev/sda7 /mnt
[sudo] password for guohailin:

首次使用会要求你输入当前用户的密码,系统确实输入正确即以 root 权限来执行 mount 命令,接下来一段时间(默认为5分钟)再次使用 sudo 命令就不须要输密码了。

情景二:vim 编辑后发现忘记使用 sudo

咱们常常会遇到这样的一个囧境:使用 vim 对某个文件进行编辑,编辑完以后,按 ESC 以后回到普通模式,再按 :wq 准备保存退出时,发现没有权限对该文件进行修改,咱们在使用 vim 命令时忘记在前面加 sudo 了。我就常常出现这种问题,以前的作法是只能不保存强退,再加上 sudo 从新编辑。

可是从此咱们不再须要用这么愚蠢的作法了,咱们能够在 vim 的普通模式下,按 :w !sudo tee % ,这样就能够 root 权限来保存文件了,你也无需由于本身一时忘记加个 sudo 而沮丧懊恼了!

情景三:执行 root 命令忘记加 sudo

咱们还会遇到这样稍微好一点的情形:输入一个长长的命令,按 Enter 以后出现无权限操做,由于咱们忘记加 sudo 了。大多人的作法是按  回到上一条命令,在该命令以前加上 sudo,再执行该命令。

之后,咱们无需这样了,只要输入 sudo !! 便可,这里的 !! 表明上一条命令。如:

$ head -n 4 /etc/sudoers
head: cannot open `/etc/sudoers' for reading: Permission denied

$ sudo !!
sudo head -n 4 /etc/sudoers
# /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#

情景四:shell 内置命令如何使用 sudo

shell 是一个交互式的应用程序,在执行外部命令时经过 fork 来建立一个子进程,再经过 exec 来加载外部命令的程序来执行,可是若是一个命令是 shell 内置命令,那么只能直接由 shell 来运行。sudo 的意思是,以别的用户(如root)的权限来 fork 一个进程,加载程序并运行,所以 sudo 后面不能跟 shell 的内置命令,如:

$ sudo cd /sys/kernel/debugfs
sudo: cd: command not found

在这种状况,咱们又没有 root 帐户的密码,咱们怎样执行该命令呢?有种办法就是使用 sudo 得到root shell 的权限,而后在root shell 中执行该命令。进入root shell 很简单,输入sudo bash 确认本用户的密码便可,此时你会发现命令提示符显示当前是 root。一旦得到root shell,你能够执行任何命令而不须要在每条命令前输入sudo了。

另外,经常使用的shell 内置命令在这里 有简单介绍,咱们可使用 type 命令来查看命令的类型,如:

$ type ls
ls is /bin/ls
$ type umask
umask is a shell builtin

情景五:sudo 操做记录日志

做为一个 Linux 系统的管理员,不只可让指定的用户或用户组做为root用户或其它用户来运行某些命令,还能将指定的用户所输入的命令和参数做详细的记录。而sudo的日志功能就能够用户跟踪用户输入的命令,这不只能增进系统的安全性,还能用来进行故障检修。可是要记录sudo的日志还要一些简单的配置:

  • 建立sudo日志文件
    咱们将sudo日志文件放置在 /var/log/sudo.log 文件中:

    $ sudo touch /var/log/sudo.log
  • 修改 /etc/rsyslog.conf 配置文件
    我使用系统为Ubuntu13.04 为更名字,但有些系统名为/etc/syslog.conf,注意不一样发行版之间的差异,在该文件加入下面一行:

    local2.debug    /var/log/sudo.log    #空白不能用空格,必须用tab
  • 修改 /etc/sudoers 配置文件
    注意网上不少关于sudo日志文件配置都缺乏这一步!在该文件中加入下面一行:
    Defaults    logfile=/var/log/sudo.log
  • 重启 syslog 服务:
    $ sudo service rsyslog restart
  • 查看 sudo 日志记录:
    通过上面的配置,sudo 的全部成功和不成功的sudo
    命令都记录到文件/var/log/sudo.log 中,例如我运行几条sudo 命令以后,查看该文件的记录以下:

    $ cat sudo.log 
      Sep 20 22:10:51 : guohailin : TTY=pts/1 ; PWD=/var/log ; USER=root ;
          COMMAND=/bin/cat /etc/sudoers
      Sep 20 22:11:36 : guohailin : TTY=pts/1 ; PWD=/var/log ; USER=root ;
          COMMAND=/usr/sbin/service rsyslog restart
      Sep 20 22:11:45 : guohailin : TTY=pts/1 ; PWD=/var/log ; USER=root ;
          COMMAND=/bin/ls
      Sep 20 22:12:08 : guohailin : TTY=pts/1 ; PWD=/var/log ; USER=root ;
          COMMAND=/bin/ls /root/
相关文章
相关标签/搜索