最近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命令允许受信任的...在运行sudo命令之前,系统将提示该组的每个成员输入密码。这增加了额外的安全层,是向用户授予sudo权限的首选方式。 如下图: 但是,在某些情况下,例如运行自动脚本,您可能需要配置sudoer
参考了java版的expect4j,expectj的原理,进行了极大的简化,可完成基本的功能: 1,运行java代码,执行交互式命令 2,sudo提权,自动输入密码(echo "password" | sudo -S mkdir /opt/test)
sudo 与 su 两个命令的最大区别是:sudo 命令需要输入当前用户的密码,su 命令需要输入 root 用户的密码。另外一个区别是其默认行为。sudo 命令只允许使用提升的权限运行单个命令,而 su 命令会启动一个新的 shell,...
简单的说,sudo 是一种权限管理机制,管理员可以授权于一些普通用户去执行一些 root 执行的操作,而不需要知道 root 的密码。 严谨些说,sudo 允许一个已授权用户以超级用户或者其它用户的角色运行一个命令。当然,...
sudo 是一种权限管理机制,管理员可以授权于一些普通用户去执行一些 root 执行的操作,而不需要知道 root 的密码。 sudo 允许一个已授权用户以超级用户或者其它用户的角色运行一个命令。当然,能做什么不能做什么都...
一、sudo命令 概念: sudo是linux下常用的允许普通用户使用超级用户权限的工具,允许系统管理员让普通用户执行一些或者全部的root命令,如...当用户调用sudo并且输入它的密码时,用户获得了一张存活期为5分钟的票(这个
先通过 which python 获得 python 指令所在路径: $ which python /usr/bin/python ...第二步 让当前用户执行 sudo python 不需要输入密码执行: sudo visudo -f /etc/sudoers.d/python 此时会自动创建 /etc/
启用root帐号仅需运行sudo passwd root,然后根据提示输入密码即可激活root。如果要关闭root用户,仅需运行sudo passwd –l root即可。Root帐号的密码和普通用户使用sudo的密码没有任何联系。root帐号和普通帐号的...
用的codeblocks软件,三次输入密码,如果正确则继续,否则会强制退出系统。应用的C++语言,运行很是完美,适合初学者参考学习借鉴
1.sudo介绍 sudo是linux下常用的允许普通用户使用超级用户权限的工具,允许系统管理员让普通用户执行一些或者全部的root命令,如halt,reboot,su等等。...当用户调用sudo并且输入它的密码时,用户获得了一张
如果内置了PAM支持,则它可能还会要求您输入确认密码。 动机 该软件是对主要Linux和BSD发行版所采用的sudo工具的直接响应,同时增加了其复杂性并。 考虑到我们一直我打算借助SUD最终行动起来并创新这一发展领域。 ...
无论是Linux还是其他类的UNIX系统,都只允许root用户运行全部命令并执行软件包的安装、更新、移除以及其他一些会对系统造成重要修改的特定操作。... 而后提示该调用用户输入密码(通常为该用户的密码,也可为目标
无论是Linux还是其他类的UNIX系统,都只允许root用户运行全部命令并执行软件包的安装、更新、移除以及其他一些会对系统造成...而后提示该调用用户输入密码(通常为该用户的密码,也可为目标用户的密码,或者以NOPASSW
simject 的安装(需要安装最新版本的Theos)git clone https://github.com/angelXwind/simject.gitcd simject/make setup注:在此过程中,你需要通过sudo输入密码登录。请注意,当你输入密码时什么也不显示,这...
...cd myxrgsu 将lib中的文件拷贝到 /usr/lib中: ...运行程序 sudo myxrgsu 前两个是输入登陆锐捷的用户名和密码 DHCP 选择 1 使用DHCP 其他都默认0 博客地址http://blog.csdn.net/a8887396/article/details/8794378
mysql安装配置教程 MySQL是一种流行的开源关系型数据库管理系统(RDBMS),用于存储和检索数据。以下是MySQL的安装和配置的...输入刚刚设置的root密码。 在Windows上安装MySQL: 1. 下载MySQL Installer: 从MySQL
打开“系统设置偏好(System Preferences)” -> “共享(Sharing)” -> “Web共享(Web Sharing)”打开“终端(terminal)”,然后(注意:sudo需要的密码就是系统的root帐号密码)运行“sudo apachectl start”...