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 № 1A 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).