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

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

nc -l 20000 | xargs /root/test 

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

  • Разделение параметров
  • Как вы делаете деловые заявления с диапазонами
  • вывод технологического процесса на команду split by line и whitespace
  • Магия netcat для прослушивания и отправки результата
  • В чем разница между использованием netcat (nc) и curl для HTTP-запросов?
  • Отправка списка (текстового файла) файлов и путей в 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\' 

  • команда solaris + xargs для солярия
  • Удаление некоторых из самых больших файлов в каталоге
  • Как узнать, когда NC выполняется передача файла
  • Внутренний вызов функции с параметрами xargs
  • Секунды и даты прыжка
  • Как работает опция -d для чтения bash?
  • 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 
    Linux и Unix - лучшая ОС в мире.