运行sudo不需要输入密码

本文介绍如何通过修改sudoers文件为特定用户配置免密码执行特定命令的权限,适用于Jenkins环境下不同编译任务的需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      最近CI有两个job中编译的时候需要不同的环境,分别依赖同一个包的不同版本,而且运行加载库包的时候需要用到sudo的权限。由于Jenkins在运行的时候使用的是非root账户,所以就必须输入密码。但是jenkins servr现在不支持tty的插件,而且jenkins是由几个Unit公用的,要安装新的插件走的流程比较复杂,短期内不可能。为了达到目标,只能考虑到其他的方法了。

      Google一下知道了一个叫做sudoers的文件可以达到目的。官方解释是,sudoers可以决定用户的sudo权限,这个文件在/etc/sudoers。管理员可以通过添加用户到sudoers文件来控制运行sudo命令时候的行为,比如是否需要密码(英文没有选好,翻译成中文也说不好,悲剧啊)。所以,正好满足我的需求,也不需要去走那个复杂的流程。

     这里记录一下我是怎么做的:

    

>sudo visudo
#不能使用vi或者vim去打开,应该使用visudo命令来打开

 

 

    文件如下:

    

# sudoers file.
#
# This file MUST be edited with the 'visudo' command as root.
# Failure to use 'visudo' may result in syntax or file permission errors
# that prevent sudo from running.
#
# See the sudoers man page for the details on how to write a sudoers file.
#

# Host alias specification

# User alias specification

# Cmnd alias specification

# Defaults specification
Defaults        env_reset
Defaults        env_keep += "BLOCKSIZE"
Defaults        env_keep += "COLORFGBG COLORTERM"
Defaults        env_keep += "__CF_USER_TEXT_ENCODING"
Defaults        env_keep += "CHARSET LANG LANGUAGE LC_ALL LC_COLLATE LC_CTYPE"
Defaults        env_keep += "LC_MESSAGES LC_MONETARY LC_NUMERIC LC_TIME"
Defaults        env_keep += "LINES COLUMNS"
Defaults        env_keep += "LSCOLORS"
Defaults        env_keep += "SSH_AUTH_SOCK"
Defaults        env_keep += "TZ"
Defaults        env_keep += "DISPLAY XAUTHORIZATION XAUTHORITY"
Defaults        env_keep += "EDITOR VISUAL"
Defaults        env_keep += "HOME MAIL"

# Runas alias specification

# User privilege specification
root    ALL=(ALL) ALL
%admin  ALL=(ALL) ALL

# Uncomment to allow people in group wheel to run all commands
# %wheel        ALL=(ALL) ALL

# Same thing without a password
# %wheel        ALL=(ALL) NOPASSWD: ALL

# Samples
# %users  ALL=/sbin/mount /cdrom,/sbin/umount /cdrom
# %users  localhost=/sbin/shutdown -h now

 

 

     所以,从上面的解释来说,在#User privilege Speciation后面加上目标username就可以了,比如:

    

username ALL=(ALL) ALL

 

 

    我这里使用的是用户名是MSTV,看好了,是大写的,添加如下行:

    

MSTV ALL = (ALL) ALL

 

 

   保存,结果报错,如下:

   

