telnet
ожидает tty на своем стандартном вводе, но timeout
убирает его.
Если вы действительно настаиваете на использовании telnet, вы можете сделать это, добавив опцию --foreground
к timeout
, как в:
output=$(timeout --foreground --signal=9 3 telnet 1.2.3.4 1234 2>&1 | grep "something")
Кроме того, если вы можете иметь nc
в своей системе, вам лучше использовать его для своих целей:
output=$(timeout 3 nc 1.2.3.4 1234 | grep "something")
Если ни nc
, ни timeout --foreground
вам не подходят, тогда вам действительно нужна альтернатива telnet, которая не требует tty.
Я вижу, вы пометили свой вопрос bash
, чтобы вы могли использовать собственные сетевые возможности Bash, и поэтому ваша строка может выглядеть как:
output=$(timeout 3 cat < /dev/tcp/1.2.3.4/1234 | grep "something")
Если даже cat
не подходит, вы можете заменить его одним скриптом -в Bash, как в:
output=$(timeout 3 stdbuf -oL bash -c 'while read line ; do echo "${line}" ; done < /dev/tcp/1.2.3.4/1234 | grep "something"')
Надеемся, что в вашей системе доступен как минимум stdbuf
(, являющийся частью стандартного пакета coreutils ).
В этом последнем варианте, однако, обратите внимание на ваше регулярное выражение grep :, если у вас есть одинарные -кавычки, вам нужно избежать их, сначала выйдя из основной пары одинарных -кавычек.
Это необходимо также, если вам нужно передать переменные (, например, имя хоста и/или номер порта )из вашей оболочки в один скрипт -лайнера. Например:
hostname=1.2.3.4
portnumber=1234
output=$(timeout 3 stdbuf -oL bash -c 'while read line ; do echo "${line}" ; done < /dev/tcp/'"${hostname}"'/'"${portnumber}"' | grep "something"')
Здесь я предполагаю, что значениям ${hostname}
и ${portnumber}
можно доверять, т. е. они предоставлены вами или другими надежными источниками, которые не дадут незаконных, недействительных или опасных значений.