Sudo命令使用小技巧

简单的说,sudo 是一种权限管理机制,管理员可以授权于一些普通用户去执行一些 root 执行的操作,而不需要知道 root 的密码。 严谨些说,sudo 允许一个已授权用户以超级用户或者其它用户的角色运行一个命令,下面为大家分享一下Sudo命令使用小技巧,有需要的小伙伴可以参考一下。

1. 工作模式理解

简述其使用工作流程和配置文件配置!

[1] 理解 sudo 命令的工作流程

sudo 会读取和解析 /etc/sudoers 文件,查找调用命令的用户及其权限。

然后提示调用该命令的用户输入密码,或者也可以通过 NOPASSWD 标志来跳过密码验证。

之后,sudo 创建一个子进程,调用 setuid() 来切换到目标用户。

最好,它会在上述子进程中执行参数给定的 shell 或命令。

[2] 理解 sudo 命令授权配置

USER/GROUP HOST=(USER[:GROUP]) [NOPASSWD:] COMMANDS

USER/GROUP: 表示需要被授权的用户或者组;如果是组则需要以 % 开头

HOST: 表示允许从哪些主机登录的用户运行 sudo 命令;ALL 表示允许从任何终端、机器访问

(USER[:GROUP]): 表示使用 sudo 可切换的用户或者组,组可以不指定;ALL 表示可以切换到系统的所有用户

NOPASSWD: 如果指定,则该用户或组使用 sudo 时不必输入密码

COMMANDS: 表示运行指定的命令;ALL 表示允许执行所有命令

# 允许 sudo 组执行所有命令

%sudo ALL=(ALL:ALL) ALL

# 允许用户执行所有命令,且无需输入密码

escape ALL =(ALL) NOPASSWD: ALL

# 仅允许用户执行 echo, ls 命令

escape ALL =(ALL) NOPASSWD: /bin/echo /bin/ls

# 运行本机的用户执行关机命令

escape localhost=/sbin/shutdown -h now

# 允许 users 用户组中的用户像 root 用户一样使用 mount、unmount、chrom 命令

%users ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom

[3] 配置 Defaults 选项

# 指定用户尝试输入密码的次数,默认值为3

Defaults passwd_tries=5

# 设置密码超时时间,默认为 5 分钟

Defaults passwd_timeout=2

默认 sudo 询问用户自己的密码,添加 targetpw 或 rootpw 配置可以让 sudo 询问 root 密码

Defaults targetpw

# 指定自定义日志文件

Defaults logfile="/var/log/sudo.log"# 要在自定义日志文件中记录主机名和四位数年份,可以加上 log_host 和 log_year 参数

Defaults log_host, log_year, logfile="/var/log/sudo.log"# 保持当前用户的环境变量

Defaults env_keep += "LANG LC_ADDRESS LC_CTYPE COLORS DISPLAY HOSTNAME EDITOR"

Defaults env_keep += "ftp_proxy http_proxy https_proxy no_proxy"# 安置一个安全的 PATH 环境变量

Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

2. 使用技巧总结

主要介绍使用 sudo 相关命令的使用技巧和问题处理方式!

[1] 如何将 visudo 编辑器从 nano 更改为 vim?

当我使用 visudo 命令的时候,它总是用 nano 编辑器打开它,对应平时习惯使用 vi 或者 vim 的用户来说,显得有些别扭,以及操作不够自如。所以,如何更好的将 visudo 编辑器从 nano 更改为 vim 就变得非常重要了。

最佳的解决办法,就是调用命令,永久的将终端的编辑器更换成为 vim 编辑器,一劳永逸。我们只需要执行如下命令,输入自己需要的编辑器序号并按下回车键即可。下次执行 visudo 命令的时候,就会使用 vim 编辑器打开文件。

# 因为/etc/sudoers普通用户无法打开和使用

$ sudo update-alternatives --config editor

There are 4 choices for the alternative editor (providing /usr/bin/editor).

Selection    Path                Priority   Status

------------------------------------------------------------

* 0            /bin/nano            40        auto mode

1            /bin/ed             -100       manual mode

2            /bin/nano            40        manual mode

3            /usr/bin/vim.basic   30        manual mode

4            /usr/bin/vim.tiny    10        manual mode

Press enter to keep the current choice[*], or type selection number: 3

其次的解决方法,就是通过环境变量修改当前终端的默认编辑器。

# 在.zshrc或.profile文件中export EDITOR=vim;

# 希望执行对visudo生效

$ sudo EDITOR=vim visudo

# 或者修改/etc/sudoers文件的默认编辑器

Defaults editor=/usr/bin/vim

[2] Vim 如何强制保存只读文件?

在使用 vim 的时候,当以普通用户打开一个只有 root 用户才有权限操作的文件时,在编辑完成之后保存时发现,这个文件没有权限修改。好不容易把文件编辑完了,却无法保存,就只能放弃,然后退出,再以 root 权限打开,重新编辑,是在痛苦!那有没有好的方法来解决这个问题呢?咳咳咳,肯定是有的。

