Як придушити вихід команди bash


0

Я знайшов такий спосіб перевірити, чи доступний хост на даному порту, однак мене цікавить лише код статусу команди, тому я намагаюся щось подібне:

[CptBartender@somewhere ~]$ <dev/tcp/host/port ; echo $?
0

Це добре працює, якщо я спробую відкрити порт, проте якщо я перевіряю закритий порт, я отримую:

[CptBartender@somewhere ~]$ <dev/tcp/host/blocked_port ; echo $?
-bash: connect: Connection refused
-bash: /dev/tcp/host/blocked_port: Connection refused
1

Наступним моїм кроком було спробувати відкинути виходи першої команди, тому я спробував:

[CptBartender@somewhere ~]$ <dev/tcp/host/blocked_port >/dev/null/ 2>&1; echo $?
-bash: connect: Connection refused
-bash: /dev/tcp/host/blocked_port: Connection refused
1

Той самий вихід. Мої запитання полягають у тому, чому перша команда надруковує будь-який вихід і як я не можу це зробити?

Відповіді:


2

Це не команда, яка друкує вихід. У вас немає жодної команди - < /dev/tcp/…це просто регулярне перенаправлення вводу і обробляється самою оболонкою.

(І не тільки це, але перепризначення обробляються зліва направо, тому <Перенаправлення обробляється перед тим в 2>&1одному, так що це не може бути перенаправлений в будь-якому випадку .)

Ви можете обійти це, виконавши "команду" в нижній частині. Наприклад:

( </dev/tcp/$host/$port ) 2>/dev/null

Насправді здається, що в цьому випадку передплатка не потрібна; командна група буде працювати, навіть якщо вона знаходиться в межах одного процесу - вона все ж змушує спочатку обробити "зовнішні" переспрямування:

{ </dev/tcp/$host/$port; } 2>/dev/null

Бічна примітка: /dev/tcpце магічний шлях, яким керує сам bash - він насправді не існує в Linux / dev, але може бути використаний з bash переспрямками. Однак цей трюк не буде працювати #!/bin/sh, і все ж є ймовірність, що він не працюватиме з bash на деяких старих системах (які відключали цю функцію) або на деяких не-Linux системах.


Бонусні бали за пояснення, що команда </dev/tcp/...зовсім не є командою (я не був точно впевнений, що це було ... тепер я знаю: "нічого не робіть і прийміть це як вхід ... о зачекайте - його не існує") . Крім того, він працює, якщо я просто змінюю порядок, щоб перенаправлення помилки було першим. У будь-якому випадку, дякую!
CptBartender
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.