openssl从脚本传递前几行然后从stdin读取

时间:2012-12-04 16:11:46

标签: bash shell openssl

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

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

然后从那里获取stdin的输入。我对shell脚本和openssl工具包一无所知,我当然不知道如何简单地使用管道/重定向stdin,除非我尝试设置一个同时从{{1本身,或等等。

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

stdin

不和

做同样的事情
$ 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) 正在打开一个新的shell会话(我在这里的理解很弱)并且它没有将其参数从openssl传递给它创建的内壳。

5 个答案:

答案 0 :(得分:2)

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

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

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

然后第二个脚本只是将参数捆绑到openssl,所以你不必一直输入它们(例如,调用这个script2.sh。注意,与上面的script1.sh一样,你应该有#!/ bin / bash在第一行告诉操作系统它是一个bash脚本。

然后你可以输入:

script1.sh | script2.sh

你将获得传递给openssl的前两行,然后你输入的所有内容都会被传递掉。如果你想总是用几个命令完成,你可以在script1.sh中的while循环之后添加它们。

使用Ctrl-D

终止整个事情

如果openssl回显您输入的输入,那么您将输入您键入的行两次(这有点刺激)。在这种情况下,“读取”的“-s”参数将禁止第一行(例如,用于键入密码)

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

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

答案 1 :(得分:1)

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

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

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

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

这会将该文件转换为您必须阅读和处理的单一来源。

答案 2 :(得分:1)

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

cat <<EOF - | openssl ....
first command
second command
EOF

答案 3 :(得分:0)

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

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

请注意尾随-starttls imap:openssl“知道”如何告诉IMAP服务器它希望从纯文本连接(就像你使用telnet一样)转移到SSL安全。

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

答案 4 :(得分:0)

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

$ sh -c 'echo "first command"; echo "second command"; while read x; do  echo "$x"; done' | whatever