Как подключить вывод netcat? Проблемы с xargs и кавычками

Я пытаюсь передать все, что nc получает с этим:

nc -l 20000 | xargs /root/test 

… и он отлично работает, за исключением случаев, когда xargs получает цитируемые аргументы – он разбивает их, как если бы они были отдельными …

Итерация по аргументам ( /root/test ) показывает, что они не переданы правильно:

 for i in $*; do echo "$i" done 

Отправка echo 'test1 test2' на порт 20000 (nc) приводит к:

 echo 'test1 test2' 

Я попробовал инкапсулировать запрос (что nc получает) в двойные кавычки и избегать любых кавычек (например, "echo \'test1 test2\'" ) в соответствии с этим ответом: https://unix.stackexchange.com/a/38151/224371 , но это не помогло, я просто получил:

 echo \'test1 test2\' 

  • Импортировать SQL-файлы с помощью xargs
  • Почему xargs вырезает цитаты из ввода?
  • Один лайнер, чтобы увидеть, вернул ли grep что-то?
  • опция xargs -I
  • / usr / bin / awk: слишком длинный список аргументов
  • Массовое переименование файлов на камкордерах, включая пробелы
  • цикл через выход одной команды и использовать в другой команде
  • Можете ли вы подключиться к функции .bash_profile?
  • One Solution collect form web for “Как подключить вывод netcat? Проблемы с xargs и кавычками”

    netcat не должен влиять на данные, отправленные через него, поэтому я пропущу это и сосредоточусь только на трубопроводах для xargs.

    Вот:

     echo "aa 'bb cc'" | xargs 

    оболочка удаляет один набор кавычек, отправляя строку aa 'bb cc' в xargs. xargs по умолчанию принимает цитируемые строки как отдельные элементы (удаление кавычек), передавая строки aa и bb cc в команду, которую он запускает.

    Здесь, с другой стороны:

     echo "aa \'bb cc\'" | xargs 

    оболочка снова разбивает один набор кавычек, оставляя aa \'bb cc\' . Одиночные кавычки (с или без обратных косых черт) не являются особыми в двойных кавычках. Однако двойные кавычки в двойных кавычках должны быть экранированы.

    xargs видит эту строку, делает свое собственное удаление цитат, но поскольку кавычки теперь экранированы, она просто удаляет обратную косую черту и разделяет пробелы. Оставляя три строки: aa , 'bb и cc' . Это то, что вы видели.

    Обычно мы хотим обратное: избегать использования кавычек xargs, поскольку они могут быть частями имени файла. Итак, вы видите пять десятков вопросов, рекомендующих xargs -0 или xargs -d'\n' . Но если вы хотите, чтобы xargs обрабатывали строки с кавычками, вам нужно отправить кавычки на него без сохранения.

    Другая проблема заключается в том, что ваш тестовый скрипт использует $* . Без кавычек это разделит все аргументы на пробелы и выполнит глобусы по результирующим словам. (С кавычками это приведет к конкатенации аргументов как одной строки.) Вы почти всегда хотите использовать "$@" . Или здесь просто:

     for i do echo "$i" done 

    или даже:

     printf '%s\n' "$@" 

    Итак, проверьте экранирование кавычек и используйте "$@" вместо $* .

     $ cat args.sh for x in "$@" ; do echo ":$x" ; done $ echo "aa 'bb cc' \"dd ee\"" aa 'bb cc' "dd ee" $ echo "aa 'bb cc' \"dd ee\"" | xargs ./args.sh :aa :bb cc :dd ee 
    Interesting Posts

    Удалить определенные номера строк из текстового файла с помощью sed?

    Использование фильтров ethtool для балансировки очередей NIC

    используя awk для создания нового файла, приводит к проблемам с использованием одного конкретного столбца, не может понять, что не так

    Существует ли QT4 эквивалент gksu, не зависящий от KDE-библиотек?

    утилита регистрации файлов типа буфера

    Использовать GnuPG по умолчанию в Evolution

    ssh переходит к динамическому серверу через шлюз с ключом

    ssed -R по сравнению с perl -pe

    Как включить службу только в том случае, если она установлена ​​в Puppet?

    Как я могу сделать readline добавить предварительно введенный текст при запуске терминала?

    Есть ли GUI для Linux, который не использует X11?

    Подключение к хосту с помощью SSH-клиента в Linux через прокси-сервер

    Интернет-гейзер USB 3G продолжает работать на ноутбуке с Fedora 20

    Как создать связь между интерфейсами, маршрутом и процессом

    контрольное число запущенных программ в bash

    Linux и Unix - лучшая ОС в мире.