# Vim命令模式下执行即可强制保存# w: 表示保存文件# !: 表示执行外部命令# tee: 表示把数据重定向到给定文件和屏幕上# %: 在执行外部命令时,%会扩展成当前文件名

:w !sudo tee %

上述方式非常完美的解决了不能保存只读文件的问题,但毕竟命令还是有些长,为了避免每次输入一长串的命令,可以将它映射为一个简单的命令加到 .vimrc 中。这样,简单的运行 :w!! 即可,命令后半部分 > /dev/null 作用为显式的丢掉标准输出的内容。

" Allow saving of files as sudo when I forgot to start vim using sudo. cmap w!! w !sudo tee > /dev/null % 

[3] 如何更加安全地编辑文件

Sudoedit 是一个内置命令,允许用户安全地编辑文件。根据 sudo 手册页,sudoedit 等效于使用 -e 命令行选项执行 sudo。

那么这个命令会做什么呢,它会首先创建你要编辑的文件的临时副本。然后,命令将搜索 SUDO_EDITOR,VISUAL 和 EDITOR 环境变量(按此顺序),以确定应调用哪个编辑器来打开刚刚创建的临时副本。用户完成修改工作后,更改将复制回原始文件。

# Sudo命令手册页

-e, --edit

Edit one or more files instead of running a command. In lieu of a path name,

the string "sudoedit" is used when consulting the security policy. If the user

is authorized by the policy, the followingsteps are taken:

1. Temporary copies are made of the files to be edited with

the owner set to the invoking user.

2. The editor specified by the policy is run to edit the

temporary files. The sudoers policy uses the

SUDO_EDITOR, VISUAL and EDITOR environment variables (in

that order). If none of SUDO_EDITOR, VISUAL or EDITOR

are set, the first program listed in the editor

sudoers(5) option is used.

3. If they have been modified, the temporary files are

copied back to their original location and the temporary

versions are removed.

If the specified file does not exist, it will be created. Note that unlike most

commands run by sudo, the editor is run with the invoking user is environment

unmodified. If, for some reason, sudo is unable to update a file with its edited

version, the user will receive a warning and the edited copy will remain in a

temporary file.

[4] 如何让 sudo 会话时间随心所欲?

其中 sudo 命令是权限委派的命令,在生产环境中是非常常用的,默认情况下 sudo 命令会话时间是在 15 分钟。要设置 sudo 密码超时的值,需要使用 passwd_timeout 参数进行设置。

可以以分钟设置为你所需的任何时间,它会在超时之前一直等待。如果要为每个执行的 sudo 命令弹出密码提示,你也可以将时间设置为 0,或者通过设置值 -1 永久禁用密码提示。

# 设置timeout时间

# 意味着sudo密码提示将会在用户使用20分钟后过期

Defaults        env_reset,timestamp_timeout=20

[5] 如何更加安全的授权服务器权限?

如何我们管理的服务器,开发或者其他人员需要登录该服务器,进行环境调试或者问题复现等情况。这时,就需要我们给对应的用户开通登录的访问权限。但是如果我们直接编辑 /etc/sudoers 文件的话,之后当对方使用完成之后我就还需要手动进行清理。如果我们忘记的话,该开发或者其他人员将一直可以登录该服务器,会有一定程度的安全问题。

不幸的是,对应临时授权的话,/etc/sudoers 文件中没有对应的配置,可以对某个用户或者用户组进行指定范围的时间授权。当用户到达指定时间点之后,将拒绝该用户再次进行登录了。对应此种情况,我们可以通过 crontab 定时任务与 /etc/sudoers.d 目录的机制可以完美的解决上述问题。

我们通过定时任务的定时执行目录,来定时刷掉 /etc/sudoers.d/ 目录下的用户或者用户组的授权配置文件。比如,我们需要定时每日刷掉今日临时授权的用户或者用户,可以在 /etc/cron.daily 目录下面创建用于删除 /etc/sudoers.d/ 目录的 rm -rf 命令,之后在固定的时间会自动删除。对应授权用户,我们使用在 /etc/sudoers.d/ 目录下创建单独的配置文件,而不是直接修改 /etc/sudoers 文件。

# Crontab有多种定时机制# 下述分别表示每天、每时、每月、每周定时执行
$ ls -dl /etc/cron.* | grep -v cron.d$

drwxr-xr-x 2 root root 4096 May 15 06:18 /etc/cron.daily

drwxr-xr-x 2 root root 4096 Feb 14  2019 /etc/cron.hourly

drwxr-xr-x 2 root root 4096 Feb 14  2019 /etc/cron.monthly

drwxr-xr-x 2 root root 4096 Jun 18 09:57 /etc/cron.weekly

# 创建单独的授权配置文件

$ ls -lh /etc/sudoers.d/

-r--r----- 1 root root 666 Oct  6  2017 lisi

-r--r----- 1 root root 958 Jan 18  2018 zhangsan

# 查看授权配置文件的内容

$ cat /etc/sudoers.d/zhangsan

