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

2020-08-28 10:04:21 浏览数 (1)

一、简介

  最近想在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

请尊重别人的劳动成果,让分享成为一种美德,欢迎转载

0 人点赞