0

我想运行openssl它并从发送到服务器的以下命令开始:

t authenticate <dynamically generated base64 string from calling script>
t select Inbox

然后从那里获取输入stdin。我对shell脚本和openssl工具包非常无知,我当然不知道如何简单地通过管道/重定向来做到这一点,stdin除非我尝试设置一个同时从stdin自身绘制的文件,等等。

我不确定 openssl 用于读取其输入的技术。例如以下:

$ echo "t login testacct@yahoo.com password" | openssl s_client -connect imap.mail.yahoo.com:993

不做同样的事情

openssl s_client -connect imap.mail.yahoo.com:993
# openssl dialogue opens...
C: t login testacct@yahoo.com password
S: t NO [AUTHENTICATIONFAILED] Incorrect username or password. (#YSH002)

我想openssl正在打开一个新的 shell 会话(我在这里的理解很弱)并且它不会将其参数从stdin它创建的内壳传递。

4

5 回答 5

2

我建议将问题拆分为两个脚本:

首先,您有一个脚本来回显您要发送的初始命令,然后从标准输入读取并写入标准输出。像这样(例如称之为 script1.sh):

#!/bin/bash
echo "first command"
echo "second command"
while read x
do
  echo "$x"
done

然后,第二个脚本只是将参数捆绑到 openssl,这样您就不必继续输入它们(例如调用此 script2.sh。请注意,与上面的 script1.sh 一样,您应该在第一行告诉操作系统这是一个 bash 脚本。

然后你可以输入:

script1.sh | script2.sh

并且您会将前两行传递给 openssl,然后您键入的所有内容都将在此之后传递。如果您想始终完成一些命令,您可以在 script1.sh 中的 while 循环之后添加它们。

你用 Ctrl-D 终止整个事情

如果 openssl 回显您输入的输入,那么您输入的行会显示两次(这有点烦人)。在这种情况下,“read”的“-s”参数将抑制第一行(例如,用于输入密码)

请注意,此解决方案类似于之前建议的临时文件和 tail -f 的解决方案,但它避免了对临时文件的需要,并且一切都在一行中完成。

问题中给出的解决方案的问题是,当'echo“t login ...”'命令完成时,openssl命令的标准输入被关闭,这通常会导致程序退出。使用此处给出的解决方案,管道将第一个脚本的标准输出连接到第二个脚本的标准输入,输入 read 的所有内容都将传递给 openssl

于 2012-12-09T17:07:20.397 回答
2

这些解决方案都没有将标准输入的控制权返回给用户。这应该将第一个命令和第二个命令传递给 openssl,然后读取标准输入:

cat <<EOF - | openssl ....
first command
second command
EOF
于 2016-09-29T17:23:42.903 回答
1

可以通过以下方式建立与启用 SSL 的 IMAP 服务器的基本 SSL/TLS 连接s_client

openssl s_client -connect imapserver.example.com:143 -starttls imap

注意尾随-starttls imap:openssl“知道”如何告诉 IMAP 服务器它想从纯文本连接(如您使用 telnet 获得)移动到受 SSL 保护的连接。

在此之后,openssl 的工作就完成了,您需要向服务器说出正确的 IMAP,包括身份验证

于 2012-12-04T17:16:47.090 回答
1

您可以更改脚本以将命令写入文件,然后使用tee -a重定向stdin到同一文件。让我给你看一个例子:

jweyrich@pharao:~$ echo "command1" > cmds
jweyrich@pharao:~$ tee -a cmds > /dev/null
command2
command3
^C

同时,我tail -f cmds在另一个 tty 中运行:

jweyrich@pharao:~$ tail -f cmds 
command1
command2
command3

这将把该文件变成你必须阅读和处理的单一来源。

于 2012-12-07T19:21:21.863 回答
0

我想补充一点,您可以将尼克的解决方案用作单行脚本:

$ sh -c 'echo "first command"; echo "second command"; while read x; do  echo "$x"; done' | whatever
于 2013-11-07T14:53:51.620 回答