scp giữa hai máy chủ từ xa từ máy tính của tôi (thứ ba)


136

Tôi có hai máy chủ từ xa.
host1-> 10.3.0.1
host2-> 10.3.0.2
Cả hai đều chạy máy chủ ssh.

Máy chủ ssh lắng nghe trên cổng 22 trong host1 và trên cổng 6969 trong host2. Bây giờ, bằng cách sử dụng máy cục bộ của mình, tôi cần sao chép một cái gì đó từ host1 sang host2 mà không cần đăng nhập vào host1 hoặc host2 qua ssh. Cái gì đó như,

scp user@10.3.0.1:/path/to/file user@10.3.0.2/path/to/file

Làm thế nào tôi có thể làm điều này, xin lưu ý rằng hai máy chủ sử dụng các cổng khác nhau cho ssh.


Bạn đang hỏi liệu bạn có thể chuyển từ một máy chủ từ xa sang một máy chủ từ xa không, hoặc bạn đang hỏi làm thế nào để làm điều đó mà không phải cung cấp mật khẩu?
glenn jackman

Mặc dù -Pcờ tồn tại để chỉ định cổng sẽ sử dụng, nhưng trong trường hợp chuyển từ xa sang từ xa, ssh không có hành vi xác định nào về cách chỉ định cổng cho mỗi máy chủ ...
mveroone

Câu trả lời:


216

Trước đây, cách thức scphoạt động, khi được gọi ( ngây thơ ) để sao chép các tệp giữa các hệ thống từ xa, rất bất tiện: ví dụ: nếu bạn viết

    scp user1@remote1:/home/user1/file1.txt user2@remote2:/home/user2/file1.txt

scpđầu tiên sẽ mở một sshphiên trên remote1, và sau đó nó sẽ chạy scptừ đó đến remote2. Để làm việc này, bạn sẽ phải thiết lập thông tin xác thực ủy quyền cho remote2 trên remote1.

Thay vào đó, cách hiện đại để làm điều đó, ("hiện đại" bởi vì nó đã được thực hiện chỉ một vài năm trước đây và có lẽ không phải ai cũng có -3khả năng scp) có thể yêu cầu hai bước. Bước cần thiết đầu tiên là sử dụng ~/.ssh/configđể thiết lập tất cả các tùy chọn cho kết nối với cả remote1 và remote2, như sau:

    Host remote1.example.org
    Port 2222
    IdentityFile /path/to/host1-id_rsa

    Host remote2.example.org
    Port 6969
    IdentityFile /path/to/host2-id_rsa

Bằng cách này, có thể chuyển tất cả các tùy chọn cần thiết cho lệnh mà không có sự mơ hồ : ví dụ, nếu chúng ta đã nói trên CLI sử dụng cổng 2222 mà không có cấu hình ở trên, thì chúng ta sẽ không rõ liệu chúng ta đang đề cập đến remote1 hay remote2 , và tương tự như vậy đối với tệp chứa các khóa mật mã. Bằng cách này, CLI vẫn gọn gàng và đơn giản.

Thứ hai, sử dụng -3tùy chọn, như sau:

    scp -3 user1@remote1:/home/user1/file1.txt user2@remote2:/home/user2/file1.txt

Các -3tùy chọn chỉ thị scpđịnh tuyến lưu lượng thông qua máy tính mà trên đó các lệnh được ban hành, mặc dù nó là một bên thứ 3 để việc chuyển giao. Bằng cách này, thông tin ủy quyền phải chỉ nằm trên PC phát hành, bên thứ ba.


6
Để tham khảo trong tương lai: Nếu bạn sao chép một tệp giữa hai máy chủ chia sẻ tệp nhận dạng (như phiên bản EC2), thì bạn không cần tệp cấu hình. Đối số một -i là đủ để kết nối với cả hai máy chủ.
Artur Czajka

1
Cũng đáng chú ý, đối với Google Compute Engine, có hỗ trợ để thêm vào ~/.ssh/configtệp của bạn : cloud.google.com/compute/docs/gcloud-compute nhưng tôi không nghĩ rằng AWS có hỗ trợ tương tự
modulitos

1
Vì bạn sẽ không thấy đầu ra như bình thường, nên một mẹo là kích hoạt chế độ dài dòng với -v.
holmberd

6

Lần trước tôi đã thử điều này, scp đã không thể làm điều đó. Dòng lệnh của bạn trông ổn. Cách giải quyết này sẽ hoạt động:

ssh -p port_on_machine1 user@machine1 "cat /path/to/file/one"|ssh -p port_on_machine2 user@machine2 "cat >/path/to/file/two"

trang scp man của tôi nói rằng "Bản sao giữa hai máy chủ từ xa cũng được cho phép."
glenn jackman

1
Cảm ơn, thật tốt khi nghe. Để scp bạn có thể đưa ra một cờ -P (nó được viết bởi một số người BSD, điều này bởi vì việc xử lý đối số của nó rất bi thảm :-(), nhưng có vẻ như bạn không thể chỉ định các cổng khác nhau trên các máy chủ từ xa. Tôi xin lỗi, nhưng tôi nghĩ, chỉ có cách giải quyết này (hoặc có rất nhiều giải pháp phức tạp hơn, sử dụng ssh nhưng tránh scp - ví dụ: sftpfs, nhưng chúng không đơn giản nhất). Tôi đã mở rộng cách giải quyết của mình với cài đặt cổng.
user259412

4

Trong trường hợp của tôi, tôi đã làm một điều khiển từ xa đến bản sao từ xa, trong đó có -3đối số. Cổng được cung cấp với tham số '-P' hoạt động với máy chủ thứ 1, nhưng cổng 22 được sử dụng với cổng thứ hai.

ssh -P 1234 user@server1.mydomain.com user@server2.otherdomain.com

Giải pháp là chỉnh sửa /etc/ssh/ssh_configtệp trong server1và thêm các dòng sau:

Host *.otherdomain.com
   Port  1234

Theo cách này, cổng 1234 được sử dụng cho cả hai. Nó có thể khác nhau quá.

Giải pháp này có thông lượng tốt hơn các giải pháp trước đây, bởi vì giao tiếp là trực tiếp.


perez có cách nào để đạt được scp thông qua hai cổng khác nhau cho hai máy từ xa khác nhau từ dòng comman không?
Chai đỏ

4

Nguồn và đích có thể được chỉ định làm URI dưới dạng scp: // [user @] host [: port] [/ path]

để bạn có thể chạy:

scp -3 scp://user@10.3.0.1:22/path/to/file scp://user@10.3.0.2:6969/path/to/file
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.