深圳森焱咨询 發表於 2024-1-30 00:00:00

linux sudo命令详解

<p>
        简单的说,sudo 是一种权限管理机制,管理员可以授权于一些普通用户去执行一些 root 执行的操作,而不需要知道 root 的密码。</p>
<p>
        严谨些说,sudo 允许一个已授权用户以超级用户或者其它用户的角色运行一个命令。当然,能做什么不能做什么都是通过安全策略来指定的。sudo 支持插件架构的安全策略,并能把输入输出写入日志。第三方可以开发并发布自己的安全策略和输入输出日志插件,并让它们无缝的和 sudo 一起工作。默认的安全策略记录在 /etc/sudoers 文件中。而安全策略可能需要用户通过密码来验证他们自己。也就是在用户执行 sudo 命令时要求用户输入自己账号的密码。如果验证失败,sudo 命令将会退出。(注意,本文介绍的 sudo 命令运行在 ubuntu 14.04中。)</p>
<p>
        <span><strong>sudo 命令语法</strong></span></p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_552568">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash functions">sudo</code> <code class="bash plain">[-bhhpv][-s ][-u &lt;用户&gt;][指令]</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        或</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_641544">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash functions">sudo</code> <code class="bash plain">[-klv]</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        参数</p>
<p>
          -b  在后台执行指令。</p>
<p>
          -h  显示帮助。</p>
<p>
          -h  将home环境变量设为新身份的home环境变量。</p>
<p>
          -k  结束密码的有效期限,也就是下次再执行sudo时便需要输入密码。</p>
<p>
          -l  列出目前用户可执行与无法执行的指令。</p>
<p>
          -p  改变询问密码的提示符号。</p>
<p>
          -s  执行指定的shell。</p>
<p>
          -u  &lt;用户&gt;  以指定的用户作为新的身份。若不加上此参数,则预设以root作为新的身份。</p>
<p>
          -v  延长密码有效期限5分钟。</p>
<p>
          -v  显示版本信息。</p>
<p>
          -s  从标准输入流替代终端来获取密码</p>
<p>
        sudo 程序相关文件</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_821981">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">/etc/sudoers</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash plain">/etc/init</code><code class="bash plain">.d</code><code class="bash plain">/sudo</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="bash plain">/etc/pam</code><code class="bash plain">.d</code><code class="bash plain">/sudo</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="bash plain">/var/lib/sudo</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="bash plain">/usr/share/doc/sudo</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="bash plain">/usr/share/lintian/overrides/sudo</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="bash plain">/usr/share/bash-completion/completions/sudo</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="bash plain">/usr/bin/sudo</code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="bash plain">/usr/lib/sudo</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <strong>基本配置</strong></p>
<p>
        系统默认创建了一个名为 sudo 的组。只要把用户加入这个组,用户就具有了 sudo 的权限。<br>
        至于如何把用户加入 sudo 组,您可以直接编辑 /etc/group 文件,当然您得使用一个有 sudo 权限的用户来干这件事:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_689785">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">$ </code><code class="bash functions">sudo</code> <code class="bash plain">vim </code><code class="bash plain">/etc/group</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        在 sudo 组中加入新的用户,要使用逗号分隔多个用户。</p>
<p>
        <img title="linux sudo命令详解" alt="linux sudo命令详解" src="https://zhuji.jb51.net/uploads/img/202305/7cc37cc5585378302ee9f2535dfd48d8.jpg"></p>
<p>
        或者您可以使用 usermod 命令把用户添加到一个组中:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_800695">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">$ </code><code class="bash functions">sudo</code> <code class="bash functions">usermod</code> <code class="bash plain">-a -g </code><code class="bash functions">sudo</code> <code class="bash plain">jack</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        上面的设置中我们把用户 jack 添加到了 sudo 组中,所以当用户 jack 登录后就可以通过 sudo 命令以 root 权限执行命令了!</p>
<p>
        <strong>详细配置</strong></p>
<p>
        在前面的配置中我们只是把用户 jack 加入了 sudo 组,他就具有了通过 root 权限执行命令的能力。</p>
<p>
        现在我们想问一下,这是怎么发生的?是时候介绍如何配置 sudo 命令了!</p>
<p>
        sudo 命令的配置文件为 /etc/sudoers。(注意,/etc/sudoers 的配置内容十分丰富,我们仅做简单的介绍。要了解更多信息,请参考 man sudoers。)</p>
<p>
        编辑这个文件是有单独的命令的 visudo(这个文件我们最好不要使用 vim 命令来打开),是因为一旦你的语法写错会造成严重的后果,这个工具会替你检查你写的语法,这个文件的语法遵循以下格式:</p>
<p>
        who where whom command</p>
<p>
        说白了就是哪个用户在哪个主机以谁的身份执行那些命令,那么这个 where, 是指允许在那台主机 ssh 连接进来才能执行后面的命令,文件里面默认给 root 用户定义了一条规则:</p>
<p>
        root    all=(all:all)       all</p>
<p>
        root    表示 root 用户。</p>
<p>
        all     表示从任何的主机上都可以执行,也可以这样 192.168.100.0/24。</p>
<p>
        (all:all)   是以谁的身份来执行,all:all 就代表 root 可以任何人的身份来执行命令。</p>
<p>
        all     表示任何命令。</p>
<p>
        那么整条规则就是 root 用户可以在任何主机以任何人的身份来执行所有的命令。</p>
<p>
        现在我们可以回答 jack 为什么具有通过 root 权限执行命令的能力了。打开 /etc/sudoers 文件:</p>
<p>
        <img title="linux sudo命令详解" alt="linux sudo命令详解" src="https://zhuji.jb51.net/uploads/img/202305/245567efb23267dfecf568a550759f72.jpg"></p>
<p>
        sudo 组中的所有用户都具有通过 root 权限执行命令的能力!</p>
<p>
        再看个例子:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_408344">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">nick  192.168.10.0</code><code class="bash plain">/24</code><code class="bash plain">=(root) </code><code class="bash plain">/usr/sbin/useradd</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        上面的配置只允许 nick 在 192.168.10.0/24 网段上连接主机并且以 root 权限执行 useradd 命令。</p>
<p>
        <strong>设置 sudo 时不需要输入密码</strong></p>
<p>
        执行 sudo 命令时总是需要输入密码事件很不爽的事情(抛开安全性)。有些应用场景也需要在执行 sudo 时避开输入密码的交互过程。</p>
<p>
        那么需要如何设置呢?其实很简单,只需要在配置行中添加 nopasswd: 就可以了:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_690887">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">******  all=(all) nopasswd: all</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        再试试看,是不是已经不需要输入密码了?</p>
<p>
        <strong>sudo 的日志</strong></p>
<p>
        在 ubuntu 中,sudo 的日志默认被记录在 /var/log/auth.log 文件中。当我们执行 sudo 命令时,相关日志都是会被记录下来的。比如下图中显示的就是一次执行 sudo 命令的日志:</p>
<p>
        <img title="linux sudo命令详解" alt="linux sudo命令详解" src="https://zhuji.jb51.net/uploads/img/202305/95ccc1487212e2e9c6d8222923a84524.jpg"></p>
<p>
        以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。</p>
<p>
        原文链接:http://www.cnblogs.com/sparkdev/p/6189196.html</p>
頁: [1]
查看完整版本: linux sudo命令详解