运行keytool,使用-file参数获取错误?

时间:2011-03-11 05:22:14

标签: bash shell keytool

我正在阅读这篇文章,关于如何允许Android客户端使用自签名证书:

http://blog.crazybob.org/2010/02/android-trusting-ssl-certificates.html#comment-form

在第2步,我必须运行一些命令,但我不太熟悉shell,并且在尝试运行以下内容时出现语法错误:

export CLASSPATH="/Users/me/Desktop/lib/java/bouncycastle/bcprov-jdk16-145.jar"
CERTSTORE=res/raw/mystore.bks
if [ -a $CERTSTORE ]; then
    rm $CERTSTORE || exit 1
fi
keytool \
  -import \
  -v \
  -trustcacerts \
  -alias 0 \
  -file <(openssl x509 -in mycert.pem) \
  -keystore $CERTSTORE \
  -storetype BKS \
  -provider org.bouncycastle.jce.provider.BouncyCastleProvider \
  -providerpath /usr/share/java/bcprov.jar \
  -storepass mypassword

我跑步时遇到的错误:

./test.sh: line 11: syntax error near unexpected token `('
./test.sh: line 11: `  -file <(openssl x509 -in mycert.pem) \'

所以-file语法有问题,但是我不知道该怎么改变它,因为我不知道-file param可以处理什么语法。

任何人都有任何想法?我在Mac 10.6上,

由于

---------更新---------------

如果我更换“&lt;”带有“$”的字符,执行时会出现以下异常:

java.lang.RuntimeException: Usage error, CERTIFICATE----- is not a legal command
  at sun.security.tools.KeyTool.parseArgs(KeyTool.java:375)
  at sun.security.tools.KeyTool.run(KeyTool.java:171)
  at sun.security.tools.KeyTool.main(KeyTool.java:166)
嗯,我不明白异常告诉我哪个arg很糟糕。脚本更新如下:

export CLASSPATH="/Users/me/Desktop/lib/java/bouncycastle/bcprov-jdk16-145.jar"
CERTSTORE=res/raw/mystore.bks
if [ -a $CERTSTORE ]; then
  rm $CERTSTORE || exit 1
fi
keytool \
  -import \
  -v \
  -trustcacerts \
  -alias 0 \
  -file $(openssl x509 -in mycert.pem) \
  -keystore $CERTSTORE \
  -storetype BKS \
  -provider org.bouncycastle.jce.provider.BouncyCastleProvider \
  -providerpath /usr/share/java/bcprov.jar \
  -storepass mypassword

谢谢!

1 个答案:

答案 0 :(得分:2)

您可能没有运行Bash。 <()称为进程替换。其他一些shell支持它,但Bourne shell不支持它。

它会创建一个匿名命名管道,因此-file会看到一个文件名,但文件内容实际上是openssl x509命令的输出。

您可以通过确保脚本中的第一行是:

来解决问题
#!/bin/bash