当前位置: 首页 > 科技观察

sudo命令:解决使用Linux命令行时的报错

时间:2023-03-18 00:38:32 科技观察

你有没有遇到过使用Linux命令行时出现“Permissiondenied”的错误信息?这可能是因为您正在尝试执行需要root的命令。经营许可。例如,下面的屏幕截图显示了当我尝试将二进制文件复制到系统目录时出现的错误。shell的访问被拒绝那么如何解决这个错误呢?很简单,使用sudo命令。使用sudo运行命令运行此命令后,系统将提示用户输入他们(自己的)登录密码。输入正确的密码后,操作将成功执行。毫无疑问,sudo是任何使用Linux命令行的人都必须知道的命令。但是,为了更负责任和更有效地使用此命令,您仍然需要了解一些相关(和深入)的细节。这正是我们将在本文中讨论的内容。在我们继续之前,值得一提的是,本文中提到的所有命令指令都已在Ubuntu14.04LTS下使用Bash版本4.3.11进行了测试。什么是sudo正如大多数人所知,sudo用于执行需要提升权限(通常以root用户身份)的命令。本文前面的介绍部分讨论了一个这样的例子。但是,如果需要,您可以使用sudo作为其他(非root)用户运行命令。这是通过该工具提供的-u命令行选项实现的。例如,如下例所示,我(himanshu)试图重命名另一个用户(howtoforge)主目录中的文件,但出现“拒绝访问”错误。然后我添加了sudo-uhowtoforge后跟相同的“mv”命令并且命令成功执行:什么是sudo任何人都可以使用sudo吗?没有。对于能够使用sudo的用户,/etc/sudoers文件中应该有该用户的条目。下面摘自Ubuntu网站可以说得更清楚:/etc/sudoers文件控制谁可以在哪台机器上以哪个用户运行什么命令,也可以控制特殊情况,比如特定命令是否需要输入密码。该文件由别名(基本变量)和用户规范(控制谁可以运行什么命令)组成。如果您使用的是Ubuntu,让用户运行sudo命令很容易:您需要做的就是将帐户类型更改为管理员。这可以直接在系统设置->用户帐户中完成。sudo用户先解锁窗口:解锁窗口然后选择你要更改用户类型的用户,然后将类型更改为administrator管理员。选择sudo帐户但是,如果您不使用Ubuntu,或者您的发行版不提供此功能,您可以手动编辑/etc/sudoers文件以进行此更改。要在文件中添加这样一行:[user]ALL=(ALL:ALL)ALL不用说,[user]应该替换为您要提升其sudo权限的用户的用户名。这里值得一提的一件重要事情是,官方建议通过visudo命令编辑文件-您需要做的就是运行以下命令:sudovisudo要阐明这里发生的事情,请参阅visudo手册摘要:visudo在安全模式下编辑sudoers文件。visudo锁定sudoers文件以防止同时编辑,提供基本的完整性检查和语法错误检查。如果当前正在编辑sudoers文件,您将收到一条消息,请稍后重试。有关visudo的更多信息,请访问此处。什么是sudosession如果你经常使用sudo命令,你一定注意到了,当你成功输入一次密码后,你可以在不输入密码的情况下多次运行sudo命令。但是一段时间后,sudo命令会再次询问您的密码。这种现象与运行sudo命令的次数无关,与时间有关。是的,sudo默认情况下在输入一次密码后15分钟内不再要求输入密码。15分钟后,系统会要求您再次输入密码。但是,您可以根据需要更改此设置。使用以下命令打开/etc/sudoers文件:sudovisudo找到这一行:Defaultsenv_resetenv_reset然后将以下变量添加到这一行***:Defaultsenv_reset,timestamp_timeout=[new-value][new-value]是你的次数希望sudo会话持续。例如,将该值设置为40。sudo超时值如果您想在每次使用sudo命令时都要求输入密码,则可以将此变量的值设置为0。如果您希望sudo会话永不过时,您应该指定一个值-1。请注意,强烈建议不要分配“-1”的timestamp_timeout值。sudo密码您可能已经注意到,当sudo要求输入密码并且您开始输入密码时,什么也没有显示——甚至连常规的星号也没有。虽然这没什么大不了的,但有些用户只是希望星号出现。好消息是这是可能的,而且很容易做到。您所要做的就是更改/etc/sudoers文件中的以下行:Defaultsenv_reset为Defaultsenv_reset,pwfeedback并保存文件。现在,无论何时输入sudo密码,星号都会出现。隐藏sudo密码一些重要的sudo命令行参数除了-u命令行参数(我们已经在本教程开头讨论过)之外,还有其他一些重要的sudo命令行参数值得注意。在本节中,我们将讨论其中的一些。-k参数考虑了这种情况:您只是在输入密码后运行了几个sudo驱动的命令。现在,如您所知,sudo会话默认保留15分钟。假设您需要在此会话期间允许某人访问您的终端,但您不希望他们能够使用sudo,您会怎么做?幸运的是,有-k命令行参数可以让用户撤销sudo权限。以下是sudo手册页对此的解释:-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-swhoami),那么实际执行的是sudo/bin/bash-cwhoami。如果您不尝试执行其他命令(也就是说,如果您只是运行sudo-s),您将获得一个具有root权限的交互式shell。请记住,-s命令行参数为您提供了一个具有root权限的shell,但那不是root环境——您自己的.bashrc仍在执行。例如,在使用sudo-s运行的新shell中,执行whoami命令仍将返回您的用户名,而不是root。-i参数-i参数类似于我们讨论的-s参数。但是,还是有区别的。一个重要的区别是-i为您提供根环境,这意味着您(用户)的.bashrc将被忽略。这就像成为root用户而没有明确地以root用户身份登录。此外,您不必输入root密码。重要提示:请注意,su命令还允许您切换用户(默认情况下它切换到root)。此命令要求您输入root密码。为避免这种情况,您可以使用sudo(sudosu)执行它,这样您只需要输入登录密码即可。但是,su和sudosu之间存在隐含差异-要了解它们以及它们与sudo-i的不同之处,请参见此处。总结我希望现在您至少了解sudo的基础知识以及如何调整sudo的默认行为。请按照我们的说明尝试调整/etc/sudoers。还可以浏览论坛讨论以更深入地了解sudo命令。