`
david_je
  • 浏览: 373100 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

运行sudo不需要输入密码

 
阅读更多

      最近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
分享到:
评论

相关推荐

    linux编写bash shell脚本文件.sh 自动输入密码.在脚本中使用sudo命令,将密码保存在脚本中,不需要手动输入密码

    一个更好的方法是使用`sudo visudo`编辑`sudoers`文件,为特定的脚本或命令分配权限,这样就不需要在每次执行时输入密码。例如,可以在`sudoers`文件中添加以下行: ```sudoers username ALL=(ALL) NOPASSWD: /path...

    Linux 中不输入密码运行 sudo 命令的方法

    sudo命令允许受信任的...在运行sudo命令之前,系统将提示该组的每个成员输入密码。这增加了额外的安全层,是向用户授予sudo权限的首选方式。 如下图: 但是,在某些情况下,例如运行自动脚本,您可能需要配置sudoer

    sudo提权自动输入密码--java执行交互式命令

    参考了java版的expect4j,expectj的原理,进行了极大的简化,可完成基本的功能: 1,运行java代码,执行交互式命令 2,sudo提权,自动输入密码(echo "password" | sudo -S mkdir /opt/test)

    利用管道实现sudo命令免输入密码的方法

    这里,`username`是你的用户名,这条规则表示允许该用户在不需要密码的情况下运行`/opt/lampp/manager-linux-x64.run`。这种方式比直接在脚本中硬编码密码更安全,因为即使脚本被泄露,攻击者也无法直接获取到密码。...

    sudo应用的详细阐述

    `NOPASSWD`选项表示用户不需要输入密码,而如果省略,则需要用户在执行sudo命令时提供密码。 通过使用sudo,系统管理员可以精确地分配权限,确保每个管理员只能执行他们职责范围内的任务,从而提高安全性。此外,...

    sudo用法详解

    一旦认证成功,用户将在一段时间内(通常5分钟)可以继续运行sudo命令,而无需再次输入密码。 2. **执行单个命令**:`sudo -c "command"` 或 `sudo -s "command"`,运行完指定的命令后,sudo会返回到原始用户。 3....

    linux的sudo详解

    3. **身份验证**:运行`sudo`时,用户可能需要提供密码或其他身份验证信息。如果密码未在预设时间内输入,`sudo`将自动退出,默认超时时间为5分钟。 4. **凭据缓存**:为了提高效率,`sudo`支持凭据缓存,即用户在...

    linux sudo命令详解

    简单的说,sudo 是一种权限管理机制,管理员可以授权于一些普通用户去执行一些 root 执行的操作,而不需要知道 root 的密码。 严谨些说,sudo 允许一个已授权用户以超级用户或者其它用户的角色运行一个命令。当然,...

    开机不输入密码

    根据提供的文件信息,“开机不输入密码”这一主题主要围绕如何在计算机启动时跳过密码输入环节进行讨论。本文将从不同角度深入解析该知识点,并提供详细的步骤与注意事项。 ### 一、理解“开机不输入密码” #### ...

    windows下的 Nsudo提权工具,支持system权限

    1. **权限提升**:Nsudo的主要功能是提供权限提升的能力,使非管理员用户能够执行需要管理员权限的任务,这在没有交互式登录或无法获得管理员密码的情况下尤其有用。 2. **System权限支持**:不同于普通的管理员...

    sudo-1.8.28p1.tar.gz

    - 用户执行sudo时,系统会检查其是否在sudoers文件中被授权,并根据配置执行身份验证(通常需要输入用户密码,非root密码)。 - 验证成功后,sudo会在一定时间内(可配置)允许用户无须再次输入密码执行其他sudo...

    Laravel开发-sudo-su

    而`su`(Switch User)命令则是用来切换到另一个用户的身份,它不需要密码就可以切换到同组的用户,但若要切换到root用户,则通常需要输入密码。 在Laravel项目中集成`sudo-su`包,开发者可以方便地在Laravel ...

    Linux用户配置sudo权限(visudo)的方法

    5. 如果`sudo`命令的目标用户与执行用户相同,那么也不需要输入密码。 `visudo`是用于编辑`/etc/sudoers`文件的安全方法。它使用`vi`编辑器,并在保存退出时检查文件的语法,以防止因人为错误导致的配置问题。如果...

    CentOS 7中sudo权限配置

    `NOPASSWD` 表示vic在使用sudo时不需要输入密码。`ALL` 代表了所有的命令,而`!SHUTDOWN` 表示除了SHUTDOWN别名中定义的命令之外。 对于Linux系统管理员来说,了解如何配置和管理sudo权限是十分重要的,因为这关系...

    Python-SUDO通过叫喊来执行bash命令

    然而,这种方法的一个主要问题是需要用户交互,即在执行`sudo`命令时输入密码。这在无头或自动化场景中可能不适用。为了解决这个问题,你可以考虑以下两种方法: 1. 使用`visudo`编辑`/etc/sudoers`文件,为特定的...

    su和sudo的区别与使用

    另外,`sudo`每次使用时通常需要用户输入密码,这增加了额外的安全层,防止未经授权的使用。 在日常使用中,`su`常用于系统维护人员在终端机上长时间以root身份工作,而`sudo`则更适合那些偶尔需要管理员权限的用户...

    如何在Linux环境为用户添加sudo权限

    - 示例2:如果你想让lin用户无密码重启nagios服务,可以添加规则`lin ALL=NOPASSWD:/etc/init.d/nagios restart`,`NOPASSWD:`表示运行该命令时不需输入密码。 - 示例3:如果希望lin用户执行任何命令都不用输入...

    sudo命令 以系统管理者的身份执行指令

    sudo 是一种权限管理机制,管理员可以授权于一些普通用户去执行一些 root 执行的操作,而不需要知道 root 的密码。 sudo 允许一个已授权用户以超级用户或者其它用户的角色运行一个命令。当然,能做什么不能做什么都...

Global site tag (gtag.js) - Google Analytics