Примечание. Следуя этому решению, введите команды в одном сеансе оболочки (или используйте один сценарий), если не указано иное. Это потому, что он использует переменные и файловые дескрипторы, они не доступны напрямую за пределами их исходного сеанса.
Создайте временную FIFO. Правильный способ создания временного файла - это mktemp
. К сожалению, он не может создать пятерки. Он может создать временный каталог, хотя:
tmpd=`mktemp -d`
tmpf="$tmpd"/fifo
mkfifo "$tmpf"
printf "%s\n" "$tmpf" # just to know the path to the fifo, it may be useful later
В качестве альтернативы вы можете создать именованный fifo вручную в каком-либо фиксированном или специальном месте. Тебе решать.
Создайте фоновый процесс, который будет читать fifo и передавать данные на сервер:
nc 192.168.1.115 12345 < "$tmpf" &
ncpid=$! # PID may be useful later
Обратите внимание, если nc
не выходит преждевременно. Предполагая, что нет проблем ни с самим соединением, ни с сервером, указанная выше фоновая команда будет оставаться на связи, пока вы не закончите посылать первый пакет данных через fifo. Но вы хотите, чтобы он оставался открытым и принимал несколько записей, поэтому откройте fifo и не закрывайте его (пока):
exec 3> "$tmpf"
Теперь вы можете отправлять все, что вам нравится, через fifo, и фоновое соединение сохраняется:
echo abcd >&3 # sends text
echo -e '\x80' >&3 # sends "binary"
cat /etc/issue >&3 # sends file
cat >&3 # type whatever you want, terminate with Ctrl+D
Любая из этих команд может быть вызвана с путем к fifo вместо &3
, если только вы знаете путь. Зная путь, вы можете написать в fifo из того же или другого сеанса оболочки:
cat > /path/to/the/fifo # type whatever you want, terminate with Ctrl+D
Или вы можете открыть дескриптор в другом сеансе аналогично оригинальному. Независимо от того, как вы пишете в fifo, nc
передает его на удаленный сервер по одному соединению.
Но остерегайтесь условий гонки. Использование одного дескриптора внутри одного сеанса оболочки - это хороший способ избежать их.
После того, как вы передадите все необходимые данные, завершите nc
и закройте дескриптор в исходном сеансе оболочки:
kill $ncpid
exec 3>&-
Обратите внимание, что в некоторых случаях единственной последней команды достаточно, чтобы сделать фоновый nc
выход; это зависит от того, что ты сделал и что ты все еще делаешь с fifo. По этой причине я решил убить nc
явно.
Удалите временный каталог и его содержимое (например, fifo):
rm -r "$tmpd"
Конечная нота:
Нет необходимости ставить nc
в фоновый режим. Вы можете запустить его в одном терминале, записать в fifo (зная его путь) из другого. Таким образом, вы можете легко контролировать его состояние. Приспособьте это решение к вашим потребностям.