如何在bash脚本中获取控制台输入以使用SSL?

时间:2014-09-10 18:37:06

标签: linux bash ssl websphere-liberty

对于我正在使用的服务器技术,可以通过运行一些命令行参数手动将服务器加入集合体。在某一时刻,控制台会提示您是否要接受您输入(y/n)的证书链并且命令一直在运行。我试图自动化这个过程,但我已经遇到了响应输入提示的问题,并且在挖掘之后听说它可能是SSL的事情,所以我不知道是否有这样做的方式不同。

如果您手动执行此操作,它的外观如下:

Joining the collective with target controller ...this may take a while
SSL trust has not been established with the target server
//certificate chain
Do you want to accept the above certificate chain? (y/n)

然而,两者:

echo "y y" | bash ./script.sh

//inside script.sh
echo "y y" | $(command)

最后回复:

Joining the collective with target controller ...this may take a while
SSL trust has not been established with the target server
//certificate chain

Input console is not available 

Aborting join collective.

Error:
Unable to complete the MBean operation
Error: java.securit.cert.CertificateException: User has rejected the request to trust the
certificate chain

我希望有人可以通过手动回复来解决这种问题的方法

3 个答案:

答案 0 :(得分:3)

错误Input console is not available表明目标程序期望与实际终端通信,而不是管道(如果您尝试echo进入程序,则会获得该管道。)

在这种情况下,您将使用expect等模拟真实终端(使用伪tty)的方式自动化程序,并且通常可以“欺骗”这样的程序,使其相信它们正在与之通信一个实际的终端。 expect将允许您将任意命令输入程序。

有关如何使用Expect(此处为自动ssh)的示例,请参阅Bash/Expect Script for SSH

答案 1 :(得分:1)

根据@nneonneo:

,这是一个应该有效的基本expect示例
#!/usr/bin/expect

set timeout 600
spawn -noecho /path/to/script.sh
expect {
  (y/n) {
    send -- "y\n"
    exp_continue
  }
  timeout {
    exit 1
  }
  eof {
    catch wait result
    exit [lindex $result 3]
  }
}

答案 2 :(得分:0)

我假设您正在使用WebSphere Liberty作为您的服务器技术,因为输出是我在安装时得到的。无论如何,您需要输入的关键参数是--autoAcceptCertificates

例如:

collective join defaultServer --host=controller \
  --port=9443 \
  --keystorePassword=memberPassword \
  --user=adminUser \
  --password=adminPassword \
  --autoAcceptCertificates