Cách giải nén lưu trữ qua mạng


8

Tôi có hai máy chủ Solaris. Trên server1 tôi có một tập tin archive.tar.gz. Tôi cần giải nén nó bằng ssh đến server2.

Vì vậy, tôi viết các lệnh:

ssh server2 < archive.tar.gz | gunzip -c | tar -xf - -C /home/

Nhưng tôi đã gặp một lỗi:

Thiết bị đầu cuối giả sẽ không được phân bổ vì stdin không phải là thiết bị đầu cuối.

Làm thế nào để sao chép tập tin chính xác?


Bạn đang hỏi làm thế nào bạn có thể đăng nhập vào server1 và giải nén tệp archive.tar.gz và gửi nó qua sshserver2?
slm

Câu trả lời:


13

Tôi tin rằng bạn có thể làm một cái gì đó như thế này:

$ cat archive.tar.gz | ssh server2 "tar zxvf -"

Nếu bạn cần kiểm soát thư mục nơi nó được giải nén trên server2:

$ cat archive.tar.gz | ssh server2 "cd /path/to/dir; tar zxvf -"

Solaris

Với bạn là trên Solaris, phiên bản tar của bạn có thể không bao gồm bất kỳ tính năng nén nào mà GNU tar cung cấp. Đừng sợ bạn vẫn có thể thực hiện lệnh này, chúng ta chỉ cần phân tách con mèo archive.tar.gzthành một lệnh đầu tiên có thể giải nén tarball.

Một cái gì đó như thế này nên làm:

$ cat archive.tar.gz | ssh server2 "(cd /some/dir; gunzip | tar xf -)"

Hoặc này:

$ gzip -dc < sample.tar.gz | ssh server2 "cd /path/to/dir; tar xvf -"

Hoặc này:

$ gunzip sample.tar.gz | ssh server2 " cd /path/to/dir; tar xvf -"

Solaris tarkhông hiểu xcờ. Vì vậy, hoặc sử dụng gtar(GNU tar) nếu nó được cài đặt, hoặc sử dụng tốt hơn targunzip.
Marco

@Marco - cảm ơn tôi đã hoàn toàn quên rằng những công tắc đó không có trong phiên bản tar của Solaris, hãy để tôi cải tổ nó.
slm

@Marco - xem cập nhật.
slm

1
Tại sao bạn giải nén trước ssh? IMO này có vẻ tốt hơn:cat archive.tar.gz | ssh server2 "(cd /some/dir; gunzip; tar xf -)"
Marco

Mỗi phiên bản Solaris đều có g (un) zip, hỗ trợ zip chỉ không được biên dịch thành tar.
Marco

1
ssh server2 < archive.tar.gz

Bạn không chuyển bất kỳ lệnh nào tới ssh, vì vậy nó sẽ thực thi một trình bao ở phía xa. Nội dung của archive.tar.gzđược chuyển đến shell đó trên đầu vào tiêu chuẩn của nó, vì vậy nó cố gắng phân tích nó như một kịch bản shell. Sự vui nhộn có thể xảy ra sau đó, hoặc không, tùy thuộc vào nội dung của tệp.

Nó không rõ ràng trong mô tả của bạn, nơi bạn đang chạy các lệnh này. Nếu bạn đang ở trên server1, có archive.tar.gztrên server1 và muốn trích xuất kho lưu trữ trên server2, sau đó chuyển lưu trữ sang server2 và chạy lệnh trích xuất ở đó.

<archive.tar.gz ssh server2 'cd /home && gunzip | tar -xf -'

Hoặc, đăng nhập vào server2, gắn hệ thống tệp của server1 qua sshfs và giải nén tệp lưu trữ giống như bạn giải nén tệp cục bộ.

mkdir /tmp/server1
sshfs server1:/ /tmp/server1
cd /home
gunzip </tmp/server1/path/to/archive.tar.gz | tar -xf -
fusermount -u /tmp/server1

wow, sshfsthật tuyệt vời!
knocte

0

Bạn có thể mở rộng kho lưu trữ vào một thư mục hiện có cụ thể mà không cần sử dụng cdlệnh như thế này:

$ cat archive.tar.gz | ssh server2 "tar zxvf - -C /path/to/dir"

Nếu bạn không biết nếu thư mục thoát, bạn có thể sử dụng:

$ cat archive.tar.gz | ssh server2 "mkdir -p /path/to/dir && tar zxvf - -C /path/to/dir"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.