【打包构建】Mac下使用expect实现执行sudo命令时自动输入密码

时间:2022-07-24
本文章向大家介绍【打包构建】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 "$passwordr"
#保持在远端  
interact

  同样还可以通过$argv 参数数组传递,expect autorm.sh 123456

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://www.cnblogs.com/msxh/p/13567400.html 请尊重别人的劳动成果,让分享成为一种美德,欢迎转载