Ssh
通過 ssh 和 telnet 測試從各種主機到特定主機的網路連接
我正在嘗試查看是否為主機名/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 萬用字元(如*
、?
或[
.