SSH를 사용하여 아카이브를 원격 시스템에 다운로드하고 원격 클라이언트에서 아카이브를 추출해 보았습니다. 성능이 더 좋기 때문입니다.
tar xjOf
아카이브를 다운로드한 다음 원격 클라이언트에서 SSH를 통해 파일을 추출하는 매우 간단한 스크립트가 있습니다 . 이제 추출된 파일을 클라이언트에 로컬로 저장할 수 있는 일부 프로세스로 tar 명령의 출력을 파이프하고 싶습니다. tar에는 이 기능이 있어야 한다고 생각하지만 해결책을 찾을 수 없습니다.
#!/bin/bash
ssh $1@$2 'wget https://url.to.my/archive.tar.bz2' #Save the archive to the remote client
ssh $1@$2 'tar archive.tar.bz2 -xjOf' | ??? #What local tool can be used to take the output and save the files from it?
저는 Linux와 쉘 스크립팅을 처음 접했기 때문에 코드를 개선할 수 있는 방법이 많이 있을 것입니다. 하지만 지금은 이러한 파일을 로컬 클라이언트에 저장하는 방법만 알고 싶습니다.
당신의 도움을 주셔서 감사합니다
답변1
원격 시스템에서 아카이브를 다운로드하고 압축을 풀고 로컬 시스템에서 파일을 추출하려면 다음을 수행할 수 있습니다.
you@local ssh <remote> "wget -qO - https://url.to.my/archive.tar.bz2 | bunzip2" | tar x
여기서 일어나는 일은 다음과 같습니다.
- 원격 컴퓨터에서 따옴표 안에 명령을 실행할 수 있습니다. 따라서 다운로드 및 압축 해제는 원격 컴퓨터에서 수행됩니다.
- 이 명령의 출력은 로컬 시스템의 tar로 파이프되어 로컬로 추출됩니다.
- Andre Beaud와 본인이 지적했듯이 이는 압축되지 않은 데이터가 SSH를 통해 원격에서 로컬로 전송된다는 의미이기도 합니다. 이로 인해 더 빠른 원격 압축 해제로 얻은 시간이 원격과 로컬 간의 네트워크 트래픽에서 손실된 시간보다 클 수 있는 균형이 이루어집니다.
- 하지만 좋은 점은 감압이 완료되었다는 것입니다하지만원격 URL에서 다운로드됩니다.
다음은 참고할 몇 가지 사항입니다.
- 여기의 스크립트는 명령줄입니다. 이 명령은 SSH의 기능을 사용하여 원격 컴퓨터에서 명령을 실행합니다.즉시그리고 출력을 로컬 컴퓨터로 반환합니다.
- 항상 그렇듯이 명령이 데이터 스트림을 읽거나(표준 입력) 쓸 수 있는지(표준 출력) 쓸 수 있는지 여부와 명령에 그렇게 하도록 지시하는 방법을 이해하려면 설명서를 읽어야 합니다.
- Wget은 -qO와 함께 사용할 수 있습니다. wget에게 표준 출력(stout)에 쓰도록 지시한 후 대시(-)를 추가합니다.
- Bunzip은 파일이 제공되지 않은 경우에도 작동하며 stin에서 입력을 받아 stout에 씁니다.
- 기본적으로 Tar는 stin에서도 입력을 받습니다.
- 파일 형식은 스트리밍 데이터도 지원해야 합니다. tar 및 bzip2 형식 모두 괜찮지만 모든 형식이 괜찮은 것은 아닙니다. (예: 지퍼)
- 이 경우 wget은 두 개의 인수를 얻습니다. 첫 번째 -q 옵션(quiet)은 로그 및 오류 메시지 출력을 끄기 위해 wget에 추가되었으므로 tar가 읽는 데이터 스트림의 일부가 아닙니다. 두 번째 -O는 쉘 리디렉션과 유사하며 앞에서 언급한 것처럼 다음 대시(-)는 wget에게 표준 출력에 쓰도록 지시합니다.
- 이 출력은 bunzip2로 파이프됩니다. 데이터 스트림이 Bunzip2로 파이프되는 경우 Bunzip2에는 추가 지침이 필요하지 않습니다. 따라서 bunzip2 명령은 wget 명령 바로 뒤에 올 수 있습니다.
- Bunzip2는 tar 아카이브를 입력으로 받아들이고 해당 내용의 압축을 풀 수도 있습니다. 따라서 중간 추가 단계가 필요하지 않습니다.
- wget 및 bunzip2는 전체적으로 따옴표로 묶인 ssh 명령 매개변수로 만들어집니다.
- 그런 다음 전체 출력이 로컬 시스템의 tar로 파이프됩니다. 또한 tar는 기본적으로 stin에서 입력을 받기 때문에 extract 옵션 외에는 다른 옵션이 없습니다.
부록:
이전 답변의 질문을 완전히 이해하지 못했습니다. 로컬 컴퓨터에서 다운로드하고 원격 컴퓨터에서 아카이브를 추출하려는 사람들을 위해 여기에 남겨 두었습니다. 가장 효율적인 방법은 다음과 같습니다.
you@local ssh <remote> "wget -qO - https://url.to.my/archive.tar.bz2 | tar xj"
위의 예에서 파일은 tar에 넣은 것과 동일한 디렉토리 구조를 가진 원격 시스템의 홈 디렉토리로 추출됩니다. 이것을 변경할 수 있습니다 -원격의 기존 폴더로- 다음과 같습니다.
you@local ssh <remote> "wget -qO - https://url.to.my/archive.tar.bz2 | tar xjC <destination/dir>"
답변2
로컬에서 실행하려면 tar가 필요합니다. tar -O는 기본적으로 cat
파일 내용이므로 파일을 다시 만드는 데는 적합하지 않습니다. 빠른 원격 CPU를 활용하기 위해 원격으로 bunzip2를 실행할 수 있습니다. 이제 모든 데이터가 로컬 시스템으로 다시 전송될 때 압축이 풀린다는 점을 기억하십시오. 따라서 대역폭이 최우선인 경우 언제든지 더 빠른 압축 풀기 비용을 잃을 수 있습니다. 제한 요소. 두 가지 방법을 모두 시도해보고 확인해 보세요! 어쨌든, wget 이후에..
# do the bunzip2 from the ssh, then pass the output to (local) tar to extract the files on the local system:
ssh $1@$2 'bunzip2 < archive.tar.bz2'|tar -x
답변3
tar
다음과 같이 아카이브의 압축을 풉니다 : -x=extract, -j=decompress-with-bz2 및 -f=filename. 이렇게 쓰실 텐데요
#!/bin/bash
ssh $1@$2 'wget https://url.to.my/archive.tar.bz2'
ssh $1@$2 'tar -xjf archive.tar.bz2'
결정적인 출력을 얻기 위해 wget -Ofixedname.tar.bz2 ...` wget
와 같은 다른 이름으로 파일을 저장할 수 있으므로 이는 약간 위험합니다 .archive.tar.bz2.1' if a file with the same name already exists. Use
"tar"는 (zip과 달리) 스트리밍 형식이므로 아카이브를 저장하지 않고 즉시 압축을 풀 수 있어 디스크 공간과 IO 작업을 덜 사용합니다.
ssh $1@$2 'wget -O- https://url.to.my/archive.tar.bz2 |tar -xj'
파일 이름이 없고 데이터가 "파이핑" 전에 wget에서 스트리밍되기 때문에 "-f"를 제거했습니다. 일부 내용은 여전히 stderr을 통해 터미널에 인쇄됩니다. wget -qO-
원하는 경우 더 조용한 것을 시도해 보세요. 오류가 발생하면 계속 인쇄되지만 오류가 발생한 경우에만 인쇄됩니다. 이것이 바로 유닉스의 주문입니다. 모든 일이 잘되면 언급하지 마세요.