Testowanie zdalnego portu TCP za pomocą usługi telnet, uruchamiając polecenie jednowierszowe


12

Mam wiele pól linuksowych z bardzo ograniczonym zestawem poleceń i miejsca na dysku. Ale ma na sobie telnetrozkaz.

Zdalnie łączę się z każdą z tych sond (programowo) i wydaje jedną komendę linux przez SSH.

Muszę uruchomić jedno polecenie, aby połączyć się z konkretną maszyną za pomocą usługi telnet, a następnie natychmiast się rozłączyć .

Mogę to wszystko zrobić, ale od razu odłączenie . Telnet otwiera jakąś konsolę lub terminal i nie mogę znaleźć jednoliniowego polecenia, aby uruchomić polecenie telnet, a następnie natychmiast się rozłączyć.

Jeśli to zrobię, mogę z łatwością przeanalizować tekstowe dane wyjściowe pod kątem komunikatów o błędach, ponieważ nie mogę połączyć się z maszyną na określonym porcie i właśnie tego szukam.

Jak mogę uruchomić jednoliniowe polecenie, aby połączyć się z maszyną za pomocą usługi Telnet i rozłączyć się później?


Rozumiem, że twój klient Telnet nie obsługuje bezpośredniego wysyłania?
IBr

@IBr, co masz na myśli?
Muhammad Gelbana,

Zauważ, że klienci telent różnią się kodem wyjścia zgłaszanym po użyciu polecenia exit po stronie klienta do jego zakończenia. Dlatego zerowego kodu wyjścia nie należy traktować jako sygnału otwarcia portu. Przynajmniej nie działa dla telent RPM RHEL.
Oliver Gondža

Odpowiedzi:


28

Powinieneś być w stanie przesłać exitpolecenie do STDIN w telnet. Próbować:

echo 'exit' | telnet {site} {port}

i zobacz, czy to zadziała. (wydaje się, że działa na moim serwerze internetowym, ale YMMV).


może działać, ale wydaje się głupi - telnet powinien mieć opcję wyjścia lub coś przy pierwszym kontakcie
Alexander Mills

10

Najprostszą i najłatwiejszą metodę podano poniżej.

 sleep <n> | telnet <server> <port>

n - Czas oczekiwania w sekundach przed automatycznym wyjściem. Może być ułamkowy jak 0,5. Pamiętaj, że niektóre wymagane dane wyjściowe mogą nie zostać zwrócone w określonym czasie oczekiwania. Może więc być konieczne odpowiednie zwiększenie.

server - docelowy adres IP lub nazwa hosta.

port - docelowy numer portu usługi.

Możesz również przekierować dane wyjściowe do pliku w ten sposób,

sleep 1 | telnet <server> <port> > output.log

To działa idealnie! Chociaż dane wyjściowe są rzeczywiście przekierowywane, zauważyłem, że wciąż pojawia się komunikat „Połączenie zamknięte przez obcy host”. wyjście w mojej konsoli po uśpieniu, a nie w pliku output.log. Jakiś sposób, aby temu zapobiec?
dan

5

W moim przypadku to działa. (CentOS 7):

while read host port; do
r=$(bash -c 'exec 3<> /dev/tcp/'$host'/'$port';echo $?' 2>/dev/null)
if [ "$r" = "0" ]; then
     echo "$host $port is open"
else
     echo "$host $port is closed"
     exit 1 # To force fail result in ShellScript
fi
done

1
Hej, to wspaniale. Jestem użytkownikiem wszystkich systemów Linux w mojej pracy, ale nie jestem administratorem (i nie mam uprawnień administratora). Mam dość proszenia ich o instalację telnetu przez cały czas, aby móc przetestować łączność sieciową (jestem inżynierem sieci). To doskonałe obejście. Trochę go zmieniłem, żeby działał bardziej jak telnet. Podałem tutaj własną odpowiedź z modyfikacjami.
theglossy1

