ProxyCommand sử dụng cho nhiều bước nhảy và xác thực nhanh chóng


17

Làm thế nào tôi có thể viết lại lệnh sau với ProxyCommand?

ssh -l username1 -t jumphost1 \
ssh -l username2 -t jumphost2 \
ssh -l username3 -t jumphost3 \
ssh -l username4    server

Điều này không làm việc

ssh -o ProxyCommand="\
ssh -l username1 -t jumphost1  \
ssh -l username2 -t jumphost2  \
ssh -l username3 -t jumphost3" \
    -l username4    server

username1@jumphost1's password:
Pseudo-terminal will not be allocated because stdin is not a terminal.
Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
ssh_exchange_identification: Connection closed by remote host

Tôi biết về việc sử dụng nó với nc, nhưng tôi đang tìm cách sử dụng nó với hơn 3 bước nhảy và cũng sử dụng tùy chọn này với scp. Tôi đã kiểm tra ssh_configtrang người đàn ông, nhưng ít nhất là thông tin cho tôi.

BIÊN TẬP

Tôi đã thử sử dụng ProxyCommandlồng trong một cái khác ProxyCommandnhư được đề xuất dưới đây nhưng tôi luôn nhận được một cái gì đó dọc theo các dòng sau

debug3: ssh_init_stdio_forwarding: 192.17.2.2:2222
debug1: channel_connect_stdio_fwd 192.17.2.2:2222
debug1: channel 0: new [stdio-forward]
debug2: fd 4 setting O_NONBLOCK
debug2: fd 5 setting O_NONBLOCK
debug1: getpeername failed: Bad file descriptor
debug3: send packet: type 90
debug2: fd 3 setting TCP_NODELAY
debug3: ssh_packet_set_tos: set IP_TOS 0x10
debug1: Requesting no-more-sessions@openssh.com
debug3: send packet: type 80
debug1: Entering interactive session.

May mắn thay, vì 7.3 -Jhoặc ProxyJumpphục vụ mục đích của tôi - mặc dù tôi vẫn phải làm việc xung quanh việc thiết lập các phím của mình.

ssh -q -J user1@jumphost1,user2@jumphost2,user3@jumphost3 user@server

Câu trả lời:


25

Các ncphiên bản không được khuyến khích nữa. Sử dụng công -Wtắc, được cung cấp trong các phiên bản gần đây của OpenSSH. Ngoài ra, bạn không cần phải sao chép cấu hình vào các máy chủ khác! Tất cả các cấu hình cần phải được thực hiện trên máy chủ của bạn và nó không can thiệp scpvào bất kỳ cách nào. Chỉ cần tạo một tệp ~/.ssh/configvới:

Host jumphost1
  User username1
Host jumphost2
  User username2
  ProxyCommand ssh -W %h:%p jumphost1
Host jumphost3
  User username3
  ProxyCommand ssh -W %h:%p jumphost2
Host server
  User username4
  ProxyCommand ssh -W %h:%p jumphost3

Và sau đó kết nối bằng cách sử dụng ssh serverhoặc sử dụng scp file server:path/. Nếu bạn khăng khăng oneliner (hoặc không chắc ý của bạn về việc ProxyCommandlàm tổ), thì như đã chỉ ra, đó là địa ngục của sự trốn thoát:

ssh -oProxyCommand= \
  'ssh -W %h:%p -oProxyCommand= \
    \'ssh -W %h:%p -oProxyCommand= \
      \\\'ssh -W %h:%p username1@jumphost1\\\' \
    username2@jumphost2\' \
  username3@jumphost3' \
username4@server

Về cơ bản bạn cần phải đi từ bên trong.


Cảm ơn. Đã thử một lớp lót, không hoạt động. Tôi không biết nếu đó chỉ là lối thoát. Bạn có thể kiểm tra lại được không? Ngoài ra, bạn có thể giải thích tại sao lồng là cần thiết và chuỗi không hoạt động?
1.61804

