一、简介
最近想在Jenkins执行Build工作结束后,再执行一些sudo的命令,但是在Mac上sudo命令需要提供密码才能执行。而Jenkins在执行自动化操作的时候,我们是无法在构建任务中手动输入密码的,只有实现了自动输入sudo密码才能让整个构建任务继续执行下去,要不然就会无限期地卡在等待输入密码这一步。
在网上看到过利用管道实现sudo命令自动输入密码的方法,我在Mac上试了,并不奏效,估计只能在Linux上运行,代码如下:
代码语言:javascript复制echo "password" | sudo -S commander
后来又看到通过修改/etc/sudoers中的系统配置实现免密执行sudo的方法,但是这种方法也有缺点,一旦修改错误的话会造成用户权限紊乱,导致当前用户再也无法执行sudo提权的命令了,比较危险。同时修改完以后执行任何命令都不需要sudo了,在安全性控制方面粒度比较大,容易造成隐患。
那么有没有一种比较优雅的方式既能实现sudo执行某些命令或者脚本免密,且不需要改动系统配置文件,安全性又较高的方法呢?expect,它来了!
二、利用expect实现执行sudo命令时自动输入密码
expect是Mac下的一个软件包,利用它可以很方便地在自动化流程中实现一些需要交互性的操作,我们直接通过brew就可以很方便地安装它:
代码语言:javascript复制brew install expect
然后我们就可以开始编写自动化脚本了,比如我想在Jenkins构建结束以后,执行sudo rm -rf ./Build/temp/这样的清理缓存操作,那我就可以这样写:
代码语言:javascript复制#autorm.sh
#expect的安装路径
#/usr/bin/expect这个路径安装完expect之后 which expect可以查看
#!/usr/bin/expect -f
#设置超时时间
set timeout 3
#设置你的Mac用户密码
set password 123456
#传递交互指令
spawn sudo rm -rf ./Build/temp/
#根据输出传递数据,在这里是等待密码提示显示
expect "*asswor*"
send "$passwordr"
#保持在远端
interact
同样还可以通过$argv 参数数组传递,expect autorm.sh 123456
代码语言:javascript复制set password [lindex $argv 0]
expect "password" {send "$passwordrr"}
有一点额外注意的是:上面的这个脚本不能当做普通的shell脚本来执行了,如果你在终端下尝试执行 sh autorm.sh会报错,得用 expect命令来执行这个特殊的脚本:expect autorm.sh。如果提示没有权限的话,再执行一下chmod u x autorm.sh给一下执行权限就可以了。
三、总结
在本篇博客中,马三为大家介绍了一种比较优雅的实现Mac下执行sudo命令免密的方法,希望可以帮助到大家!
作者:马三小伙儿
出处:https://cloud.tencent.com/developer/article/1688638
请尊重别人的劳动成果,让分享成为一种美德,欢迎转载