管道openssl命令

问题描述 投票:-1回答:1

我正在尝试创建一个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:我认为管道在这里不是正确的词,但我不知道将在这里使用的术语,所以请随时编辑问题。

bash shell openssl pipeline
1个回答
2
投票

这里的困惑在于如何处理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库(在评论中建议的三元组)。

© www.soinside.com 2019 - 2024. All rights reserved.