/ / Comandos openssl Pipeline - bash, shell, openssl, pipeline

Comandos openssl do pipeline - bash, shell, openssl, pipeline

Estou tentando criar um shell script que efetua login no Gmail em um intervalo de tempo definido e exclua alguns arquivos. Sou capaz de fazê-lo via terminal usando openssl mas não via shell script Arquivo.

Aqui está o meu arquivo 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

Agora, o problema aqui é que após o primeiro comando executar o shell se conecta ao servidor e o segundo comando não é executado (o que faz sentido).

Como posso fazer o shell script executar o comando para o servidor conectado?

PS: Acho que pipeline não é a palavra correta aqui, mas não estou ciente do jargão que será usado aqui, portanto, fique à vontade para editar a pergunta.

Respostas:

2 para resposta № 1

A confusão aqui está em como a entrada no shell e no programa openssl é tratada. Quando você faz isso de forma interativa, o shell está lendo comandos do terminal (ou seja, você) e abre Além disso lê a partir do terminal; portanto, o que você digita passa para o que "ouvir no momento: o openssl ... O comando é lido pelo shell e, em seguida, openssl começa a ler no terminal; portanto, quando você digita a001 login ..., que é lido pelo programa openssl e enviado ao servidor remoto.

Em um script, é diferente. O shell lê comandos do script, mas outros programas (como o openssl) lêem o que é chamado de entrada padrão (ou stdin), que geralmente ainda é o terminal. Portanto, o shell lê a linha openssl ..., executa o programa openssl, que tenta ler as entradas do seu terminal. Se e quando o openssl sair, o shell lerá a001 login ... e tente executá-lo como um comando shell.

O que você poderia fazer é fornecer esse a001 login ... como entrada para o programa openssl. A maneira mais fácil de fazer isso é geralmente com um aqui-dobrar, apresentado por <<somedelimiter:

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

Isso basicamente diz ao shell "execute este openssl ... comando e alimente as seguintes linhas (até "EOF") em seu stdin ".

[EDIT] Mas isso não resolve um problema mais profundo, porque tudo o que faz é enviar o login comando, fique sem entrada e feche a conexão. Você teria que incluir comandos adicionais dentro do documento aqui para que ele realmente fizesse qualquer coisa:

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

... e depois capture a saída (provavelmente adicionando >sometempfile na linha de comando) e analise através dosaída para descobrir o que está no servidor. Mas o que você provavelmente realmente quer fazer é poder interagir com o servidor (por exemplo, obter uma lista de novas mensagens e depois FETCH eles), e isso realmente não permite que - seuO script está enviando uma lista de comandos fixa, em vez de enviar comandos um de cada vez, observando os resultados e enviando mais comandos com base no que ele recebe de volta. E isso realmente requer algo diferente de um script de shell e openssl - algo com uma biblioteca IMAP decente (como o triplo sugerido em um comentário).