netcat의 출력을 파이프하는 방법은 무엇입니까? xargs 및 따옴표 관련 문제

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\'

답변1

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, 'bbcc'. 이것이 당신이 보는 것입니다.

일반적으로 우리는 그 반대를 원합니다. xargs가 파일 이름의 일부일 수 있으므로 따옴표를 처리하도록 허용하지 마십시오. 따라서 여기에는 56개의 질문 권장 사항 xargs -0이나 xargs -d'\n'대안이 표시됩니다. 그러나 xargs가 따옴표 붙은 문자열을 처리하도록 하려면 따옴표를 이스케이프 처리하지 않고 보내야 합니다.

또 다른 문제는 테스트 스크립트가 $*따옴표 없이 를 사용한다는 것입니다. 이렇게 하면 모든 매개변수가 공백으로 분할되고 결과 단어에 대해 글로빙이 수행됩니다. (따옴표를 사용하면 매개변수가 단일 문자열로 연결됩니다.) 거의 항상 this 를 사용하려고 합니다 "$@". 아니면 여기 그냥:

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

관련 정보