
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
, 'bb
및 cc'
. 이것이 당신이 보는 것입니다.
일반적으로 우리는 그 반대를 원합니다. 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