При попытке позвонить /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?
linux
bash
io-redirection
devices
Джон Доу
источник
источник
Ответы:
Потому что это особенность оболочки (из 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
будет делать нечто подобное для перенаправлений из этого (виртуального) файла. GNUawk
делает то же самое/dev/stdin
,/dev/stdout
,/dev/stderr
даже в системах , которые имеют такие файлы , которые могут вызвать некоторые сюрпризы на системы , такие как Linux , где эти файлы ведут себя по- разному.zsh
также имеет поддержку сокетов TCP (и потока домена Unix), но это делается с помощью встроенныхztcp
(иzsocket
), поэтому он менее ограничен, чем подход ksh / bash. В частности, он также может выступать в качестве сервера, чего не может сделать ksh / bash. Это все еще намного более ограничено, чем то, что вы можете сделать на реальном языке программирования.источник
Вы, кажется, путаете идеи или читаете файл и выполняете команду. Разница между данными и инструкциями.
Главная страница Googles не является исполняемой программой. И если бы это было, было бы небезопасно запускать его.
Символы перенаправления (включая
<
и>
) используются для направления данных в команду.Мы могли бы сделать
cat < /dev/tcp/towel.blinkenlights.nl/23
Однако это не будет работать, так/dev/tcp/www.google.com/80
как этот порт не будет отвечать, пока мы не отправимGET / HTTP/1.0\r\n\r\n
Поэтому постарайтесь
источник