Почему <или> требуется использовать / dev / tcp

13

При попытке позвонить /dev/tcp/www.google.com/80, набрав

/dev/tcp/www.google.com/80

Баш говорит no such file or directory. При просмотре кода других людей в Интернете они используют такой синтаксис, как

 3<>/dev/tcp/www.google.com/80

Я заметил, что это работает также:

</dev/tcp/www.google.com/80

Почему эти символы необходимы для вызова определенных вещей в bash?

Джон Доу
источник
2
Что вы подразумеваете под «звонить»? Пожалуйста, покажите нам, что вы делаете, когда получите ошибку. Вы пытаетесь выполнить это? Даже если бы на главной странице гугла был исполняемый код, я бы его не рекомендовал.
Ctrl-Alt-Delor
/dev/tcp/www.google.com/80
Джон
Я отредактировал твой вопрос, чтобы сказать, что я имею в виду.
Ctrl-Alt-Delor

Ответы:

29

Потому что это особенность оболочки (из ksh, скопированной bash) и только оболочки.

/dev/tcp/...не являются реальными файлами, оболочка перехватывает попытки перенаправления в /dev/tcp/...файл, а затем выполняет socket(...);connect(...)(устанавливает соединение TCP) вместоopen("/dev/tcp/..."...) (открывает этот файл) в этом случае.

Обратите внимание, что это должно быть написано так. cat < /dev/./tcp/...или///dev/tcp/... не будет работать, и вместо этого попытается открыть эти файлы (которых в большинстве систем не существует, и вы получите ошибку).

Направление перенаправления также не имеет значения. Используете ли вы 3< /dev/tcp/...или 3> /dev/tcp/...или 3<> /dev/tcp/...или даже3>> /dev/tcp/... не будет никакой разницы, вы будете иметь возможность читать и писать из / в этот файловый дескриптор для приема данных / отправки через этот TCP сокет.

Когда вы это делаете cat /dev/tcp/..., это не работает, потому catчто не реализует ту же особую обработку, это делает open("/dev/tcp/...")как для каждого файла (кроме- ), только оболочка (только ksh, bash) и только для цели перенаправлений.

Это cat -еще один пример пути к файлу, который обрабатывается специально. Вместо этого open("-")он читает непосредственно из файлового дескриптора 0 (stdin). catи многие текстовые утилиты делают это, оболочка не для своих перенаправлений. Чтобы прочитать содержимое -файла, вам нужно cat ./-или cat < -(или cat - < -). Однако на системах, которые не имеют /dev/stdin, bashбудет делать нечто подобное для перенаправлений из этого (виртуального) файла. GNU awkделает то же самое /dev/stdin, /dev/stdout, /dev/stderrдаже в системах , которые имеют такие файлы , которые могут вызвать некоторые сюрпризы на системы , такие как Linux , где эти файлы ведут себя по- разному.

zshтакже имеет поддержку сокетов TCP (и потока домена Unix), но это делается с помощью встроенных ztcpzsocket), поэтому он менее ограничен, чем подход ksh / bash. В частности, он также может выступать в качестве сервера, чего не может сделать ksh / bash. Это все еще намного более ограничено, чем то, что вы можете сделать на реальном языке программирования.

Стефан Шазелас
источник
4

Вы, кажется, путаете идеи или читаете файл и выполняете команду. Разница между данными и инструкциями.

Главная страница Googles не является исполняемой программой. И если бы это было, было бы небезопасно запускать его.

Символы перенаправления (включая <и >) используются для направления данных в команду.

Мы могли бы сделать cat < /dev/tcp/towel.blinkenlights.nl/23Однако это не будет работать, так /dev/tcp/www.google.com/80как этот порт не будет отвечать, пока мы не отправимGET / HTTP/1.0\r\n\r\n

Поэтому постарайтесь

{
  printf >&3 'GET / HTTP/1.0\r\n\r\n'
  cat <&3
} 3<>/dev/tcp/www.google.com/80
Ctrl-Alt-Делор
источник
1
Вы получите другую ошибку, если файл существует, но не является исполняемым.
Бармар