visudo: Warning: User_Alias `MSTV' referenced but not defined

 

    看来这个文件不认识'MSTV',因为没有设置User_Alias, 查看cat /etc/passwd|grep MSTV, 没有搜到,查看sudoers果然有个设置User_Alias的地方。那就设置吧。查看设置的语法:

    

User_List ::= User |
              User ',' User_List
 
User ::= '!'* user name |
         '!'* #uid |
         '!'* %group |
         '!'* %#gid |
         '!'* +netgroup |
         '!'* %:nonunix_group |
         '!'* %:#nonunix_gid |
         '!'* User_Alias

    User_list可以有一个或者多个用户名,user ID(前面必须加#),系统的group(前面必须加%),Group ID(前面要加%#), netgroups(前面必须加+), Non-Unix group(前面加上%:), Non-Unix gid(前面必须加上%:)等等。

 

    所以,我改成了:

   

User_Alias MSTV_ = MSTV

    结果,还是报错, 看来不能使用MSTV这个用户名,那就使用uid吧,运行ls -ln,查看uid是504,所以:

    

User_Alias MSTV = #504

    :wq, 这下终于不报错了。

   由于,我只想在使用特定命令的时候带sudo,不需要输入密码,所以,可以指定哪些特定的命令。在这里使用的是Cmnd_Alias来指定:

   

Cmnd_Alias FINALIZER5 = /usr/local/jenkins/Finalizer/Finalizer-5.0.0.70600-macosx-x86/Xcode/install-xcode-finalizer-wrapper.sh
Cmnd_Alias FINALIZER4 = /usr/local/jenkins/Finalizer/Finalizer-4.1.1.1-macosx-x86/Xcode/install-xcode-finalizer-wrapper.sh

  

    组成新的rule,就是:

   

MSTV    ALL=(ALL) NOPASSWD: FINALIZER4, FINALIZER5

 

    :wq 保存,没有错误输出,sudo -l,查看一下,

Matching Defaults entries for MSTV on this host:
    env_reset, env_keep+=BLOCKSIZE, env_keep+="COLORFGBG COLORTERM", env_keep+=__CF_USER_TEXT_ENCODING, env_keep+="CHARSET LANG
    LANGUAGE LC_ALL LC_COLLATE LC_CTYPE", env_keep+="LC_MESSAGES LC_MONETARY LC_NUMERIC LC_TIME", env_keep+="LINES COLUMNS",
    env_keep+=LSCOLORS, env_keep+=SSH_AUTH_SOCK, env_keep+=TZ, env_keep+="DISPLAY XAUTHORIZATION XAUTHORITY", env_keep+="EDITOR
    VISUAL", env_keep+="HOME MAIL"

User MSTV may run the following commands on this host:
    (ALL) ALL
    (ALL) NOPASSWD: /usr/local/jenkins/Finalizer/Finalizer-4.1.1.1-macosx-x86/Xcode/install-xcode-finalizer-wrapper.sh, (ALL)
    /usr/local/jenkins/Finalizer/Finalizer-5.0.0.70600-macosx-x86/Xcode/install-xcode-finalizer-wrapper.sh

 

    可以看到这条规则生效了,测试一下,运行这两个命令前面带上sudo,很顺利,不需要输入密码,就执行成功了。反过来执行一个其他的命令,带上sudo,就需要密码。可见sudoers已经生效了。

     

    这里,主要参考的文档是:http://www.sudo.ws/sudo/sudoers.man.html,另外sudo也有很多命令含有意思,输入sudo -h,可以得到:

    

sudo
usage: sudo -h | -K | -k | -L | -V
usage: sudo -v [-AknS] [-g groupname|#gid] [-p prompt] [-u user name|#uid]
usage: sudo -l[l] [-AknS] [-g groupname|#gid] [-p prompt] [-U user name] [-u user name|#uid] [-g groupname|#gid] [command]
usage: sudo [-AbEHknPS] [-C fd] [-g groupname|#gid] [-p prompt] [-u user name|#uid] [-g groupname|#gid] [VAR=value] [-i|-s]
            [<command>]
usage: sudo -e [-AknS] [-C fd] [-g groupname|#gid] [-p prompt] [-u user name|#uid] file ...

Options:
  -A            use helper program for password prompting
  -b            run command in the background
  -C fd         close all file descriptors >= fd
  -E            preserve user environment when executing command
  -e            edit files instead of running a command
  -g group      execute command as the specified group
  -H            set HOME variable to target user's home dir.
  -h            display help message and exit
  -i [command]  run a login shell as target user
  -K            remove timestamp file completely
  -k            invalidate timestamp file
  -L            list supported sudoers Defaults values
  -l[l] command list user's available commands
  -n            non-interactive mode, will not prompt user
  -P            preserve group vector instead of setting to target's
  -p prompt     use specified password prompt
  -S            read password from standard input
  -s [command]  run a shell as target user
  -U user       when listing, list specified user's privileges
  -u user       run command (or edit file) as specified user
  -V            display version information and exit
  -v            update user's timestamp without running a command
  --            stop processing command line arguments
<think>嗯,用户想了解在Ubuntu系统中配置sudo命令免密码执行的方法。这个问题很实用,特别是经常需要执行sudo命令的用户,免密码确实能提高效率。 用户可能是系统管理员或开发人员,经常需要操作终端命令。考虑到用户明确提到"免密码",说明ta已经意识到默认需要密码的流程比较繁琐,想要简化操作。过用户没有说明具体场景,需要提醒安全风险。 从引用内容看,有三个相关参考资料:[^1]提到Ubuntu中设置免密码sudo的方法;[^2]详细介绍了多种方法;[^3]强调了安全注意事项。这些材料都指向同一个解决方案:修改sudoers文件。 最可靠的方法应该是通过visudo命令编辑/etc/sudoers文件。需要指导用户添加"NOPASSWD"配置项。考虑到用户可能熟悉Linux权限管理,要强调使用visudo是直接编辑文件,因为visudo能防止语法错误导致系统锁死。 安全方面必须重点提醒:免密码sudo会降低系统安全性,要明确说明适用场景(比如个人电脑或受控环境),并建议用户了解风险后再操作。可以类比为"给房门加锁"——方便但降低安全性。 用户可能还想知道:这个方法是否影响其他用户?是否需要重启生效?这些细节都要包含在回答里。最后生成的问题要围绕延伸需求,比如如何撤销设置、其他免密方式比较等。 回复结构要清晰:先讲标准方法步骤,再强调安全须知,最后提供备选方案。避免使用术语,比如"sudoers文件"要解释为"系统权限配置文件"。记得所有命令行都要用代码块标注,方便用户复制粘贴。</think>在Ubuntu中配置sudo密码执行需谨慎操作,以下是详细步骤及安全提示: ### ⚙️ 标准配置方法(推荐) ```bash # 1. 打开终端,使用visudo安全编辑配置文件 sudo visudo # 2. 在文件末尾添加(替换your_username为实际用户名) your_username ALL=(ALL:ALL) NOPASSWD:ALL # 3. 保存退出(Ctrl+X → Y → Enter) ``` ### 🔐 安全注意事项 1. **最小权限原则** 如需限制免密范围,可修改配置为: `your_username ALL=(ALL:ALL) NOPASSWD:/usr/bin/apt,/usr/bin/systemctl` (仅对apt和systemctl命令免密)[^3] 2. **用户组配置法**(适合多用户) ```bash # 创建免密用户组 sudo groupadd nopasswdsudo # 将用户加入组 sudo usermod -aG nopasswdsudo your_username # 配置组权限 sudo visudo ``` 添加:`%nopasswdsudo ALL=(ALL:ALL) NOPASSWD:ALL` 3. **紧急恢复方案** 若配置错误导致sudo锁定: ```bash # 重启进入恢复模式 → root shell mount -o remount,rw / nano /etc/sudoers # 修复错误配置 reboot ``` > **⚠️ 重要安全警告** > - 仅限**个人设备**使用,服务器/公共环境禁用此功能 > - 定期审查授权用户:`sudo grep NOPASSWD /etc/sudoers` > - 离开设备时务必锁屏(Win+L) > - 敏感操作建议保留密码验证[^1][^3] ### 💡 验证配置 ```bash # 新开终端执行(应无密码提示) sudo -k # 清除凭据缓存 sudo ls /root ``` --- ### 📚 相关问题 1. 如何撤销特定用户的sudo密码权限? 2. 除visudo外,还有哪些安全配置sudoers文件的方法? 3. Ubuntu中如何限制sudo命令的执行时间? 4. 配置免密sudo后如何监控敏感命令的执行记录? [^1]: 默认情况下,使用sudo时需要输入当前用户的密码,以确保安全性 [^2]: 频繁输入密码可能会显得繁琐 [^3]: 禁用 sudo 密码会降低系统的安全性,特别是在开放的环境中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值