Проблемы с пониманием перенаправления в каналах и субоболочках :Буду очень признателен за объяснение кода

крапива -pbkdf2 документы он использует HMAC -SHA256 в качестве своей псевдо -случайной функции; два других используют HMAC -SHA1. Nettle имеет реализацию PBKDF2 -HMAC -SHA1, но я не уверен, что вы можете легко получить ее из командной строки. (HMAC -SHA256, как правило, является лучшим выбором, если у вас есть возможность; SHA1 следует избегать ).

(Конечно, вы также не должны использовать 1 итерацию. Я предполагаю, что это только для тестирования.)

2
11.10.2021, 11:56
1 ответ

Это из-за пули 4 OP, что это работает так, с fd , унаследованным от различных процессов создания/исполнения. Я не пишу все места, где происходит fork/exec. Я, конечно, упрощаю некоторые из них (со встроенным -в командах... ). Ссылки на документацию предоставлены для Linux, но предполагается, что такое же поведение произойдет в любой системе, подобной POSIX или POSIX -.

  1. последняя часть строки:3>&1выполняется первой:fd 1, указывающая на терминал, дублируется как fd 3 (обычно используется системный вызовdup2(2)).
  2. Перед разветвлением создается канал, обычно с использованием системного вызова pipe(2),на следующих доступных fd s :, скажем, 4 и 5. Затем процесс подготовки разветвляется на будущее echoи будущее cat. proto -echo dups 5 to 1 ("перезапись" там, где он указывает на :терминал ), закрывает 5 и выполняет echo, proto -cat dups2 ()4 to 0, закрывает 4 и execs cat. fd 3 наследуется везде.
  3. >&3делает противоположное пуле 1 :дублирует fd 3 (указывает на клемму )на fd 1. Таким образом, сторона записи канала была заменено и теперь закрыто(dup2(2)говорит :«Если дескриптор файла newfd был ранее открыт, он автоматически закрывается перед повторным использованием». ). Ничего никогда не будет записано в трубу. Терминал получает testи отображает его.
  4. параллельно catоткрывает и усекает файл назначения resultи начинает чтение из канала. Это запускает EOF в соответствии с pipe(7), потому что сторона записи закрыта/была закрыта :cat.
  5. основной процесс оболочки не имеет дочерних элементов :выполнение завершается

Результат:testна терминале и пустой файл result.

1
11.10.2021, 13:34

Теги

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