Как ввести один и тот же текст в несколько окон одновременно?

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}можно доверять, т. е. они предоставлены вами или другими надежными источниками, которые не дадут незаконных, недействительных или опасных значений.

1
13.05.2020, 08:53
0 ответов

Теги

Похожие вопросы