내 실수는 어디에 있습니까? 질문에 대한 답변으로스택 교환 질문, 디렉토리를 tar하고 아카이브를 원격 시스템으로 전송합니다. 원격 시스템에서 tee
이를 파일에 저장하고 tar
압축을 풀기 위해 파이프합니다.
내 원래 명령은... 생성은 되지만 생성되지는 않습니다.tar -cf - mydir | ssh [email protected] bash -c "tee archive.tar | tar -xf -"
mydir
archive.tar
더 간단한 테스트를 위해 cat
저는 리모컨 에 쓴 /tmp/outfile
다음 . 그러나 파일은 건드리지 않은 것 같습니다./tmp/outfile
tee
tee
$ ssh [email protected] rm -r /tmp/outfile
$ echo data | ssh [email protected] bash -cx "cat > /tmp/outfile"
+ cat
$ echo DATA | ssh [email protected] bash -cx "tee /tmp/outfile"
DATA
+ tee
$ ssh [email protected] cat /tmp/outfile
data
/tmp/outfile
존재하지 않는 경우 tee
생성하지 마십시오.tee
DATA로 덮어쓰면 어떨까요 ?/tmp/outfile
원격 서버에 로그인하여 실행하면 예상대로 작동합니다.
원격 서버는 Centos 8을 실행 중입니다. 나는 항상 오류가 명백한 것처럼 느껴지지만 그것을 볼 수 없습니다.
답변1
이것은 고전적인 인용 문제이지만 이 경우에는 확실히 해결하려고 노력했습니다. 귀하의 tar
구조를 고려하십시오.
ssh [email protected] bash -c "tee archive.tar | tar -xf -"
로컬 셸은 이를 일반적인 처리, 따옴표 제거, 대체 변수 등의 일부로 평가합니다. 최종 결과는 ssh
실행을 위해 큰따옴표 없이 명령줄이 수신되고, 이것이 실행을 위해 원격 셸로 전달되는 것입니다.
bash -c tee archive.tar | tar -xf -
인스턴스 는 인수로 bash
할당되며 , as로 전달된 값은 그대로 유지됩니다(나중에 무시됨) . 이 인스턴스에서 실행되는 명령에는 나열된 출력 파일이 없으므로 해당 내용을 다음으로 파이프합니다.tee
-c
archive.tar
$0
tee
bash
표준 출력캡처 및 처리되는 위치입니다 tar
.
올바른 방법은 에 전달된 명령 문자열을 인용하여 ssh
다음과 같은 명령을 제공하는 것 입니다.
ssh [email protected] 'tee archive.tar | tar -xf -'