sudo apt-get install expect
Jest to program (a właściwie język programowania...), który udaje przed innym programem (np. ssh) użytkownika wpisującego coś z klawiatury. Expect-a można używać tak jak innych języków skryptowych przy pomocy następującej magicznej pierwszej linijki:
#!/usr/bin/expect -f
Całość skryptu wygląda tak:
#!/usr/bin/expect -f
#powiedzieliśmy jaki program ma być interpreterem poleceń dla tego skryptu
spawn ssh twójLogin@twoj.serwer.do.zalogowania.org
#expect uruchomi program do pogawędki
sleep 2
#poczeka chwilkę
send twojeHasło\r
#"wpisze" hasło
interact
#przekaże sterowanie [klawiaturę] użytkownikowi
Ostatnia linijka jest potrzebna, żeby expect nie zakończył się po wykonaniu ostatniego polecenia (co spowodowałoby zamknięcie także naszego programu). Trzeba jeszcze tylko nadać uprawnienia uruchamiania (chmod u+x nazwa.skryptu) i można używać (wywołanie ./nazwa.skryptu zaloguje nas gdzie chcieliśmy).
W moim przypadku motywacją do takiej "gimnastyki" było automatyczne zalogowanie na serwerze w celu uzyskania i utrzymania dostępu internetu (który ma się u nas tak długo, jak jest się zalogowanym na serwerze...). Poza tym serwer nie służy absolutnie do niczego i niczego więcej też nie umożliwia - stąd niespecjalnie zainteresowany byłem dalszą interakcją. Najchętniej zamknąłbym okienko konsoli, w którym wykonałem powyższy skrypt - albo przynajmniej gdzieś schował. Tu z pomocą przychodzi screen.
Screen to emulator konsoli (a.k.a. terminala). Najważniejsze jego funkcje to - jak dla mnie - uruchomienie jakiegoś programu w emulowanym okienku konsoli i ukrycie go - odłączenie (detatch). Wtedy emulowany ekran konsoli (screen) działa sobie w tle, a prawdziwą konsolę, z której screen-a uruchomiliśmy możemy nawet zamknąć.
Grande finale: dodamy do
#tego używałem do tej pory
alias internet-recznie='ssh login@serwer'
#a tego używam teraz
alias internet='screen -S internet -d -m $HOME/.nazwa.skryptu'
# -S internet - ustawia nazwę sesji screen na 'internet'. Nieobowiązkowe, dla porządku.
# -d -m - utworzony screen jest od razu odłączany (detatched)
# $HOME/.nazwa.skryptu - skrypt umieściłem w katalogu domowym (dostępnym pod $HOME) i uczyniłem plikiem ukrytym (. na początku nazwy)# wywołanie całości machinerii
internet
EDIT:
Wbrew temu, co napisałem wcześniej, .bashrc jest uruchamiane w momencie otwarcie konsoli innej niż konsola logowania - czyli np. gdy otworzymy nowy terminal. Tak naprawdę chcielibyśmy wywołanie machinerii zrobić w jednym z plików: ~/.bash_profile, ~/.bash_login, ~/.profile - i to w tej kolejności. Gdy bash jest uruchamiany w konsoli logowania, wykona jeden ze wspomnianych skryptów właśnie w tej kolejności.
Jest jeszcze kilka rzeczy, które należy wiedzieć o screen:
- powrót do odłączonego okienka: screen -d [numer / nazwa sesji, o ile jest więcej niż jedna]
- odłączenie okienka [spoza lini komend]: [ctrl+a, d]
- zamknięcie okienka: [ctrl+a, K]
W następnej notce napiszę jak użyć ~/.bash_logout do wykonania jakiegoś polecenia w okienku podczas zamykania systemu :)