前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【打包构建】Mac下使用expect实现执行sudo命令时自动输入密码

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

作者头像
马三小伙儿
发布2020-08-28 10:04:21
2.7K0
发布2020-08-28 10:04:21
举报

一、简介

  最近想在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://cloud.tencent.com/developer/article/1688638

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-08-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、简介
  • 二、利用expect实现执行sudo命令时自动输入密码
  • 三、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档