Linux &引用;“缓存”;bash脚本上的凭据
我创建了一个bash脚本,将一些js脚本运行到MongoDB中。基本上,我所做的是运行bash脚本并在本例中传递一个名为version的参数,例如:Linux &引用;“缓存”;bash脚本上的凭据,linux,bash,shell,Linux,Bash,Shell,我创建了一个bash脚本,将一些js脚本运行到MongoDB中。基本上,我所做的是运行bash脚本并在本例中传递一个名为version的参数,例如: ./script.sh 1.0 ./script.sh 1.0 ./script.sh 1.1 ./script.sh 1.2 and on.. 这将执行版本1.0的所有脚本。现在,MongoDB可能需要身份验证user/pass,因此我在脚本执行中有一个选项,它将询问用户是否需要身份验证 read -p "Username: " mongo
./script.sh 1.0
./script.sh 1.0
./script.sh 1.1
./script.sh 1.2 and on..
这将执行版本1.0的所有脚本。现在,MongoDB可能需要身份验证user/pass,因此我在脚本执行中有一个选项,它将询问用户是否需要身份验证
read -p "Username: " mongo_user; read -s -p "Password: " mongo_pass;
我的问题是:对相同的凭证进行排序缓存以多次调用脚本的最佳方法是什么?例如:
./script.sh 1.0
./script.sh 1.0
./script.sh 1.1
./script.sh 1.2 and on..
我不想每次脚本运行时都键入相同的凭据 - 最好的方法是设置一个环境变量并每次读取该变量
- 使用相同的方法,您可以将环境变量用于有效的会话或全局变量
- Caio
正如我在评论中所说,我是如何做到这一点的:
感谢Charles Duffy提供的
printf
解决方案:
#!/bin/bash
ePass() {
read -sp "Password: " pass
echo ""
printf '%s\n' "$pass" | perl -e 'chomp($passwd=<>); chomp($encoded=pack("u",$passwd));print "$encoded\n"' > .pswd
cat .pswd
}
dPass() {
dPass=`cat .pswd | perl -e 'chomp($encoded=<>); chomp($passwd=unpack("u",$encoded)); print "$passwd\n"'`
echo $dPass
}
ePass
dPass
它将屏蔽输入,以避免过肩阅读。然后它将回显编码输出(测试后移除):
然后你要问:
Hello
因此,当您调用mongo脚本时,您可以使用dPass输出作为参数。Rangeesh,我考虑过这一点,但我也认为密码将以明文形式存储在环境变量中,直到会话有效为止。我将看看这是否可行,并考虑在某个时候清理它的方法。谢谢是的,在脚本完成后,您可以将其清除或退出会话。如果OP要使用此功能,他们需要为其脚本提供源代码或将其定义为shell函数,而不是将其作为外部命令运行,因为命令无法修改其父进程的环境变量。顺便说一句,使用所有大写字母
用户名
和密码
可能不是一个好主意;所有caps名称都位于命名空间中,保留用于修改操作系统提供的工具和/或shell本身行为的变量;请看,阅读时请记住,设置一个常规shell变量将覆盖任何类似命名的环境变量,因此命名空间指导原则必然适用于这两个环境变量。我也有这个问题!我所做的是使用perl表达式对密码字符串进行编码和解码,然后将其存储在一个隐藏文件中。这样,密码唯一出现的时间就是您最初输入密码时。它被编码保存,然后当您运行脚本时,您只需为它提供decode(.pwd)
output.Perfect,将与此解决方案一起使用。非常感谢!挖出我的代码并作为答案提交:)谢谢KuboMD,这帮了大忙。请注意,如果您的密码包含(比如)一个被*
包围的空格,则echo$pass
将出现错误,如果字符串包含反斜杠,也可以更改行为,具体取决于运行该字符串的确切shell以及该shell的配置方式(即使是bash有时也会在没有给出-e
的情况下使用反斜杠转义序列,这取决于它的编译方式、运行了哪些shopt
命令、环境的内容等)。使它更加健壮,可以printf“%s\n'$pass”
@CharlesDuffy谢谢你的添加。你是说回音通过管道传输到perl编码中,是吗?是的,没错。顺便说一句,@CharlesDuffy再次感谢。我会更新我的回复!编辑:刚刚注意到我将字符串命名为与函数名相同的dPass
。似乎工作正常,但我认为它通常是最好的prac我想避免这种情况。
Hello