Tôi có thể đặt stdout trên một máy chủ để stdin trên một máy chủ khác không?


74

stdouttrên một máy chủ CentOS cần được dẫn đến stdinmột máy chủ CentOS khác. Điều này có thể không?

Cập nhật

ScottPack, MikeyB và jofel đều có câu trả lời hợp lệ. Tôi đã trao câu trả lời cho Scott bởi vì, mặc dù câu hỏi của tôi không chỉ định bảo mật là một yêu cầu, nhưng nó luôn luôn tốt để được an toàn. Tuy nhiên, đề xuất của hai nghiên cứu sinh khác cũng sẽ hoạt động.


1
Điều đáng chú ý là lợi thế chính (duy nhất) của phương pháp không ssh là tốc độ thông lượng; nếu bạn đang sử dụng mạng nhanh và bảo mật là không cần thiết thì điều này có thể đáng giá thêm sự bất tiện khi nhập hai lệnh vào hai cửa sổ.
Random832

Câu trả lời:


94

Đây là một không có.

Khi một người sử dụng sshđể thực thi một lệnh trên một máy chủ từ xa, nó sẽ thực hiện một số loại chuyển hướng đầu vào / đầu ra bên trong ưa thích. Trên thực tế, tôi thấy đây là một trong những tính năng đẹp hơn của OpenSSH. Cụ thể, nếu bạn sử dụng sshđể thực thi một lệnh tùy ý trên một hệ thống từ xa, thì ssh sẽ ánh xạ STDINSTDOUTtới lệnh được thực thi.

Với mục đích của một ví dụ, giả sử bạn muốn tạo một tarball dự phòng, nhưng không muốn, hoặc không thể, lưu trữ cục bộ. Chúng ta hãy vui vẻ với cú pháp này:

$ tar -cf - /path/to/backup/dir | ssh remotehost "cat - > backupfile.tar"

Chúng tôi đang tạo ra một tarball và viết nó vào STDOUTnhững thứ bình thường. Vì chúng ta đang sử dụng ssh để thực hiện một lệnh từ xa, STDIN được ánh xạ tới STDINcủa cat. Mà sau đó chúng tôi chuyển hướng đến một tập tin.


11
Đó không phải là bất kỳ loại "chuyển hướng đầu vào / đầu ra nội bộ ưa thích" nào - chỉ là những thứ thông thường, nhàm chán. ssh đọc từ STDIN, giống như bất kỳ công cụ nào khác và chuyển nó đến quy trình từ xa. :)
Daniel Pittman

7
@DanielPittman: Nhưng thật vui hơn khi gọi nó là rác "nội bộ lạ mắt".
Scott Pack

7
Tương tự, netcatở cả hai đầu làm cho một kênh giao tiếp đơn giản, dễ dàng tuyệt vời. tar cf - /path/to/dir | nc 1.2.3.4 5000trên một máy chủ, trên một máy chủ nc -l -p 5000 > backupfile.tarkhác.
MikeyB

1
@MikeyB: Điểm tốt. Netcat là một giao thức văn bản rõ ràng, vì vậy hãy cẩn thận với dữ liệu nhạy cảm. Tôi có xu hướng sử dụng netcat cho những thứ cụ thể hơn như mua lại ổ đĩa mạng (ala dd) qua mạng cục bộ và quét cổng.
Scott Pack

2
@MikeyB: Bạn có những gì với ghế bay và quần của bạn!
Scott Pack

28

Một cách thuận tiện để truyền dữ liệu giữa các máy chủ khi bạn không cần lo lắng về bảo mật qua dây được sử dụng netcatở cả hai đầu trên kết nối.

Điều này cũng cho phép bạn thiết lập chúng không đồng bộ:

Trên "máy thu" (thực sự, bạn sẽ có giao tiếp hai chiều, nhưng sẽ dễ dàng hơn khi nghĩ về nó như thế này), chạy:

nc -l -p 5000 > /path/to/backupfile.tar

Và trên "người gửi", hãy chạy:

tar cf - /path/to/dir | nc 1.2.3.4 5000

Rất tốt để biết. Điều này là tốt nếu kết nối vật lý được tin cậy như có lẽ là một mạng dự phòng hoặc nếu kết nối đã được tạo đường hầm.
Wesley

Hoặc nếu dữ liệu là cái gì đó công khai.
Phường Samuel Edwin

1
+1 netcat là một công cụ vô giá, đặc biệt là khi bạn không có máy chủ ssh đang chạy.
kwarrick

21

Một công cụ rất mạnh để tạo các kết nối hai chiều và hai chiều là socat. Để có cái nhìn ngắn gọn về các khả năng, hãy xem các ví dụ trong trang của nó .

