在shell脚本中传递变量

时间:2014-03-13 19:20:10

标签: shell unix

我是Unix的新手......我有一个调用sqlplus的shell脚本。我有一些在代码中定义的变量。但是,我觉得在脚本中显示密码感觉不舒服。如果有人能告诉我如何隐藏密码,我将不胜感激。

  1. 我知道的一种方法是省略密码和sqlplus 提示你输入密码。
  2. 我非常感兴趣的一种方法是linux 命令,其输出可以传递给密码变量。那 方式,我可以用一些参数轻松替换“test”。
  3. 任何其他方法。
  4. 谢谢

    #This is test.sh It executes sqlplus
    #!/bin/sh
    export user=TestUser
    export password=test
    # Other variables have been ommited
    echo ----------------------------------------
    echo Starting ... 
    echo ----------------------------------------
    echo
    sqlplus $user/$password
    echo
    echo ----------------------------------------
    echo finish ... 
    echo ----------------------------------------
    

2 个答案:

答案 0 :(得分:0)

您可以将密码传递给sqlplus命令:

echo ${password} | sqlplus ${user}

答案 1 :(得分:0)

tl; dr:命令行上的密码容易暴露给恶意代码和用户。不要这样做。你有更好的选择。

可以使用$0(命令本身)通过${!#}访问命令行($#是参数的数量,${!name}取消引用{{1}的值},在这种情况下$name)。

您可以简单地将密码作为位置参数(例如,首先或$#)提供,或者使用getopts(1),但是参数数组中的密码是个坏主意。考虑$1的情况(显示所有进程的完整命令行,包括其他用户的命令行)。

更喜欢以交互方式(stdin)或从配置文件获取密码。这些解决方案有不同的优点和缺点,因此请根据您的情况选择。如果你这样做,请确保未经授权的用户无法读取配置文件。它还不足以使文件很难找到顺便说一句。

可以使用shell内置命令ps auxww来完成交互式事务。

bash(1) Shell内置命令部分中的描述包含

  

read无声模式。如果输入来自终端,则不会回显字符。

-s

阅读bash手册,了解该代码段中使用的其他构造。

shell脚本的配置文件非常简单,只需在脚本中#!/usr/bin/env bash INTERACTIVE=$([[ -t 0 ]] && echo yes) if ! IFS= read -rs ${INTERACTIVE+-p 'Enter password: '} password; then echo 'received ^D, quitting.' exit 1 fi echo password="'$password'"

配置文件是一个普通的shell脚本,如果你将自己限制在那里设置变量,那将非常简单。

有关source ~/.mystuffrc的说明,请再次参阅 Shell Builtin命令