Ssh

通過 ssh 和 telnet 測試從各種主機到特定主機的網路連接

  • November 30, 2018

我正在嘗試查看是否為主機名/IP 列表打開了一個埠,並且我使用了一個像這樣的簡單腳本來 ssh 到每個主機並擷取輸出。

for i in `cat $1`
do ssh $i "sleep 5 | telnet 11.22.33.44 123"
done

這會引發“沒有特定於環境的終端時間”錯誤,因為 Telnet 被設計為與智能終端互動的互動式工具。

我怎麼能解決這個問題,知道我不能使用nc命令,因為它在 Unix AIX 系統上不可用?

請注意,有些主機會回复,Connected to 11.22.33.44. Escape character is ^]這意味著有連接,而其他主機會凍結,Trying ...這意味著沒有連接。

由於 perl 是預設安裝的,一種方法是通過 ssh 連接到中間主機並要求它執行 perl,perl 程序作為 here-document 提供:

for host in $(< "$1")
do

 ssh "$host" perl << 'EOF'
use IO::Socket;
my $handle = IO::Socket::INET->new(
       PeerAddr => '11.22.33.44',
       PeerPort => 123,
       Proto    => 'tcp',
       Timeout  => 5)
   or die "Failed\n";
close $handle;
print "Success\n";
EOF

done

該腳本嘗試通過 TCP 連接到給定的 IP 和埠;如果失敗,您將收到Failed消息,但如果成功,它會立即關閉連接並列印Success. 這使用$(< ...)語法從第一個參數給出的文件名中讀取;就像 一樣cat,此方案假定所有文件名中都沒有任何字元$IFS(預設為空格、製表符或換行符)。我還引用了循環變數(此處為host),以防止任何輸入文件內容包含 shell 萬用字元(如*?[.

引用自:https://unix.stackexchange.com/questions/485126