摘自:http://www.cnblogs.com/hazir/p/sudo_command.html

sudo 命令情景分析

 

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

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

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

那么哪些用户可以临时获得 root 权限呢?这就需要在 /etc/sudoers 文件中进行配置:

授权给单个用户:

  1. # User privilege specification
  2. guohl ALL=(ALL) ALL

上面这个例子中:

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

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

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

如果test 登录之后运行 sudo 命令,不满足上面三个条件命令均失败。

授权给用户组:

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

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

举例:

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

  1. $sudo mount /dev/sda7 /mnt
  2. [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 !! 即可,这里的 !! 代表上一条命令。如:

  1. $ head -n 4 /etc/sudoers
  2. head: cannot open `/etc/sudoers' for reading: Permission denied
  3. $ sudo !!
  4. sudo head -n 4 /etc/sudoers
  5. # /etc/sudoers
  6. #
  7. # This file MUST be edited with the 'visudo' command as root.
  8. #

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

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

  1. $ sudo cd /sys/kernel/debugfs
  2. sudo: cd: command not found

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

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

  1. $ type ls
  2. ls is /bin/ls
  3. $ type umask
  4. umask is a shell builtin

情景五:sudo 操作记录日志

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

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

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

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

    1. $ cat sudo.log
    2. Sep 20 22:10:51 : guohailin : TTY=pts/1 ; PWD=/var/log ; USER=root ;
    3. COMMAND=/bin/cat /etc/sudoers
    4. Sep 20 22:11:36 : guohailin : TTY=pts/1 ; PWD=/var/log ; USER=root ;
    5. COMMAND=/usr/sbin/service rsyslog restart
    6. Sep 20 22:11:45 : guohailin : TTY=pts/1 ; PWD=/var/log ; USER=root ;
    7. COMMAND=/bin/ls
    8. Sep 20 22:12:08 : guohailin : TTY=pts/1 ; PWD=/var/log ; USER=root ;
    9. COMMAND=/bin/ls /root/

参考资料:

sodu 命令场景分析的更多相关文章

  1. mariadb 10 多源复制(Multi-source replication) 业务使用场景分析,及使用方法

    mariadb 10 多源复制(Multi-source replication) 业务使用场景分析,及使用方法 官方mysql一个slave只能对应一个master,mariadb 10开始支持多源 ...

  2. nice命令兼容性分析实例

    背景 产品实验室出现一例日志转储问题,经定位发现当前版本号没有提供nice命令,而cron拉起定时任务时,却调用了nice命令,对定时任务做优先级调整. 毫无疑问兴许版本号须要提供nice命令,可是是 ...

  3. JVM之调优及常见场景分析

    JVM调优 GC调优是最后要做的工作,GC调优的目的可以总结为下面两点: 减少对象晋升到老年代的数量 减少FullGC的执行时间 通过监控排查问题及验证优化结果,可以分为: 命令监控:jps.jinf ...

  4. TYPESDK手游聚合SDK服务端设计思路与架构之一:应用场景分析

    TYPESDK 服务端设计思路与架构之一:应用场景分析 作为一个渠道SDK统一接入框架,TYPESDK从一开始,所面对的需求场景就是多款游戏,通过一个统一的SDK服务端,能够同时接入几十个甚至几百个各 ...

  5. Oracle dbms_lock.sleep()存储过程使用技巧-场景-分析-实例

    <Oracle dbms_lock.sleep()存储过程使用技巧>-场景-分析-实例 摘要:今天是2014年3月10日,北京,雾霾,下午组织相关部门开会.会议的结尾一名开发工程师找到了我 ...

  6. 理解 python metaclass使用技巧与应用场景分析

    理解python metaclass使用技巧与应用场景分析       参考: decorator与metaclass:http://jfine-python-classes.readthedocs. ...

  7. 数据结构之链表C语言实现以及使用场景分析

    牢骚:本篇博客两个星期前已经存为草稿,鉴于发生一些糟糕的事情,今天才基本完成.本人6月份应届毕业生一枚,毕业后当天来到帝都,之后也非常顺利,面试了俩家公司都成功了.一家做C++方面电商ERP,一家做w ...

  8. ThreadLocal的理解与应用场景分析

    对于Java ThreadLocal的理解与应用场景分析 一.对ThreadLocal理解 ThreadLocal提供一个方便的方式,可以根据不同的线程存放一些不同的特征属性,可以方便的在线程中进行存 ...

  9. Java 常用List集合使用场景分析

    Java 常用List集合使用场景分析 过年前的最后一篇,本章通过介绍ArrayList,LinkedList,Vector,CopyOnWriteArrayList 底层实现原理和四个集合的区别.让 ...

随机推荐

  1. eclipse--java工程转web工程 以及 java或java web工程转maven工程

    1.  打开工程文件夹,编辑工程的.project文件. 在<natures></natures>中加入 <nature>org.eclipse.wst.commo ...

  2. 2017Unity开发者大会备受关注的原因有哪些?

    Unite大会是由Unity举办的全球开发者大会,至今已有10年的历史.从最开始Unity开发者大会仅500人,到现在Unity大会已经增长到5000人,10倍的参与人数,Unity开发者大会仅仅用了 ...

  3. Linux之定时任务

    定时任务Crond介绍 Crond是linux系统中用来定期执行命令/脚本或指定程序任务的一种服务或软件,一般情况下,我们安装完Centos5/6 linux操作系统之后,默认便会启动Crond任务调 ...

  4. Java Swing 图形界面实现验证码(验证码可动态刷新)

    import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Toolkit;import j ...

  5. [刷题]算法竞赛入门经典 3-10/UVa1587 3-11/UVa1588

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 题目:算法竞赛入门经典 3-10/UVa1587:Box 代码: //UVa1587 - Box #include&l ...

  6. 微信公众号开发《三》微信JS-SDK之地理位置的获取,集成百度地图实现在线地图搜索

    本次讲解微信开发第三篇:获取用户地址位置信息,是非常常用的功能,特别是服务行业公众号,尤为需要该功能,本次讲解的就是如何调用微信JS-SDK接口,获取用户位置信息,并结合百度地铁,实现在线地图搜索,与 ...

  7. Springboot(一):入门篇

    什么是spring boot spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员 ...

  8. 开源自己写的一个拖拽库,兼容到IE8+

    github地址:https://github.com/qiangzi7723/draggable 目前这个库的兼容做到了兼容IE8,所以如果需要兼容IE8的朋友不妨试试.库里面写了很多的注释,对于想 ...

  9. Linux 下按时间顺序批量删除文件

    ls -lrt| awk '{print $9}'| head -n 10 | xargs rm -rf 1.文件按时间排序: 2.获取文件名字: 3.取前10个文件 4.删除文件

  10. 关于volatile的一些理解

    什么是volatile?什么是可见性? volatile本意是易变的,就是说它修饰的变量可能经常被修改. 可见性就是说多线程访问一个共享变量的时候,任何的修改都会让所有的线程知道并且更新. 如何实现可 ...