[MacOS]shell执行自动输入密码之<<EOF(重定向)方法

2017年12月15日 其他资源 1条评论 阅读1141次

[MacOS]shell执行自动输入密码之<<EOF(重定向)方法


MacOS下,很多时候经常为提高效率,自己写一些自动化执行的脚本。
自己写一些脚本把流程式的工作都做了,确实再效率上提高了不少,但经常下面一个场景困惑我。

很多操作需要管理员身份的权限,sudo类似的。
一旦出现shell过程中出现让输入密码的情况,就直接把整个批量的shell处理流给终端了,并不符合我们期望的无人值守的结果。

因此,我们希望shell命令在执行处理流时能自动输入密码。

自动输入密码有多张方式,expect和<<(重定向)方式。expect需要Mac机器上额外安装expect的软件支持包,我没有采用,本文主要介绍的是<<EOF(重定向)方式。


<<重定向的最简单基本使用如下。

 EOF只是一个分界符,当然也可以用abcde替换。
 当shell遇到<<时,它知道下一个词是一个分界符。在该分界符以后的内容都被当作输入,直到shell又看到该分界符(结束分解符必须位于单独的一行)。
 此分界符可以是所定义的任何字符串,其实,不一定要用EOF,只要是“内容段”中没有出现的字符串,都可以用来替代EOF,完全可以换成abcde之类的字符串,只是一个起始和结束的标志罢了。
 EOF分解符一起一后配对出现,中间的内容将以标准输入的形式输入到”交互式程序“。


示例:

sudo chmod +x jileniao.net_shell_auto_password_test.sh<<EOF
jileniao.net_mac_admin_password
EOF



文字描述一下就是,在需要输入密码的命令行后面增加<<EOF
接下来一行,就是密码(jileniao.net_mac_admin_password)
在换一行,EOF结束

其他都是正常的了。

这样写,固然使用没有问题,但隐约中还是感觉不舒服,毕竟是密码就以明文的形式直接暴露在shell文件中了,如果涉及登录远程服务器之类的操作,远程服务器的密码也就直接泄露了。

很容易想到一个改良方案,就是把我们的密码在shell执行时,加入到参数中。如,

./jileniao.net_shell_auto_password_test.sh jileniao.net_mac_admin_password



然后shell文件也改造一下,开始时接收一下执行参数,并保存到变量中。

PASSWORD=$1
if [ ! -n "$PASSWORD" ]; then
  echo "PASSWORD is NULL"
  exit 1
fi
sudo chmod +x jileniao.net_shell_auto_password_test.sh<<EOF
"$PASSWORD"
EOF




这样的结果,貌似也很难让人满意,正常在终端中系统提示我们输入密码时,我们输入的密码都是不可见的,连星号*都不会出现在屏幕上,但现在密码虽然没有在shell文件中明文暴露,确在命令行终端直接显示出来了,技术怎么可以止步,在MacOS中,我们知道有个地方是存放用户密码等凭证的。

这时大家知道新的改良思路了吧,我们可以把密码放到系统的钥匙串访问(KeyChain),然后在shell中调用,听起来挺不错的。不过这个方法还是在理论上可行,实际还没操作过,以后可以实践操练一下shell中读取钥匙串访问(KeyChain)中存储的密码。


分享本文至:

WRITTEN BY

avatar
本文标签:shellmac
看了本文是不是觉得很赞,那就赶紧点击下面按钮分享给身边的朋友吧!

1 条评论

  1. avatar 八角网赚站

    路过,支持一下

欢迎留言




用户登录

sitemap