Тяжелый ответ, похоже, состоит в том, чтобы перекомпилировать и sshd, и krb5-libs. Чудо программного обеспечения с открытым исходным кодом.
Он идет как битовый поток. Вот как оно отправляется и как оно принимается. Интерфейсами являются файловые дескрипторы(или дескрипторы). Простой файл также обрабатывается таким образом.
См.:
./program
получает вывод echo
в виде файла, а именно стандартный файл потока /dev/stdin
. Демо:
echo foo | wc -c
echo foo | wc -c /dev/stdin
Выходы:
4
4 /dev/stdin
Примечание. :потоковый файл несколько отличается от файла, хранящегося на диске. Мы можем получать доступ к данным случайным образом в обычном файле, но не в потоковом файле. Это как разница между проигрывателем компакт-дисков и радио, играющим песню. На проигрывателе компакт-дисков мы можем перематывать назад, вперед, искать и пропускать песни. Радио просто выводит (или транслирует )то, что вещатель отправляет прямо сейчас .
Где хранится поток? ОС сохраняет его во временном буфере данных , размер которого зависит от ОС. См. Насколько велик буфер канала?
На более низком уровне ОС использует файловые дескрипторы , а не имена файлов. Дескрипторы файлов — это просто стек чисел, для которого каждый идентификатор процесса имеет свой собственный стек. Linux также разрешает доступ к потоку /dev/stdin
, (, который всегда является файловым дескриптором "0" ), таким образом:
echo foo | wc -c /proc/self/fd/0
Выход:
4 /proc/self/fd/0
Еще одну абстракцию Linux можно увидеть с realpath
утилитой:
realpath /dev/stdin /proc/self/fd/0
Вывод (на текущем терминале в моей системе):
/dev/pts/2
/dev/pts/2
Буквы pts
означаютP seudo T терминал s. Этот последний номер 2
всегда будет варьироваться между терминалами, так что это ненадежное имя,но эти числа можно использовать для таких трюков, как:Как отправить вывод с одного терминала на другой без создания нового канала или файла .
Канал — это форма перенаправления (передачи стандартного вывода в другое место назначения ), которое используется в Linux и других Unix-подобных -операционных системах для отправки вывода одной команды/программы/процесса в другая команда/программа/процесс для дальнейшей обработки. Системы Unix/Linux позволяют подключать стандартный вывод команды к стандартному выводу другой команды. Вы можете сделать это, используя символ вертикальной черты «|».
Конвейер используется для объединения двух или более команд, и в этом случае выходные данные одной команды действуют как входные данные для другой команды, а выходные данные этой команды могут действовать как входные данные для следующей команды и так далее. Его также можно представить как временное соединение между двумя или более командами/программами/процессами. Программы командной строки, выполняющие дальнейшую обработку, называются фильтрами.
Эта прямая связь между командами/программами/процессами позволяет им работать одновременно и позволяет непрерывно передавать данные между ними, а не передавать их через временные текстовые файлы или через экран дисплея. Каналы являются однонаправленными, т. е. поток данных слева направо по конвейеру.
Синтаксис:
command_1 | command_2 | command_3 |.... | command_N
Пример :Список всех файлов и каталогов и его ввод в команду more.
$ ls -l | more
Команда more
использует вывод ls -l
в качестве входных данных. Чистый эффект этой команды заключается в том, что вывод ls -l
отображается по одному экрану за раз. Трубы действуют как контейнер, который принимает выходные данные ls -l
и передает их more
в качестве входных данных. Эта команда не использует диск для подключения стандартного вывода ls -l
к стандартному вводу more
, поскольку конвейер реализован в основной памяти. С точки зрения операторов перенаправления ввода/вывода приведенная выше команда эквивалентна следующей последовательности команд.
$ ls -l -> temp
more -> temp (or more temp)
[contents of temp]
rm temp