在Linux命令行工作时,是否有“Permission denied”错误? 有可能您正在尝试执行需要root权限的操作。 例如,以下屏幕截图显示了当我尝试将二进制文件复制到其中一个系统目录时抛出的错误:
那么这个问题的解决方案呢? 简单,使用sudo命令。
运行命令的用户将被提示输入登录密码。 一旦输入正确的密码,操作将成功执行。
虽然sudo毫无疑问是任何和所有在Linux上的命令行工作的人都必须知道的命令,但还有其他一些相关(和深入的)细节,您应该知道,以便更加负责任地使用命令。 这正是我们将在本文中讨论的。
But before we move ahead, it's worth mentioning that all the commands and instructions mentioned in this article have been tested on Ubuntu 14.04LTS with Bash shell version 4.3.11.
什么是sudo?
sudo命令(大多数人可能已经知道)用于执行具有提升权限的命令(通常以root用户身份)。 我们已经在上面的介绍部分中讨论过一个例子。 但是,如果需要,您可以使用sudo执行命令作为其他(非root用户)用户。
这是通过工具提供的-u命令行选项来实现的。 例如,在下面的示例中,I(himanshu)尝试将某个其他用户(youcl)主目录中的文件重命名,但是有一个“权限被拒绝”错误。 然后我用'sudo -u youcl'尝试了同样的'mv'命令,命令是成功的:
任何用户可以使用sudo吗?
否。为了使用户能够使用sudo,与该用户相对应的条目应该在/ etc / sudoers文件中。 以下段落 - 从Ubuntu的网站 - 应该使它更清楚:
The /etc/sudoers file controls who can run what commands as what users on what machines and can also control special things such as whether you need a password for particular commands. The file is composed of aliases (basically variables) and user specifications (which control who can run what).
如果您正在使用Ubuntu,那么很容易确保用户可以运行sudo命令:您所要做的就是使该用户帐户类型为“管理员”。 这可以通过转到系统设置... - >用户帐户来完成。
解锁窗口:
然后选择要更改其帐户类型的用户,然后将类型更改为“ 管理员”
但是,如果您不在Ubuntu上,或者您的发行版不提供此功能,则可以手动编辑/ etc / sudoers文件进行更改。 您需要在该文件中添加以下行:
[user] ALL=(ALL:ALL) ALL
不用说,[user]应该被您授予sudo权限的帐户的用户名替换。 值得一提的一件重要的事情是,正式建议的编辑此文件的方法是通过visudo命令 - 您只需运行以下命令即可:
sudo visudo
为了给你一个想法,为什么是这样的情况,这里是从visudo手册摘录:
visudo edits the sudoers file in a safe fashion. visudo locks the sudoers file against multiple simultaneous edits, provides basic sanity checks, and checks for parse errors. If the sudoers file is currently being edited you will receive a message to try again later.
有关visudo的更多信息,请来这里 。
什么是sudo会话?
如果您经常使用sudo命令,我相信您会注意到,一次成功输入密码后,您可以运行多个sudo命令,而不会提示输入密码。 但有一段时间后,sudo命令再次请求您的密码。
此行为与您运行的sudo-powered命令的数量无关,而是依赖于时间。 是的,默认情况下,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'。
请注意,强烈建议不要使用值为-1的timestamp_timeout。
sudo密码
正如您可能已经观察到的,每当sudo提示您输入密码并开始输入密码时,都不会出现 - 甚至没有星号通常是常规。 虽然这不是一个很大的一般,一些用户可能希望有星号显示任何原因。
好的是,这是可能的,很容易做到。 所有你需要做的是更改/ etc / sudoers文件中的以下行:
Defaults env_reset
至
Defaults env_reset,pwfeedback
并保存文件。
现在,每当你输入sudo密码,星号都会显示出来。
一些重要的sudo命令行选项
除了-u命令行选项(我们已经在本教程开头讨论过),还有一些其他重要的sudo命令行选项值得一提。 在本节中,我们将讨论其中的一些。
-k选项
考虑一个情况,在输入密码后,您刚刚运行sudo命令。 现在,您已经知道,默认情况下,sudo会话保持活动15分钟。 假设在这个会话期间,你必须让某人访问你的终端,但你不希望他们能够使用sudo。 你会怎么做?
幸运的是,存在一个命令行选项-k ,允许用户撤销sudo权限。 以下是sudo手册页面对此选项的说明:
-k, --reset-timestamp
When used without a command, invalidates the user's cached credentials. In other words, the next time sudo is run a password will be required. This option does not require a password and was added to allow a user to revoke sudo permissions from a .logout file.
When used in conjunction with a command or an option that may require a password, this option will cause sudo to ignore the user's cached credentials. As a result, sudo will prompt for a password (if one is required by the security policy) and will not update the user's cached credentials.
-s选项
有时候,您的工作需要您运行一大堆需要root权限的命令,您不需要随时输入sudo密码。 此外,您不想通过更改/ etc / sudoers文件来调整sudo会话超时限制。
在这种情况下,您可能希望使用sudo命令的-s命令行选项。 这是sudo手册页面如何解释:
-s, --shell
Run the shell specified by the SHELL environment variable if it is set or the shell specified by the invoking user's password database entry. If a command is specified, it is passed to the shell for execution via the shell's -c option. If no command is specified, an interactive shell is executed.
所以基本上这个命令行选项是:
- 启动一个新的shell - 对于哪个shell,引用了SHELL env变量。 如果$ SHELL为空,则/ etc / passwd文件中定义的shell被拾取。
- 如果您还传递命令名称以及-s选项(例如: sudo -s whoami ),那么执行的实际命令是: sudo / bin / bash -c whoami。
- 如果您不尝试执行任何其他命令(意思是您只是尝试运行sudo -s ),那么您将获得具有root权限的交互式shell。
这里值得一提的是, -s命令行选项为您提供了具有root权限的shell,但是您没有获得根环境 - 这是您的.bashrc。 这意味着,例如,在运行sudo -s的新shell中,执行whoami命令仍然会返回您的用户名,而不是“root”。
-i选项
-i选项与我们刚才讨论的-s选项类似。 但是,有一些区别。 其中一个主要区别在于-i还为您提供根环境,这意味着您的(用户).bashrc被忽略。 这就像成为root而不显式地以root身份记录。 此外,您还不必输入root用户的密码。
重要提示 :请注意,存在一个su命令,还可以切换用户(默认情况下,它可以让您成为root用户)。 此命令要求您输入“root”密码。 为了避免这种情况,你也可以用sudo('sudo su')执行它 在这种情况下,您只需输入登录密码即可。 但是,“su”和“sudo su”有一些根本的区别 - 要了解他们,以及更多地了解“sudo -i”与他们的比较。
结论
我希望现在你至少可以得到sudo背后的基本思想,以及你如何调整它的默认行为。 请尝试我们在这里解释的/ etc / sudoers调整,还可以通过论坛讨论(在最后一段中链接),以获得有关sudo命令的更多信息。