Чому потрібно використовувати </> використання / 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

Чому ці символи потрібні для того, щоб називати певні речі в баші?


2
Що ви маєте на увазі під "дзвінками"? Будь ласка, покажіть нам, що ви робите, коли отримаєте помилку. Ви намагаєтесь його виконати? Навіть якби на титульній сторінці google був виконуваний код, я б не рекомендував його.
ctrl-alt-delor

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

Я редагував ваше запитання, щоб сказати, що я маю на увазі.
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 -ще один приклад файлу, який обробляється спеціально. Замість того, щоб робити a 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

Здається, ви плутаєте ідеї чи читаєте файл та виконуєте команду. Різниця між даними та інструкцією.

Титульна сторінка Google не є виконуваною програмою. І якби це було, це не було б безпечно запустити.

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

Ми могли б зробити. 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

1
Ви отримаєте іншу помилку, якщо файл існує, але він не виконується.
Бармар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.