Как подключить вывод 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\' 

  • Найти -exec + vs find | xargs. Какой из них выбрать?
  • Xargs с несколькими записями аргументов - используйте аргумент переменной окружения после sh -c '...'
  • Печать состояния файлов, обрабатываемых при использовании find
  • удалять файлы после вставки в tarball
  • Список протоколов файлов и каталогов на du показывает только размеры каталогов?
  • Как проверить версию xargs?
  • Найти изображения по размеру: find / file / awk
  • Как повторять переменные дважды в xargs
  • 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

    удалить TAG / TAA / TGA

    удаление строк между строками в текстовом файле с помощью awk или sed

    Свободное пространство не восстанавливается после усечения fd

    система блокируется, когда хранилище отключается при использовании опций монтирования nfs bg, hard, nointr

    Рекурсивно переименуйте файлы электронной почты из .txt в .eml

    SELinux предотвращает автоматическое монтирование fstab

    Как назначить управляющий терминал другому процессу?

    Как мне узнать, сколько времени занимает pg_restore в командной строке?

    Pipe Fail (141) при выходе трубопровода в тройник – почему?

    Где мой /etc/init.d/skeleton на OpenSuse 12.3?

    Не удается войти в удаленную систему debian с ключом RSA и ssh.exe от Cygwin

    DNSSEC в корневой зоне? Как это использовать?

    Установите автоматическое завершение для нового типа файлов

    Удаление определенных строк и дубликатов из текстового файла текстового слова 11gb

    mount: warning: / etc / mtab не доступен для записи (например, файловая система только для чтения)

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