linux使⽤sudo命令,技术sudo⼊门指南
你在使⽤ Linux 命令⾏时曾经得到过“拒绝访问(Permission denied)”的错误提⽰吗?这可能是因为你正在尝试执⾏⼀个需要 root 权限的操作。例如,下⾯的截图展⽰了当我尝试复制⼀个⼆进制⽂件到⼀个系统⽬录时产⽣的错误。
那么该怎么解决这个错误?很简单,使⽤ sudo 命令。
⽤户运⾏此命令后会被提⽰输⼊他们(⾃⼰)的登录密码。⼀旦输⼊了正确的密码,操作将会成功执⾏。
毫⽆疑问,sudo 是任何在 Linux 上使⽤命令⾏的⼈都必须知道的命令。但是,为了更负责、更有效地使⽤该命令,你还是要知道⼀些相关(及深⼊)的细节。这正是我们将会在这篇⽂章中讨论的。
在我们继续之前,值得提⼀下的是,这篇⽂章所提到的所有命令指⽰都已经在 Ubuntu 14.04 LTS 下的 4.3.11 版 Bash 下通过测试。
什么是 sudo
正如你们⼤部分⼈所知道的,sudo ⽤来执⾏需要提升权限(通常是作为 root ⽤户)的命令。在这篇⽂章之前的简介部分已经讨论过这样的⼀个例⼦。然⽽,如果你想的话,你能⽤ sudo 以其它(⾮ root )⽤户运⾏命令。
这是由⼯具提供的 -u 命令⾏选项所实现的。举个例⼦,如下例所展⽰的那样,我(himanshu)尝试将⼀个在其他⽤户(howtoforge)的Home ⽬录中的⽂件重命名,但是得到⼀个“访问拒绝”的错误。然后我加上 sudo -u howtoforge 后⽤同样的“mv”命令,命令成功执⾏了:
任何⼈都能⽤ sudo 吗?
不是。⼀个⽤户要能使⽤ sudo ,应该在 /etc/sudoers ⽂件⾥有⼀条跟该⽤户相关的信息。下述摘⾃ Ubuntu ⽹站的⼀段能讲得更清楚:
/etc/sudoers ⽂件控制了谁能以哪个⽤户的⾝份在哪个机器上运⾏什么命令,还可以控制特别的情况,例如对于特定的命令是否需要输⼊密码。这个⽂件由别名aliases(基本变量)和⽤户标识user specifications(控制谁能运⾏什么命令)组成。
如果你正在使⽤ Ubuntu,让⼀个⽤户能运⾏ sudo 命令很容易:你所需要做的就是把账户类型改成管理员administrator。这可直接在 系统设置System Settings -> ⽤户账户User Accounts⾥完成。
⾸先解锁该窗⼝:
然后选择你想改变⽤户类型的⽤户,然后将类型改成管理员administrator。
然⽽,如果你不使⽤ Ubuntu,或者你的发⾏版没有提供这个特性,你可以⼿动编辑 /etc/sudoers ⽂件来实现此改变。要在⽂件中添加这样的⼀⾏:
[user] ALL=(ALL:ALL) ALL
⽆需赘⾔,[user] 应该⽤你想提升 sudo 权限的⽤户的⽤户名所代替。在这⾥值得提到的⼀件重要的事情是,官⽅建议通过 visudo 命令编辑该⽂件 —— 你需要做的就是运⾏下述命令:
sudo visudo
为了说清究竟是怎么⼀回事,这⾥有段从 visudo ⼿册⾥的摘要:
visudo 以安全的模式编辑 sudoers ⽂件。visudo 锁定 sudoers ⽂件以防多个编辑同时进⾏,提供基本的检查(sanity checks)和语法错误检查。如果 sudoers ⽂件现在正在被编辑,你将会收到⼀个信息提⽰稍后再试。
关于 visudo 的更多信息,前往这⾥。
什么是 sudo 会话
如果你经常使⽤ sudo 命令,你肯定注意到过当你成功输⼊⼀次密码后,可以不⽤输⼊密码再运⾏⼏次 sudo 命令。但是⼀段时间
后,sudo 命令会再次要求你的密码。
这种现象跟运⾏ sudo 命令数⽬⽆关,跟时间有关。是的,sudo 默认在输⼊⼀次密码后 15 分钟内不会再次要求密码。15 分钟后,你会再次被要求输⼊密码。
然⽽,如果你想的话,你能改变这种现象。⽤以下命令打开 /etc/sudoers ⽂件:
sudo visudo
到这⼀⾏:
Defaults env_reset
然后在这⾏最后添加以下变量:
Defaults env_reset,timestamp_timeout=[new-value]
[new-value] 为想要 sudo 会话持续的时间数。例如,设数值为 40。
如果你希望每次使⽤ sudo 命令时都要求输⼊密码,你可以把这个变量赋值为 0 。想要 sudo 会话永远不过时,应赋值为 -1。注意将 timestamp_timeout 的值赋为 “-1” 是强烈不推荐的。
sudo 密码
你可能注意过,当 sudo 要求输⼊密码然后你开始输⼊时,不会显⽰任何东西 —— 甚⾄连常规的星号都没有。虽然这不是什么⼤问题,不过⼀些⽤户就是希望显⽰星号。
好消息是那有可能也很容易做到。所有你需要做的就是在 /etc/sudoers ⽂件⾥将下述的⾏:
Defaults env_reset
改成
Defaults env_reset,pwfeedback
然后保存⽂件。
现在,⽆论什么时候输⼊ sudo 密码,星号都会显⽰。
⼀些重要的 sudo 命令⾏参数
除了 -u 命令⾏参数(我们已经在这篇教程的开始部分讨论过了),还有其他重要的 sudo 命令⾏参数值得注意。在这部分,我们将会讨论其中⼀些。
linux登录命令
-k 参数
考虑下这种情况:输⼊密码后你刚刚运⾏了⼏个 sudo 驱动的命令。现在,如你所知,sudo 会话默认保持 15 分钟。假设在这会话期间,你需要让某些⼈访问你的终端,但你不想让他们可以使⽤ sudo ,你将会怎么做?
还好,有 -k 命令⾏参数允许⽤户取消 sudo 权限。这是 sudo 帮助页⾯(man page)对此的解释:
-k, --reset-timestamp
不带任何命令使⽤时,撤销⽤户缓存的凭据。换句话讲,下⼀次使⽤ sudo 将会要求输⼊密码。使⽤这个参数不需要密码,也可以放到⼀个.logout ⽂件中来撤销 sudo 权限。
当与⼀个命令,或者⼀个可能需要密码的操作⼀起⽤时,这个参数将会导致 sudo 忽略⽤户缓存的凭据。结果是 sudo 要求输⼊密码(如果这是被安全策略所要求的),⽽且不会更新⽤户缓存的凭据。
-s 参数
有时你的⼯作要求你运⾏⼀堆需要 root 权限的命令,你不想每次都输⼊密码。你也不想通过改变 /etc/sudoers ⽂件调整 sudo 会话的过期时限。
这种情况下,你可以⽤ sudo 的 -s 参数。这是 sudo 帮助页⾯对此的解释:
-s, --shell
如果设置了 SHELL 环境变量或者调⽤⽤户的密码数据库指定了 shell,就运⾏该 shell 。如果指定了命令,命令将会通过 shell 的 -c 参数将命令传递给该 shell 执⾏。如果没有指定命令,会执⾏⼀个交互式 shell。
所以,基本上这命令参数做的是:
启动⼀个新的 shell - ⾄于是哪⼀个 shell,参照 SHELL 环境变量赋值。如果 $SHELL 是空的,将会⽤ /etc/passwd 中定义的 shell。
如果你⽤ -s 参数传递了⼀个命令名(例如 sudo -s whoami),实际执⾏的是 sudo /bin/bash -c whoami。
如果你没有尝试执⾏其他命令(也就是说,你只是要运⾏ sudo -s),你将会得到⼀个有 root 权限的交互式的 shell。
请记住,-s 命令⾏参数给你⼀个有 root 权限的 shell,但那不是 root 环境 —— 还是执⾏的你⾃⼰的 .bashrc 。例如,在 sudo -s 运⾏的新 shell ⾥,执⾏ whoami 命令仍会返回你的⽤户名,⽽⾮ root 。
-i 参数
-i 参数跟我们讨论过的 -s 参数相像。然⽽,还是有点区别。⼀个重要的区别是 -i 给你的是 root 环境,意味着你的(⽤户的).bashrc 被忽略。这就像没有显式地⽤ root 登录也能成为 root 。此外,你也不⽤输⼊ root ⽤户密码。
重要:请注意 su 命令也能让你切换⽤户(默认切换到 root )。这个命令需要你输⼊ root 密码。为了避免这⼀点,你可以使⽤ sudo 执⾏它(sudo su),这样你只需要输⼊你的登录密码。然⽽,su 和 sudo su 有隐含的区别 —— 要了解它们,以及它们和 sudo -i 的区别,请看这⾥ 。
总结
我希望现在你⾄少知道了 sudo 的基本知识,以及如何调整 sudo 的默认⾏为。请按我们解释过的那样去尝试调整 /etc/sudoers 。同时也浏览⼀下论坛讨论来更深⼊了解 sudo 命令。
本⽂由 LCTT 原创编译,Linux中国 荣誉推出

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。