저는 이 명령을 처음 접했습니다. 로컬 폴더를 gzip으로 압축하고 원격 서버에서 압축을 풀려고 합니다. 문제는 gzip 압축과 압축 해제가 즉시 이루어져야 한다는 것입니다. 나는 많은 것을 시도했고 가장 가까운 것 중 하나는 다음과 같습니다.
tar cf dist.tar ~/Documents/projects/myproject/dist/ | ssh [email protected]:~/public_html/ "tar zx ~/Documents/projects/myproject/dist.tar"
위에서 볼 수 있듯이 dist 폴더를 원격 서버로 보내려고 하는데 그 전에 폴더를 즉석에서 압축하려고 합니다(위 명령에서는 이런 일이 발생하지 않는 것 같습니다.).
- 로컬 폴더:
~/Documents/projects/myproject/dist/
- 원격 폴더
~/public_html
: (직접 배포하고 온라인으로 전환)
물론 gzip으로 생성된 파일은 존재하지 않아야 하며 즉시 발생해야 합니다.
내 의도 는 sh file.command
. 프로젝트를 변경할 때마다 이 작업을 수동으로 수행하고 싶지 않습니다.dist
sh
답변1
rsync
그런 다음 기존 파일을 활용하여 차이점(예: 파일의 다른 부분)만 전송할 수 있도록 이를 사용하는 경우 :
rsync -az ~/Documents/projects/myproject/dist/ [email protected]:public_html/
--delete
매번 대상 디렉터리 트리를 완전히 덮어쓰려면 플래그를 추가하세요 . 무슨 일이 일어나고 있는지 보려면 를 추가하세요 -v
.
하나도 없으면 rsync
덜 효율적인 이 솔루션을 사용하는 tar
것으로 충분합니다.
( cd ~/Documents/projects/myproject/dist && tar czf - . ) |
ssh [email protected] 'cd public_html && tar xzf -'
압축된 타르볼 쓰기 및 읽기는 다음을 통해 수행됩니다.표준 출력그리고표준 입력( -
파일 이름). GNU를 사용하는 경우 처리하기 전에 올바른 디렉토리를 설정할 tar
수 있지만 -C
여기서는 구식(전통적인? cd
) 을 사용하고 있습니다. v
무슨 일이 일어나고 있는지 확인하려면 (수신 측에) 플래그를 추가하세요 tar xzvf ...
.
답변2
tar
디스크에 파일을 생성하는 대신 출력을 STDOUT으로 보내야 ssh를 사용하여 유선으로 보낼 수 있습니다.
$ tar -zcf - /path/to/files | ssh user@host "tar -zx - -C /path/to/destination"
파일 이름을 사용할 때 "-" 문자를 참고하세요. 이 명령은 송신 tar에게 STDOUT에 쓰라고 지시하고 수신 tar에는 STDIN에서 읽도록 지시합니다. 아카이브 데이터는 로컬 디스크에 기록되지 않습니다.
ssh로 로그인할 때 경로를 지정할 수 없으므로(적어도 방법은 전혀 몰랐습니다) tar
수신자에게 출력을 쓸 위치를 알려주어야 합니다. 이것이 바로 그 목적입니다 -C /path/to/destination
.
현재 작성된 대로 이 명령은 파일이 로컬 디렉터리에 중첩된 원격 측에 기록되도록 합니다.
/path/to/files/index.html --> /path/to/destination/path/to/files/index.html
대신 원한다면 /path/to/destination/index.html
이렇게 말하세요.
$ tar -zcf - -C /path/to/files . | ssh user@host "tar -zx - -C /path/to/destination"
답변3
tar
tarball이 파일에 기록되도록 지시하고 있습니다 dist.tar
. 이 명령을 사용하면 tarball을 원격 컴퓨터로 보내지 않습니다.
를 사용하여 tar
출력을 작성 해야 합니다 . 하이픈은 을 의미합니다 . 옵션을 추가하면 tar는 tarball을 작성하기 전에 압축합니다 . 이는 tarball을 원격 시스템으로 보낼 때 모든 사용 사례의 99%에서 좋은 생각입니다.stdout
-f -
stdout
-z
stdout
원격 측에서는 tar -x
. 귀하의 예에서는 -z
원격 측에서만 선택할 수 있습니다. 이것은 전혀 논리적이지 않습니다. 양쪽 모두 동일한 압축 방법을 선택해야 합니다. 즉, -z
양쪽에 사용하거나 양쪽에 사용하지 않는 것입니다.
이것은 당신에게 유용할 수 있습니다
tar -czf - ~/Documents/projects/myproject/dist/ | ssh [email protected] "tar -C ~/public_html/ -xzf -"
(면책조항: 시도해 보지 않았습니다. 버그가 있을 수 있습니다.)
리모컨은 tar
tarball에서 읽어야 하므로 stdin
이쪽에도 파일 이름을 제공하지 않습니다.
답변4
당신은 두 가지 일을 성취하려고 노력하고 있습니다 :
- 디렉터리 트리를 원격 사이트에 복사
- 전송 중인 데이터 압축
다른 답변에서는 두 가지 목표를 모두 달성하는 rsync 사용에 대해 언급합니다(rsync에 "-z" 옵션을 제공하면 압축이 가능함).
tar는 목표 #1을 달성하기 위한 훌륭한 도구이며 명령줄 옵션(다른 답변에 제공된 "z" 플래그와 같은)을 사용하면 목표 #2도 달성할 수 있습니다.
SSH 연결 자체를 사용하여 압축 목표를 달성할 수도 있습니다. SSH에는 기본적으로 꺼져 있지만 명령줄이나 ssh_config 파일에서 활성화할 수 있는 압축 옵션이 있습니다(참조:https://linux.die.net/man/5/ssh_config). 압축이 활성화된 SSH 버전 2는 "gzip -6" 압축을 사용하여 얻은 압축 수준과 동일합니다.
이러한 옵션을 모두 결합할 때 가장 좋은 점은 파이프라인을 조정하여 최상의 결과를 얻을 수 있다는 것입니다. SSH 연결에서 압축을 활성화하거나 tar/rsync 수준에서 압축을 활성화하는 등 어느 것이 더 나은 성능을 제공하는지 실험해야 합니다*.
Tar는 다양한 압축 옵션(gzip, bzip2, lzma 등)을 사용할 수 있으며 rsync의 "-z" 옵션을 사용하면 gzip 압축이 활성화됩니다. 파이프라인의 각 끝에 별도의 압축/압축 풀기 프로그램을 추가하여 압축 수준을 조정할 수도 있습니다. 다음은 SSH 연결에서 압축을 명시적으로 비활성화하면서 bzip2 압축을 추가하는 예입니다.
tar cf - ~/Documents/projects/myproject/dist/ | bzip2 -c -9 | ssh -o Compression=no [email protected] "bunzip2 -c | tar -C ~/public_html/ -xf -"
*"성능"을 측정하려면 CPU 로드, 네트워크의 바이트 수, 압축 수행에 필요한 시간 등 애플리케이션에 가장 중요한 것이 무엇인지 결정해야 합니다. 파이프라인을 조정하고 측정을 수행하여 압축 수준 변경과 파이프라인에서 압축을 적용하는 위치가 이러한 변수에 어떻게 영향을 미치는지 확인할 수 있습니다.
파이프라인의 여러 지점에서 압축을 활성화해도 성능이 향상되지 않을 수 있습니다.