3

Myślę, że lepszym narzędziem do bezpośredniego wysyłania poleceń i uzyskiwania danych wyjściowych byłoby netcat. To proste, ale potężne narzędzie do wprowadzania poleceń przez porty. Możesz zobaczyć przykład użycia w tym pytaniu superużytkownika: /superuser/261900/how-can-i-pipe-commands-to-a-netcat-that-will-stay-alive - pytający podaje działający przykład w którym połączenie zamyka się po kilku sekundach.

A jeśli chcesz tylko przetestować łączność, skorzystaj z tego: http://terminalinflection.com/use-netcat-not-telnet-to-test-network-connectivity/


Próbuję teraz zainstalować netcat, ale nie mogę tego zrobić. Pobrałem skompilowaną wersję powerpc, ale brakuje biblioteki glibc. Pobrałem skompilowaną wersję powerpc, ale urządzenie nie miało wystarczającej ilości miejsca do skopiowania plików biblioteki! Czy to możliwe, że biblioteka glibc już istnieje, ale netcat nie może jej znaleźć?
Muhammad Gelbana,

Netcat jest potrzebny tylko po stronie klienta: na serwerze (sondzie) może być ten sam zwykły stary telnet.
IBr

Również Glibc powinien już istnieć, jest używany na wielu rzeczach w zwykłym systemie.
IBr

Możesz spróbować dodać do skryptów telnet, aby && exitsprawdzić, czy się rozłączy (przynajmniej w ssh to wystarczy).
IBr

&& exitnie działało Jeśli glibc powinien istnieć i wierzę, że tak. Dlaczego miałby nc.traditionalnarzekać na to, jakby go brakowało?
Muhammad Gelbana,

1

Jest to kolejna wersja powyższej odpowiedzi, która sprawia, że ​​działa ona trochę bardziej jak „normalna” składnia telnet. Jeśli podoba ci się moja odpowiedź, proszę oddać głos nie na to, ale na oryginał.

#!/bin/bash
if [ "$2" == "" ]; then
 echo "Syntax: $0 <host> <port>"
 exit;
fi

host=$1
port=$2

r=$(bash -c 'exec 3<> /dev/tcp/'$host'/'$port';echo $?' 2>/dev/null)
if [ "$r" = "0" ]; then
     echo "$host $port is open"
else
     echo "$host $port is closed"
     exit 1 # To force fail result in ShellScript
fi

1

Oto rozwiązanie, które znalazłem w Internecie:

( echo open 127.0.0.1 23
sleep 5
echo your_login
sleep 5
echo your_password
sleep 5
echo hostname
sleep 5
echo exit ) | telnet

Działa dla mnie na SunOS i HP-UX


0

Próbować

echo -e '\x1dclose\x0d' | telnet {HOSTNAME} {PORT}

Najlepsze jest to, że otrzymujesz również status wyjścia. Jeśli telnet zakończy się sukcesem, kod zakończenia będzie wynosił 0 lub jego 1


0

Unikaj netcat, jeśli masz niestandardowe trasy, ponieważ nie przestrzega reguł routingu. W podobny sposób nslookup, digi hostignorować plik / etc / hosts ( wpisy nslookup, dig, Firefox ignorowanie pliku / etc / hosts ).

tj .: w przeciwieństwie do aplikacji i narzędzi, takich jak telneti /dev/tcp( Testowanie zdalnego portu TCP za pomocą telnetu za pomocą komendy jednowierszowej ), które są zgodne z regułami routingu systemu, ncużywa bramy domyślnej, chyba że nakazano użycie źródłowego adresu IP z -s:

nc -w 3 -s 192.168.1.12 example.com 8080

Musiałem przetestować, czy aplikacja może dotrzeć do zasobu, a jeśli trasy są w dół, netcatpoinformowałem, że wszystko było w porządku, ponieważ w teście podano adres źródłowy. Przejdę na używanie /dev/tcp.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.