【打包构建】Mac下使用expect实现执行sudo命令时自动输入密码
一、简介
最近想在Jenkins执行Build工作结束后,再执行一些sudo的命令,但是在Mac上sudo命令需要提供密码才能执行。而Jenkins在执行自动化操作的时候,我们是无法在构建任务中手动输入密码的,只有实现了自动输入sudo密码才能让整个构建任务继续执行下去,要不然就会无限期地卡在等待输入密码这一步。
在网上看到过利用管道实现sudo命令自动输入密码的方法,我在Mac上试了,并不奏效,估计只能在Linux上运行,代码如下:
echo "password" | sudo -S commander
后来又看到通过修改/etc/sudoers中的系统配置实现免密执行sudo的方法,但是这种方法也有缺点,一旦修改错误的话会造成用户权限紊乱,导致当前用户再也无法执行sudo提权的命令了,比较危险。同时修改完以后执行任何命令都不需要sudo了,在安全性控制方面粒度比较大,容易造成隐患。
那么有没有一种比较优雅的方式既能实现sudo执行某些命令或者脚本免密,且不需要改动系统配置文件,安全性又较高的方法呢?expect,它来了!
二、利用expect实现执行sudo命令时自动输入密码
expect是Mac下的一个软件包,利用它可以很方便地在自动化流程中实现一些需要交互性的操作,我们直接通过brew就可以很方便地安装它:
brew install expect
然后我们就可以开始编写自动化脚本了,比如我想在Jenkins构建结束以后,执行sudo rm -rf ./Build/temp/这样的清理缓存操作,那我就可以这样写:
#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 "$password\r" #保持在远端 interact
同样还可以通过$argv 参数数组传递,expect autorm.sh 123456
set password [lindex $argv 0] expect "password" {send "$password\r\r"}
有一点额外注意的是:上面的这个脚本不能当做普通的shell脚本来执行了,如果你在终端下尝试执行 sh autorm.sh会报错,得用 expect命令来执行这个特殊的脚本:expect autorm.sh。如果提示没有权限的话,再执行一下chmod u+x autorm.sh给一下执行权限就可以了。
三、总结
在本篇博客中,马三为大家介绍了一种比较优雅的实现Mac下执行sudo命令免密的方法,希望可以帮助到大家!
如果觉得本篇博客对您有帮助,可以扫码小小地鼓励下马三,马三会写出更多的好文章,支持微信和支付宝哟!
作者:马三小伙儿
出处:https://www.cnblogs.com/msxh/p/13567400.html
请尊重别人的劳动成果,让分享成为一种美德,欢迎转载。另外,文章在表述和代码方面如有不妥之处,欢迎批评指正。留下你的脚印,欢迎评论!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?