Linux expect czyli wysyłanie danych sftp przez skrypt

Dzisiejszy dzień przyniósł mi do wykonania kolejne zadanie z którym ktoś sobie nie poradził. Wiadomo Linux jest cool, da się wszystko zrobić tylko trzeba się naklepać. Zadanie było nader proste: zautomatyzować proces wysyłania danych na serwer SFTP.

Wydaje się to być proste – mamy crona, mamy login i hasło do serwera SFTP jest tylko jeden problem serwer SFTP zaraz po połączeniu pyta o hasło i nie przejmuje go z linii poleceń.

Z pomocą przychodzi nam mało znany program expect . Pozwala on na „udawanie” interakcji z innymi programami. Więc co możemy za jego pomocą zrobić? Udawać wpisywania hasła… expect nie jest dostępny standardowo (zwykle) więc trzeba zrobić yum install expect . Znalazłem kilka przykładowych skryptów w sieci, ale niespecjalnie chciały mi działać. Po 30 minutach prób i błędów udało się:

#!/usr/bin/expect
spawn /usr/bin/sftp uzytkownik@ftp.adres-serwera.pl
expect "Connecting to ftp.adres-serwera.pl..."
expect "uzytkownik@ftp.adres-serwera.pl password:"
send "tajneprzezpoufnehaslo\r"
expect "sftp> "
send "cd katalog\r"
expect "sftp> "
send "mput /home/slav/*.*\r"
expect "sftp> "
send "bye \r"

Na co zwrócić uwagę? Na polecenie expect – ważne jest żęby faktycznie skrypt się tego spodziewał. Więc na początek trzeba sprawdzić jak wygląda cały proces krok po kroku, dodać co trzeba do expectów i cieszyć się rozwiązanym problemem.