Как подключить стандартный список команд (с каналами) к одной из этих команд - PullRequest
3 голосов
/ 29 марта 2012

Мне нужно дать пользователю возможность отправлять / получать сообщения по сети (используя netcat), пока соединение установлено (пользователь в этом случае использует nc как клиент ).Проблема в том, что мне нужно отправить строку до того, как пользователь начнет взаимодействовать.Моя первая попытка была:

echo 'my first line' | nc server port

Проблема с этим подходом заключается в том, что nc закрывает соединение, когда echo завершает его выполнение, поэтому пользователь не может отправлять команды черезstdin, потому что оболочка возвращена ему (а также ответ от сервера не получен, потому что он задерживается на несколько секунд, чтобы начать отвечать, и, когда nc закрывает соединение, ответ никогда не будет получен пользователем).

Я также пробовал группировать команды:

{ echo 'my first line'; cat -; } | nc server port

Это работает почти так, как мне нужно, но если сервер закрывает соединение, он будет ждать, пока я не нажму <ENTER>, чтобы снова выдать мне оболочку.Мне нужно вернуть оболочку, когда сервер закрывает соединение (в этом случае клиент - моя команда nc - никогда не закрывает соединение, кроме случаев, когда я нажимаю Ctrl + C).

Я также безуспешно пробовал именованные каналы.

У вас есть какие-либо советы о том, как это сделать?

Примечание: я использую openbsd-netcat.

Ответы [ 5 ]

1 голос
/ 08 ноября 2012

cat ожидает ввода.Вы можете написать скрипт выполнения после nc, чтобы убить cat, и он автоматически вернется в оболочку.

1 голос
/ 29 марта 2012

Вы, вероятно, хотите посмотреть expect(1).

0 голосов
/ 29 марта 2012

Это должно привести к желаемому поведению:

echo "Here is your MOTD." | nc server port ; nc server port
0 голосов
/ 29 марта 2012

Вы можете попробовать это, чтобы увидеть, работает ли он для вас.

perl  -e "\$|=1;print \"my first line\\n\" ; while (<STDIN>) {print;}" | nc server port
0 голосов
/ 29 марта 2012

Я бы предложил вам использовать cat << EOF, но я думаю, что он не будет работать так, как вы ожидаете.

Я не знаю, как вы можете отправить EOF, когда соединение закрыто.

...