bash:如何传递包含特殊字符的密码

3

我有一个bash脚本用于从网站下载数据。为此,我需要使用java客户端传递网站的用户名和密码。我的密码中有一个特殊字符,导致问题。我尝试了常用的解决方案,但没有一种有效。

#!/bin/sh
#$ -cwd

MYPASSWORD='password&123'

java -jar client.jar -p username $MYPASSWORD file.gz

尝试在命令中直接使用反斜杠或使用变量,但都无效。登录失败!
MYPASSWORD=password\&123
java -jar client.jar -p username $MYPASSWORD file.gz

尝试使用双引号("")或单引号('')。登录失败。
MYPASSWORD='password&123'
java -jar client.jar -p username "\"$MYPASSWORD\"" file.gz

我也尝试了,但没有成功。

MYPASSWORD='password'"&"'123'

如果有建议将会非常有帮助。在该网站上重置密码似乎也有问题。


1
可以尝试使用三个单引号(''')来进行包含。 - F4240
1
你能否使用这个Java程序下载文件而不需要Bash脚本?如果该程序在脚本外无法运行,那么它也无法在脚本内运行。 - that other guy
F4240的意思是:你试过${MYPASSWORD}了吗? - GhostCat
这个特殊字符是什么?一个换行符?一个NUL字符? - user1934428
1个回答

4

只需引用参数。

mypassword='password&123'
java -jar client.jar -p username "$mypassword" file.gz

引号只是为了让shell在参数扩展后不再执行的值进行任何进一步处理。实际上你并没有将引号传递给你的程序。


1
那么问题不在于 shell;你可能输错了密码,或者 Java 程序在内部处理它时出现了问题。 - chepner
也许是因为你的 shebang 是 /bin/sh 而不是 /bin/bash - SLePort
@Kenavoz 不是的。我发布的代码中没有包含任何 bash 扩展。 - chepner
1
特殊字符已经传递给了Java。问题是,你的Java程序对这些数据做了什么?(这是一个修辞问题;如果你想深入挖掘你的Java代码,你必须发布一个新问题。) - chepner
1
你是如何确定该问题是特殊字符而不是一般调用的?你确定“-p username password filename”是正确的语法吗?它不是“-p username@password filename”或“-u username -p password”或任何类似的吗?此外,请检查您的脚本是否存在回车符。 - that other guy
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接