最近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
相关推荐
一个更好的方法是使用`sudo visudo`编辑`sudoers`文件,为特定的脚本或命令分配权限,这样就不需要在每次执行时输入密码。例如,可以在`sudoers`文件中添加以下行: ```sudoers username ALL=(ALL) NOPASSWD: /path...
sudo命令允许受信任的...在运行sudo命令之前,系统将提示该组的每个成员输入密码。这增加了额外的安全层,是向用户授予sudo权限的首选方式。 如下图: 但是,在某些情况下,例如运行自动脚本,您可能需要配置sudoer
参考了java版的expect4j,expectj的原理,进行了极大的简化,可完成基本的功能: 1,运行java代码,执行交互式命令 2,sudo提权,自动输入密码(echo "password" | sudo -S mkdir /opt/test)
这里,`username`是你的用户名,这条规则表示允许该用户在不需要密码的情况下运行`/opt/lampp/manager-linux-x64.run`。这种方式比直接在脚本中硬编码密码更安全,因为即使脚本被泄露,攻击者也无法直接获取到密码。...
`NOPASSWD`选项表示用户不需要输入密码,而如果省略,则需要用户在执行sudo命令时提供密码。 通过使用sudo,系统管理员可以精确地分配权限,确保每个管理员只能执行他们职责范围内的任务,从而提高安全性。此外,...
一旦认证成功,用户将在一段时间内(通常5分钟)可以继续运行sudo命令,而无需再次输入密码。 2. **执行单个命令**:`sudo -c "command"` 或 `sudo -s "command"`,运行完指定的命令后,sudo会返回到原始用户。 3....
3. **身份验证**:运行`sudo`时,用户可能需要提供密码或其他身份验证信息。如果密码未在预设时间内输入,`sudo`将自动退出,默认超时时间为5分钟。 4. **凭据缓存**:为了提高效率,`sudo`支持凭据缓存,即用户在...
简单的说,sudo 是一种权限管理机制,管理员可以授权于一些普通用户去执行一些 root 执行的操作,而不需要知道 root 的密码。 严谨些说,sudo 允许一个已授权用户以超级用户或者其它用户的角色运行一个命令。当然,...
根据提供的文件信息,“开机不输入密码”这一主题主要围绕如何在计算机启动时跳过密码输入环节进行讨论。本文将从不同角度深入解析该知识点,并提供详细的步骤与注意事项。 ### 一、理解“开机不输入密码” #### ...
1. **权限提升**:Nsudo的主要功能是提供权限提升的能力,使非管理员用户能够执行需要管理员权限的任务,这在没有交互式登录或无法获得管理员密码的情况下尤其有用。 2. **System权限支持**:不同于普通的管理员...
- 用户执行sudo时,系统会检查其是否在sudoers文件中被授权,并根据配置执行身份验证(通常需要输入用户密码,非root密码)。 - 验证成功后,sudo会在一定时间内(可配置)允许用户无须再次输入密码执行其他sudo...
而`su`(Switch User)命令则是用来切换到另一个用户的身份,它不需要密码就可以切换到同组的用户,但若要切换到root用户,则通常需要输入密码。 在Laravel项目中集成`sudo-su`包,开发者可以方便地在Laravel ...
5. 如果`sudo`命令的目标用户与执行用户相同,那么也不需要输入密码。 `visudo`是用于编辑`/etc/sudoers`文件的安全方法。它使用`vi`编辑器,并在保存退出时检查文件的语法,以防止因人为错误导致的配置问题。如果...
`NOPASSWD` 表示vic在使用sudo时不需要输入密码。`ALL` 代表了所有的命令,而`!SHUTDOWN` 表示除了SHUTDOWN别名中定义的命令之外。 对于Linux系统管理员来说,了解如何配置和管理sudo权限是十分重要的,因为这关系...
然而,这种方法的一个主要问题是需要用户交互,即在执行`sudo`命令时输入密码。这在无头或自动化场景中可能不适用。为了解决这个问题,你可以考虑以下两种方法: 1. 使用`visudo`编辑`/etc/sudoers`文件,为特定的...
另外,`sudo`每次使用时通常需要用户输入密码,这增加了额外的安全层,防止未经授权的使用。 在日常使用中,`su`常用于系统维护人员在终端机上长时间以root身份工作,而`sudo`则更适合那些偶尔需要管理员权限的用户...
- 示例2:如果你想让lin用户无密码重启nagios服务,可以添加规则`lin ALL=NOPASSWD:/etc/init.d/nagios restart`,`NOPASSWD:`表示运行该命令时不需输入密码。 - 示例3:如果希望lin用户执行任何命令都不用输入...
sudo 是一种权限管理机制,管理员可以授权于一些普通用户去执行一些 root 执行的操作,而不需要知道 root 的密码。 sudo 允许一个已授权用户以超级用户或者其它用户的角色运行一个命令。当然,能做什么不能做什么都...