我试图查看是否为主机名/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 ...
这意味着没有连接。
答案1
由于默认安装了 perl,一种方法是通过 ssh 到中间主机并要求其运行 perl,并在此处文档中提供 perl 程序:
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 通配字符(如*
、?
或 )时出现问题[
。