【发布时间】:2021-10-30 02:15:54
【问题描述】:
我正在尝试通过命令行参数从用户那里获取用户名和密码。
我的问题是,如果我使用像 Test$$123 这样的密码,它会看到 $$ 广告 PID 并弄乱用户密码。现在是Test4365123。
$1、$2 等也是如此。
有什么办法可以摆脱这种“解释”而获得“真正的”价值?
注意:问题发生在pass=$2,所以我不能转义任何字符。 (我尝试过的):)
这是我的代码:
# Input
TEMP=`getopt -o ap: --long admin:,pass: -n 'add-vhost' -- "$@"`
if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
eval set -- "$TEMP"
while true; do
case "$1" in
-a | --admin ) admin="$2"; shift 2 ;;
-p | --pass ) pass="$2"; shift 2 ;;
-- ) shift; break ;;
* ) exit; break ;;
esac
done
echo $admin
echo $pass
【问题讨论】:
-
请尝试将` `更改为
TEMP=$(...)?你的getopt --version输出是什么? -
@KamilCuk verion: 2.33.1 和变化它仍然是一样的
-
您为什么使用
eval而不仅仅是set?eval肯定会插入字符串。 -
你在做类似
./script --pass "Test$$123"的事情吗?您的脚本永远不会看到$$;在script甚至运行之前,它已被shell 扩展为当前进程ID。 -
@KamilCuk
bash ./test.bash --admin user --pass Test$$123是命令行。我说密码之类的,因为用户密码可能会更改,并且密码中可能是 $1。