Być może korzystając z mojego skryptu rsget-mod lub w innej sytuacji, potrzebowaliście połączyć się z jakimś zewnętrznym urządzeniem w celu - ja wiem? - restartu routera, zmiany konfiguracji itp. Najczęściej - bo najprościej - używa się do takiego celu telnetu, ponieważ to najbanalniejszy protokół i twórcom sprzętu prościej go implementować niż takie SSH. Pojawia się jednak problem - jak z poziomu skryptu połączyć się z urządzeniem?
Pierwsza rzecz, która przyszła mi do głowy to skierowanie strumienia STDIN do programu klienckiego telnet. Niestety, klasyczne przekazanie strumienia nie działa w tym przypadku (trudne, żeby działało). Potem pomyślałem o netcacie - 'szwajcarskim scyzoryku do TCP/IP'. Niestety, on też nie chciał działać jak trzeba. Męczyłem się, kombinowałem, w końcu jednak Michał Górny przypadkowo naprowadził mnie na dobrą drogę. Przypomniałem sobie jak w zenity rozwiązany jest progressbar i mnie olśniło. Trochę kombinowania i mam rozwiązanie.
Na początku należy samodzielnie połączyć się z panelem, żeby zobaczyć jak wygląda proces autoryzacji. W moim przypadku trzeba połączyć się z ip 192.168.2.1 wpisać login (root) i hasło, a następnie wydać polecenie (u mnie: reboot, potem y). Gdy już wiemy jak to wygląda, konstruujemy banalny skrypcik:
( echo "open 192.168.2.1"; sleep 0.5; echo "root"; sleep 0.5; echo "haslo"; sleep 0.5; echo "reboot"; sleep 0.2; echo "y"; ) | telnet
Jak to działa? Uruchamia telnet i po kolei wpisuje mu w ten sam sposób jak wpisywałaby to osoba z klawiatury kolejne polecenia - połączenie z serwerem, następnie wszystko to co powinno pójść do serwera. Zwróćcie uwagę na te wszystkie polecenia sleep - mają one na celu przytrzymania skryptu na czas łączenia się oraz reakcji sprzętu na wpisywane polecenia. Bez nich wszystko wysłałoby się wszystko równocześnie i zostałoby zagubione w trakcie.
Jak widać, napisanie takiego skryptu jest wbrew pozorom banalne. Mam nadzieję, że przyda się ono osobom korzystającym z mojego skryptu oraz tym, które potrzebują takiego rozwiązania u siebie. Happy hacking ;)
Reklamy: sklep komputerowy ,
Może to jakoś skrócić?
(
echo „haslo”;
sleep 0.5;
echo „reboot”;
sleep 0.2;
echo „y”;
) | telnet -lroot 192.168.2.1
Widzę, ze PSZ mnie ubiegł. Tak, czy inaczej – Tcl + Expect stanowi bardzo dobre rozwiązanie, jeżeli zachodzi konieczność obcowania z interaktywnymi programami. Chociaż sam Tcl najpiękniejszym językiem nie jest ;p
psz – pytanie tylko po co? Kod, który podałem ma tak naprawdę jedną linijkę (bo enterów nie liczę) i wymaga jedynie telneta (który jest chyba na każdym kompie). Twój ma więcej linijek i wymaga zewnętrznego programu, a wykonuje dokładnie to samo. KISS.
Po pierwsze, nie „mój”, tylko znaleziony na Sieci, po drugie, co prawda robi to samo, ale tylko powierzchownie. W rzeczywistości podstawy działania obu rozwiązań są zupełnie różne. Twój skrypt mógłbym porównać do chodzenia po mieszkaniu po ciemku w środku nocy, w nadziei, że układ mebli się nie zmienił i nie poobijasz sobie kostek. Rozwiązanie „moje” to już jest włączenie światła i odpowiednie poruszanie się na postawie tego, co w rzeczywistości zastaniesz.
Oczywiście, rozwiązania KISS są dobre, ale głównie, jak musisz sklecić skrypt w 3 min. Takie prowizorki zostają potem na lata i Twoi następcy będą cię przeklinać po koniec czasów.
Wszystko można zrobić na wiele sposobów, ale jeśli już dyskutujemy sobie o dostępnych metodach, to lepiej jest wyłożyć na stół również te bardziej skomplikowane. To się nazywa inżynieria.
No chyba, że Twój post miał na celu wyłącznie pochwalenie się, a nie dyskusję. W takim razie na przyszłość polecam blokować komentarze ;)
psz – ależ skąd :) Masz rację z twoim rozwiązaniem, że jest „zapaleniem światła”, ale celem notki było pokazanie najprostszego możliwego sposobu na wysłanie trzech komunikatów przez telnet, bez zastanawiania się nad ich treścią. Pod „twój” oczywiście rozumiałem „z twojego komentarza” – skrót myślowy, liczę, że wybaczysz ;)
Nie planuję też korzystać z takiej prowizorki w jakimś bardziej zaawansowanym projekcie, ot’ do domowego skryptu jest w sam raz. Poza tym taką prowizorkę łatwo podmienić na coś lepszego, więc nie przesadzaj z tym przeklinaniem :D
A za blokowanie komentarzy podziękuję, wystarczy mi ograniczenie ich do członków Joggera (odpadają dzięki temu anonimowi herosi czyli trole, którzy boją się podpisać) i okresowe blokowanie komentarzy we wpisach starszych niż kilka miesięcy.
To świetnie, że sobie pewne sprawy wyjaśniliśmy :)
Co do prowizorek, to mam wątpliwą przyjemność pracować z prowizorkami o wielkościach przekraczających dziesiątki tysięcy linii (nie wiem dokładnie, strzelam) – podmień coś takiego ;)
psz – no wiadomo, że jak coś większego to już się człowiek za to normalnie bierze, a nie robi skrótami :)
D4rky: expecta doinstalowujesz raz, a w zamian dostajesz możliwości, o których przy telnecie nawet nie masz co marzyć. Choćby warunki, normalną obsługę kontroli poprwności działania (a nie sleep – wystarczy, że logowanie potrwa 3 razy dłużej, niż normalnie i to Twoje nie zadziała).
hm, netcat mógł nie działać bo to coś z czym chcesz się porozumieć oczekuje CR LF jako sekwencji nowej linii — tak jak to jest w Telnecie. Ty mu wysyłałeś samo tylko LF. Jeśli moja teoria jest słuszna to naprawienie tego jest banalne.
19-letni geek-webdesigner uczęszczający do ZSE w Bydgoszczy. więcej...
radmen
Bardzo ciekawe. A czy w podobny sposób można zrobić coś po ssh (wybacz, że się pytam, a nie sprawdzam – nie mam aktualnie jak :P )?