Nó thay thế netcathoàn toàn và các công cụ tương tự và có hỗ trợ cho các kết nối được mã hóa ssl. Đối với người mới bắt đầu, nó có thể không đủ đơn giản, nhưng ít nhất là tốt để biết rằng nó tồn tại.


1
@WesleyDavid: Để "Cập nhật" của bạn: Chỉ để hoàn thiện, tôi đã thêm vào câu trả lời của mình rằng socat có hỗ trợ SSL, vì vậy cũng có thể mã hóa với socat. Tuy nhiên, trong hầu hết các trường hợp, ssh là giải pháp tốt hơn và dễ dàng hơn, vì vậy tôi cũng đã chọn câu trả lời của ScottPack.
jofel

5

TL; DR

Mọi thứ chỉ trở nên phức tạp hơn một chút khi bạn phải sử dụng máy chủ pháo đài .

  1. Bạn có thể chuyển sshnhư lệnh để sshthích như vậy:

    • cat local_script.sh | ssh -A usera@bastion ssh -A userb@privateserver "cat > remote_copy_of_local_script.sh; bash remote_copy_of_local_script.sh"
  2. Cẩn thận với thiết bị đầu cuối giả


Lưu ý rằng điểm quan trọng chính ở đây là ssh, giống như hầu hết các công cụ, chỉ cần xử lý stdoutstdinsửa theo mặc định.

Tuy nhiên, khi bạn bắt đầu thấy tùy chọn như thế nào Disable pseudo-terminal allocation.Force pseudo-terminal allocation.bạn có thể cần phải thực hiện một thử nghiệm và lỗi nhỏ. Nhưng, như một quy tắc chung, bạn không muốn thay đổi ttyhành vi trừ khi bạn đang cố gắng sửa lỗi rác bị cắt xén / nhị phân trong trình giả lập thiết bị đầu cuối (kiểu con người nhập vào).

Ví dụ, tôi có xu hướng sử dụng -Atđể ssh-agent của máy trạm của tôi được chuyển tiếp và do đó, việc chạy tmux từ xa không phải là nhị phân barf (như vậy ssh -At bastion.internal tmux -L bruno attach). Và, đối với docker cũng vậy (như vậy sudo docker exec -it jenkins bash).

Tuy nhiên, hai -tlá cờ đó gây ra một số khó khăn để theo dõi tham nhũng dữ liệu khi tôi cố gắng làm một cái gì đó như thế này:

# copy /etc/init from jenkins to /tmp/init in testjenkins running as a container
ssh -A bastion.internal \
ssh -A jenkins.internal \
sudo tar cf - -C /etc init | \
sudo docker exec -i testjenkins \
bash -c 'tar xvf - -C /tmp'

# note trailing slashes to make this oneliner more readable.

2

Cố gắng đặt khóa công khai ssh của bạn vào một máy chủ khác chỉ bằng một lệnh

ssh root@example.com 'cat >> .ssh/authorized_keys' < .ssh/id_rsa.pub

2

Tôi thấy điều này là dễ nhất, sau khi thiết lập không bắt tay mật khẩu giữa các máy chủ cho người dùng bạn đang chạy lệnh như:

Không nén

tar cf - . | ssh servername "cd /path-to-dir && tar xf -"

Nén khi đang bay

tar czf - . | ssh servername "cd /path-to-dir && tar xzf -"

Sử dụng nén trên tệp tar là một ý tưởng rất tệ nếu bạn sshđã được cấu hình để nén.
Anthon

@Anthon Tại sao quá tệ, và làm thế nào để kiểm tra xem nén ssh đã được bật chưa?
Tom Hale

1
@TomHale Tùy thuộc vào tốc độ hệ thống của bạn, điều này có thể làm chậm hoạt động chung, vì lần nén thứ hai mất thời gian, nhưng không có khả năng cạo các byte bổ sung. Compressioncó thể được đặt trong bất kỳ tệp cấu hình nào, kiểm tra nhanh xem đó có phải là ssh -v localhost exit 2>&1 | fgrep -i compresscung cấp bất kỳ đầu ra nào không (AFAIK không có tùy chọn để bỏ cấu hình vì ssh đã đọc nó).
Anthon

tarcó một -C pathcờ hoạt động cho cả lệnh cxlệnh. Bạn không cần phải đặt một cdlệnh riêng trong đó. (Nhưng thật tốt khi lưu ý rằng bạn có thể chạy nhiều hơn một lệnh.)
Bruno Bronosky

@Bruno, -Clà một phần mở rộng GNU (mặc dù hiện tại cũng được hỗ trợ bởi bsdtar và schily tar)
Stéphane Chazelas
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.