Аргументы, указанные в конце командной строки для awk
, обычно воспринимаются как имена файлов, из которых скрипт awk
будет читать. Чтобы установить переменную в командной строке, используйте -v variable=value
, например.
awk -v num=10 -f script.awk
Это позволит вам использовать num
в качестве переменной в вашем скрипте. В приведенном выше примере начальное значение переменной будет равно 10.
Вы также можете прочитать переменные среды, используя ENVIRON["variable"]
в своем скрипте (для некоторой переменной среды с именем variable
), или просмотреть аргументы командной строки с помощью ARGV[n]
, где n
— некоторое положительное целое число.
С помощью $1
в awk
вы бы ссылались на значение первого поля в текущей записи, но, поскольку вы используете его в блоке BEGIN
, данные еще не были считаны ни из одного файла.
Число в вашем коде интерпретируется как ноль, поскольку это пустая переменная, используемая в арифметическом контексте.
socat
должно подойти.
Инструментsocat
позаботится обо всех ваших потребностях в (двунаправленном )передаче чего угодно куда угодно. Требуется всего пара аргументов, каждый из которых указывает одну из вещей, которые нужно соединить вместе. Наиболее интересными вариантами в данном случае являются TCP:host:port
,TCP-LISTEN:port
и FD:
или OPEN:
. Каждый аргумент также может состоять из пары элементов, разделенных !!
, где первый элемент будет прочитан, а другой записан.
Таким образом, минимальное расширение вашего примера на основеnc
-может выглядеть примерно так:
Конец сервера:
mkfifo in in_rot out out_rot
rot13 < in > in_rot &
rot13 < out > out_rot &
socat TCP:localhost:22 OPEN:in_rot!!OPEN:out &
socat TCP-LISTEN:2222 OPEN:out_rot!!OPEN:in &
Это можно упростить, избавившись от именованных FIFO и используя FD:
для ссылки на каналы, настроенные в Bash.
Как написано, это подходит только для одноразового использования.(socat
завершится после закрытия соединений ). Вы можете либо запустить его в бесконечном цикле, либо настроить модуль systemd .socket
или что-то вроде xinetd
, чтобы он прослушивал вас и запускал этот скрипт при подключении.
На стороне клиента можно сделать очень похожим образом (прослушивание какого-то локального порта и подключение к серверу на 2222 ), или вы можете опустить часть TCP -LISTEN и вместо этого запустить все целиком. как ProxyCommand
из ssh
(, вы можете затем поместить его в свой .ssh/config
и использовать ssh, как если бы не было туннеля ).
Если вы когда-нибудь захотите туннелировать больше, чем просто соединение SSH, обратите внимание, что socat
также имеет опцию TUN:
, которая даст вам полноценный -туннельный интерфейс, поэтому вы можете тривиально превратить его в настоящий ВПН.