1
Chà, cái gì "không hoạt động!" nghĩa là? Chaining hoạt động, nhưng không phải với scp, bởi vì SCP đang mong đợi các tin nhắn kiểm soát SCP, nhưng thay vào đó lại nhận được các tin nhắn điều khiển SSH và thất bại. Mặt khác, ProxyCommandnó thực hiện một cách trong suốt và do đó, ngoài cùng ssh(hoặc scp) sẽ nhận được các tin nhắn trực tiếp từ đầu kia.
Jakuje

Tôi đoán > dấu nhắc đang chờ để ngắt dòng tiếp tục, tôi đoán - tức là lệnh không bao giờ thực thi.
1.61804

1
@TrevorBoydSmith Bởi vì nó yêu cầu bạn phải cài đặt một số chương trình bên ngoài (nc) trên tất cả các máy chủ proxy. Chuyển hướng IO sử dụng -W không cần điều đó và chỉ yêu cầu là phải cài đặt máy khách openssh trên máy tính của bạn.
Jakuje

2
@RomanDodin nhân đôi %nên hoạt động: %%htrong trường hợp của bạn
Jakuje

-1

Tôi đã làm điều này với hai bước nhảy, nhưng nó sẽ làm việc cho ba. Cách đơn giản nhất là ~/.ssh/configđặt tập tin trên mỗi máy chủ. Vì vậy, nếu bạn muốn bật hostavà truy cập hostdthông qua hostbvà hostc`, bạn có thể đặt cấu hình của mình như vậy:

Trong hosta:~/.ssh/config:

Host hostd
    User username
    ProxyCommand ssh hostb nc %h %p 2> /dev/null

Trong hostb:~/.ssh/config:

Host hostd
    User username
    ProxyCommand ssh hostc nc %h %p 2> /dev/null

Trong hostc:~/.ssh/config:

Host hostd
    User username
    ProxyCommand ssh hostd nc %h %p 2> /dev/null

Sau đó, bạn có thể ssh hostdvào bất kỳ máy chủ nào trong chuỗi và bạn sẽ tìm đường đến hostd.

Sử dụng netcat cho proxy không can thiệp vào scp.

Nếu vì lý do nào đó bạn thực sự không muốn sử dụng các ~/.ssh/configtệp cục bộ , bạn có thể thực hiện việc này trên hosta:

ssh -oProxyCommand='ssh -oProxyCommand=\'ssh -o ProxyCommand=\\\'ssh username@hostd nc %h %p 2>/dev/null\\\' username@hostc nc %h %p 2> /dev/null' username@hostb nc %h %p 2> /dev/null' username@hostd

Như tôi đã nói, tôi biết về ncviệc sử dụng. Bạn thực sự có thể viết lại lệnh tôi đã đăng với ProxyCommandtư cách là một tùy chọn không?
1.61804

Bạn đề cập đến "bạn biết về việc sử dụng nó nhưng muốn sử dụng scp". Nó không can thiệp vào scp. Nhưng tôi sẽ cung cấp cho bạn lệnh dài hài như một bản chỉnh sửa trong thời gian ngắn.
DopeGhoti

Cảm ơn. Bạn có thể viết lại câu trả lời của bạn tập trung vào ProxyCommandlồng nhau không? Nếu bạn đọc lại bài viết của tôi, bạn sẽ thấy đó là ý chính. Tôi nghĩ rằng tôi có thể, thay vì làm tổ như bạn đã làm, xâu chuỗi tất cả các nút giữa ProxyCommand. Tôi vẫn tự hỏi nếu điều đó bằng cách nào đó có thể.
1.61804

Đó là trong thực tế những gì đang được thực hiện; nó chỉ khó đọc hơn nhiều so với cấu hình tại chỗ vì tất cả các trích dẫn lồng nhau (và ngày càng thoát). Bạn phải làm theo cách đó bởi vì bạn đang mang theo tất cả các ProxyCommandchỉ thị cùng với bạn đến máy chủ tiếp theo trong chuỗi.
DopeGhoti

Cái này sai. Cấu hình chỉ có trên máy tính cục bộ của bạn, không được phân phối giữa các máy chủ trên đường khi bạn cố gắng đề xuất.
Jakuje
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.