Эмуляция netcat -e - PullRequest
       19

Эмуляция netcat -e

12 голосов
/ 07 июня 2011

Как я могу эмулировать netcat -e с версией netcat, у которой нет опции -e?

Мне нужно запустить команду удаленно. Я могу сделать это с Netcat - без -e:

#! / Bin / Баш

netcat -l 8080; myCommand.sh

Это бы сработало, , но Я хотел бы ответить клиенту в зависимости от успеха или неудачи команды (чтобы иметь своего рода REST-подобный интерфейс).

Как я мог это сделать?

Спасибо!

Ответы [ 2 ]

13 голосов
/ 17 ноября 2011
mkfifo foo
nc -lk 2600 0<foo | /bin/bash 1>foo

Тогда просто nc имя сервера 2600 и ./script.sh

убить клиента с помощью Ctrl + C

4 голосов
/ 07 июня 2011

Лучший способ - перейти на версию netcat, которая его поддерживает.В Debian / Ubuntu IIRC правильно вы должны использовать netcat традиционный , а не netcat openbsd :

 sudo apt-get install netcat-traditional # netcat-openbsd

У вас будет возможность точно указать, какая версия вам нужна:

 nc.traditional server 6767 -e myscript.sh

 nc.openbsd -l 6767

( обратите внимание на тонкие различия в использовании опции ).Как вы можете видеть (ниже), nc.traditional может быть запущен как автономный бинарный файл, в зависимости только от самой libc и linux, поэтому, если у вас нет разрешений на установку, вы можете просто удалить автономный бинарный файл где-то (файловая система с разрешением exec, конечно) и запустите ее как

 /home/user/bin/mynetcat server 6767 -e myscript.sh

HTH


$ ldd `which nc.{traditional,openbsd}`

/bin/nc.traditional:
    linux-gate.so.1 =>  (0xb7888000)
    libc.so.6 => /lib/libc.so.6 (0xb7709000)
    /lib/ld-linux.so.2 (0xb7889000)
/bin/nc.openbsd:
    linux-gate.so.1 =>  (0xb77d0000)
    libglib-2.0.so.0 => /lib/libglib-2.0.so.0 (0xb76df000)
    libc.so.6 => /lib/libc.so.6 (0xb7582000)
    libpcre.so.3 => /lib/libpcre.so.3 (0xb754c000)
    /lib/ld-linux.so.2 (0xb77d1000)
...