管道openssl命令

时间:2017-12-20 07:15:30

标签: bash shell openssl pipeline

我正在尝试创建一个shell脚本,该脚本以设定的时间间隔登录Gmail,然后删除一些文件。我可以通过终端使用openssl但不能通过shell script文件。

这是我的shell文件

openssl s_client -connect imap.gmail.com:993 -crlf
a001 login USER_NAME PASSWORD
a002 SELECT [Gmail]/Trash
a003 STORE 1:* +FLAGS (\Deleted)
a004 EXPUNGE
a005 logout

现在的问题是在第一个命令执行shell连接到服务器并且第二个命令没有执行之后(这是有意义的)。

如何为连接的服务器创建shell脚本运行命令?

PS:我认为管道在这里不是正确的词,但我不知道将在这里使用的术语,所以请随时编辑问题。

1 个答案:

答案 0 :(得分:2)

这里的困惑在于如何处理shell和openssl程序的输入。当你以交互方式执行此操作时,shell正在从终端(即你)读取命令,而openssl 从终端读取,所以无论你输入什么内容都会发送到终端。当时监听:shell读取openssl ...命令,然后openssl开始从终端读取,因此当您键入a001 login ...时,openssl程序将读取该命令并发送到远程服务器。

在剧本中,它有所不同。 shell从脚本中读取命令,但是其他程序(如openssl)从所谓的标准输入(或标准输入)读取,这通常仍然是终端。所以shell读取行openssl ...,运行openssl程序,尝试从终端读取输入。如果和当openssl退出时,shell将读取a001 login ...并尝试将其作为shell命令执行。

您可以做的是将a001 login ... 作为输入提供给openssl程序。最简单的方法通常是使用<<somedelimiter引入的here-doument

openssl s_client -connect imap.gmail.com:993 -crlf <<EOF
a001 login USER_NAME PASSWORD
EOF

这基本上告诉shell&#34;运行此openssl ...命令,并将以下行(最多为&#39; EOF&#39;)输入其stdin&#34;。

[编辑]但这并不能解决更深层次的问题,因为它所做的只是发送login命令,然后用尽输入,并关闭连接。您必须在here-document中包含其他命令才能让它实际执行任何操作:

openssl s_client -connect imap.gmail.com:993 -crlf <<EOF
a001 login USER_NAME PASSWORD
a001 STATUS INBOX (MESSAGES UNSEEN RECENT)
a001 LIST "INBOX" "*"
EOF

...然后从中捕获输出(可能通过将>sometempfile添加到命令行),并解析输出以找出服务器上的内容。但你真正想做的是能够与服务器进行交互(例如,获取新消息列表然后FETCH他们),这并不是真的允许 - 您的脚本正在发送一个固定的命令列表,而不是一次发送一个命令,查看结果,并根据它返回的内容发送更多命令。这真的需要除了shell脚本和openssl之外的其他东西 - 有一个像样的IMAP库(在评论中建议的三元组)。