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