我想运行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
传递给它创建的内壳。
答案 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 -a
将stdin
重定向到同一文件。让我举个例子:
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