管道openssl命令
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了管道openssl命令相关的知识,希望对你有一定的参考价值。
我正在尝试创建一个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:我认为管道在这里不是正确的词,但我不知道将在这里使用的术语,所以请随时编辑问题。
这里的困惑在于如何处理shell和openssl程序的输入。当你以交互方式执行此操作时,shell正在从终端读取命令(即你),而openssl也会从终端读取,因此无论你输入什么内容,都会进入当时正在收听的内容:shell会读取openssl ...
命令,并且然后openssl
开始从终端读取,所以当你输入a001 login ...
时,它会被openssl程序读取并发送到远程服务器。
在脚本中,它是不同的。 shell从脚本中读取命令,但其他程序(如openssl)从所谓的标准输入(或stdin)读取,这通常仍然是终端。所以shell读取行openssl ...
,运行openssl程序,尝试从终端读取输入。如果和当openssl退出时,shell将读取a001 login ...
并尝试将其作为shell命令执行。
你可以做的是提供a001 login ...
作为openssl程序的输入。最简单的方法是使用由here-doument引入的<<somedelimiter
:
openssl s_client -connect imap.gmail.com:993 -crlf <<EOF
a001 login USER_NAME PASSWORD
EOF
这基本上告诉shell“运行这个openssl ...
命令,并将以下行(直到'EOF')提供给它的stdin”。
[编辑]但这并不能解决更深层次的问题,因为它只是发送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库(在评论中建议的三元组)。
以上是关于管道openssl命令的主要内容,如果未能解决你的问题,请参考以下文章