Linux &引用;“缓存”;bash脚本上的凭据

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

我创建了一个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_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