/ / Polecenia openssl Pipeline - bash, shell, openssl, potok

Polecenia Pipeline openssl - bash, shell, openssl, potok

Próbuję utworzyć skrypt powłoki, który loguje się do Gmail w określonych odstępach czasu, a następnie usuń niektóre pliki. Jestem w stanie to zrobić za pomocą terminalu openssl ale nie przez shell script plik.

Oto mój plik powłoki

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

Teraz problemem jest to, że pierwsze polecenie wykonuje powłokę łączy się z serwerem, a drugie polecenie nie zostaje wykonane (co ma sens).

Jak mogę wykonać polecenie uruchomienia skryptu powłoki dla podłączonego serwera?

PS: Myślę, że potok nie jest tutaj właściwym słowem, ale nie znam żargonu, który zostanie tutaj użyty, więc możesz edytować pytanie.

Odpowiedzi:

2 dla odpowiedzi № 1

Zamieszanie polega tutaj na sposobie obsługi wejścia do powłoki i programu openssl. Gdy robisz to interaktywnie, powłoka odczytuje polecenia z terminala (np. Ciebie) i openssl również czyta z terminala, więc cokolwiek wpiszesz, idzie do dowolnego „słuchania w tym czasie: openssl ... polecenie jest odczytywane przez powłokę, a następnie openssl zaczyna odczytywać z terminala, więc podczas pisania a001 login ..., który zostanie odczytany przez program openssl i wysłany na zdalny serwer.

W skrypcie jest inaczej. Powłoka odczytuje polecenia ze skryptu, ale inne programy (jak openssl) odczytują z tego, co nazywa się standardowym wejściem (lub standardowym wejściem), które zwykle jest terminalem, więc powłoka odczytuje linię openssl ..., uruchamia program openssl, który próbuje odczytać dane wejściowe z twojego terminala. Jeśli i kiedy openssl zakończy działanie, powłoka zostanie odczytana a001 login ... i spróbuj wykonać go jako polecenie powłoki.

Co możesz zrobić, to dostarczyć a001 login ... jako dane wejściowe do programu openssl. Najłatwiej to zrobić zazwyczaj za pomocą tutaj, wprowadzony przez <<somedelimiter:

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

To zasadniczo mówi powłoce: „uruchom to openssl ... polecenie i podaj następujące linie (do „EOF”) do swojego standardowego wejścia ”.

[EDIT] Ale to nie rozwiązuje głębszego problemu, ponieważ wszystko, co robi, to wysłać login polecenie, a następnie zabraknie danych wejściowych i zamknij połączenie. Musisz dołączyć dodatkowe polecenia w dokumencie tutaj, aby faktycznie coś zrobił:

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

... a następnie przechwycić z niego dane wyjściowe (prawdopodobnie przez dodanie >sometempfile do linii poleceń) i analizuj przezdane wyjściowe, aby dowiedzieć się, co jest na serwerze. Ale prawdopodobnie chcesz mieć możliwość interakcji z serwerem (np. uzyskać listę nowych wiadomości i wtedy FETCH im), a to naprawdę na to nie pozwala - twojeskrypt wysyła stałą listę poleceń, zamiast wysyłać polecenia pojedynczo, przeglądając wyniki i wysyłając więcej poleceń w oparciu o to, co wraca. A to naprawdę wymaga czegoś innego niż skrypt powłoki i openssl - coś z porządną biblioteką IMAP (jak zasugerował triplee w komentarzu).