ALL ALL = (root) NOPASSWD: zhangsan

[6] 如何解决 sudo 命令找不到环境变量?

我们日常在使用 sudo 命令的时候,常常会遇到,当切换用户之后,发现之前设置的环境变量怎么不见了呢?这是因为,我们执行 sudo 命令之后会切换用户,如果保留环境变量会有一定的安全问题,系统会默认重置环境变量为安全的环境变量。先前设置的变量都会失效,只有少数配置文件中指定的环境变量能够保存下来。

我们可以看一下 sudo 配置文件 /etc/sudoers 来找找作用原因。我们执行如下命令之后,可以看到如下输入(有可能和我这里的不一样)。其中 env_reset 表示默认会重置环境变量,因此我们自定义的变量会在 sudo 命令执行之后失效,也就不会正确获取变量值了。而 env_keep 则表示用于保留部分环境变量不被重置,需要保留的变量就写入双引号之中,可自行追加需要保留的变量。最后就是 secure_path 变量,其作用就是包含的路径将被当做 sudo 环境的 PATH 变量来使用。如果在 sudo 环境无法找到某些命令,那么可以将这些命令的路径加入该配置项之中。

$ sudo sed '/^#/d;/^$/d' /etc/sudoers

Defaults    env_reset

Defaults    env_keep =  "COLORS IDSPLAY HOSTNAME HISTSIZE LS_COLORS"

Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS"

Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

我们知道原因之后,就可以针对上述情况作出不用的处理方式,来解决 sudo 命令找不到环境变量的问题。

第一种解决方法,就是在使用的时候,使用 -E 参数。加上 -E 选项后,用户可以在 sudo 执行时保留当前用户已存在的环境变量,不会被 sudo 重置。另外,如果用户对于指定的环境变量没有权限,则会报错。需要注意的是,在内部测试机器中,安全性要求不高的情况下使用。

$ sudo sudo -E

第二种解决方法,就是修改 sudo 配置文件。可以通过修改 /etc/sudoers 文件的 env_keep 和 secure_path 配置项,来指定 sudo 环境中需要保留的环境变量和路径。当然,我们也可以把配置文件的变量 !env_reset 给去掉,这样就不会有限制了。

$ sudo vim /etc/sudoers

Defaults !env_reset

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/219727.html<

(0)
管理的头像管理
上一篇2025-04-14 06:06
下一篇 2025-04-14 06:08

相关推荐

  • 云服务器和云虚拟主机怎么选?云服务器和虚拟主机区别

    云服务器适合业务增长快、需弹性扩展的场景,而云虚拟主机适合预算有限、技术门槛低的小型静态网站或测试环境,二者核心区别在于资源独享性与运维复杂度,核心差异解析:从底层架构到使用体验很多人容易混淆这两者,觉得它们都是“买空间建站”,它们的底层逻辑完全不同,云服务器(ECS)就像是你租了一整栋别墅,水电网络独立,你想……

    2026-06-29
    0
  • 赣州智慧旅游招聘是真的吗?赣州旅游人才招聘信息

    中级岗位(3-5年经验)月薪范围通常在6000-10000元,这类岗位需要独立负责项目模块,如独立运营一个抖音账号,或维护一个景区小程序的功能迭代,具备成功案例的候选人议价能力较强,高级岗位(5年以上经验)月薪范围通常在10000-20000元,部分核心管理岗可达更高,这类人才需要具备战略规划能力,如制定整个景……

    2026-06-29
    0
  • 赣州智能物联网车位锁如何管理?智能车位锁管理系统多少钱

    赣州智能物联网车位锁管理的核心在于通过云端平台实现远程控锁、状态实时监控及自动计费,彻底解决传统车位“被占难管”与“找位难”的痛点,在赣州这样的城市,随着机动车保有量的持续增长,老旧小区、商业综合体以及私人固定车位的资源矛盾日益凸显,传统的机械地锁或简易遥控锁,不仅操作繁琐,更无法实现数据化管理,引入智能物联网……

    2026-06-29
    0
  • 赣州智能消防栓好用吗,智能消防栓多少钱一个

    赣州智能消防栓通过物联网技术实现实时监测与远程报警,能显著降低火灾响应时间并提升城市消防安全管理水平,是目前智慧城市建设中不可或缺的基础设施,赣州智能消防栓的核心价值与应用场景传统消防栓往往存在“看不见、摸不着、用不了”的痛点,在赣州这样地形复杂、老城区与新城区并存的区域,传统设施的管理难度极大,智能消防栓的出……

    2026-06-29
    0
  • 云服务器和物理机到底有啥区别?

    云服务器本质上是虚拟化资源池中的弹性实例,而传统物理服务器是独占的硬件实体,前者胜在弹性与运维便捷,后者强在物理隔离与性能稳定,具体选择取决于业务对成本、扩展性及安全合规的权衡,很多人初次接触服务器时,容易把“云服务器”和“传统物理服务器”混为一谈,觉得它们都是用来跑网站或存数据的盒子,这两者的底层逻辑完全不同……

    2026-06-29
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注