다중 홉 및 프롬프트 인증에 ProxyCommand 사용


18

ProxyCommand?로 다음 명령을 어떻게 다시 쓸 수 있습니까?

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

작동하지 않습니다

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

와 함께 사용하는 것을 알고 nc있지만 3 + 홉과 함께 사용하는 방법을 찾고 있으며이 옵션을와 함께 사용합니다 scp. ssh_config맨 페이지를 확인 했지만 정보가 매우 부족합니다.

편집하다

아래 제안 된대로 ProxyCommand다른 중첩 된 것을 사용하려고 ProxyCommand했지만 항상 다음 줄을 따라 무언가를 얻습니다.

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.

다행히도 키 설정을 해결해야하지만 , 그 이후로 7.3 -J또는 그 ProxyJump목적을 달성했습니다.

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

답변:


26

nc버전은 더 이상 사용하지 않는 것이 좋습니다. -W최신 버전의 OpenSSH에서 제공되는 스위치를 사용하십시오 . 또한 구성을 다른 호스트에 복사 할 필요가 없습니다! 모든 구성은 호스트에서 수행해야 scp하며 어떤 식 으로든 방해하지 않습니다 . 다음을 사용하여 파일 ~/.ssh/config을 만드십시오 .

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

그리고 사용하여 연결 ssh server또는 사용 scp file server:path/. oneliner를 주장하거나 ProxyCommand중첩 에 대해 무엇을 의미하는지 확실하지 않으면 이미 지적했듯이 탈출의 지옥입니다.

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

당신은 기본적으로 안으로 들어가야합니다.


감사. 하나의 라이너를 시험해 보았습니다. 이스케이프 만인지 모르겠습니다. 다시 확인해 주시겠습니까? 또한 중첩이 필요한 이유와 체인이 작동하지 않는 이유를 설명 할 수 있습니까?
1.61803

1
음, "작동하지 않는 것은 무엇입니까!" 평균? scpSCP가 SCP 제어 메시지를 기다리고 있지만 SSH 제어 메시지를 받고 실패하기 때문에 체인이 작동하지만로 작동하지는 않습니다 . 반면에, ProxyCommand투명하게 수행하므로 가장 바깥 쪽 ssh(또는 scp)이 다른 쪽 끝에서 직접 메시지를 가져옵니다.
Jakuje

내가 얻을 > 명령 결코 실행하는, 즉 - 내 생각, 메시지가 어디 행 계속 휴식을 기다리고 있습니다.
1.61803

1
@TrevorBoydSmith 모든 프록시 호스트에 외부 프로그램 (nc)이 설치되어 있어야하기 때문입니다. -W를 사용하는 IO 리디렉션에는 필요하지 않으며 컴퓨터에 openssh 클라이언트가 설치되어 있어야합니다.
Jakuje

2
@RomanDodin double %작동해야합니다 : %%h귀하의 경우
Jakuje

-1

나는이 홉 을 두 번 했지만이 작업은 세 번 작동합니다. 가장 간단한 방법은 ~/.ssh/config파일을 각 호스트에 설정하는 것입니다. 따라서 켜져 hosta있고 hostdvia hostb및 hostc`를 사용하려면 구성을 다음과 같이 설정할 수 있습니다.

에서 hosta:~/.ssh/config:

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

에서 hostb:~/.ssh/config:

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

에서 hostc:~/.ssh/config:

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

그런 다음 ssh hostd체인의 모든 호스트에서이 작업을 수행 할 수 있습니다 hostd.

프록시에 netcat을 사용해도 간섭하지 않습니다 scp.

어떤 이유로 로컬 ~/.ssh/config파일 을 사용하지 않으려면 다음을 수행하십시오 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

내가 말했듯이, 나는 nc사용을 알고있다 . ProxyCommand옵션으로 게시 한 명령을 실제로 다시 작성할 수 있습니까 ?
1.61803

"사용을 알고 있지만 사용하고 싶다"는 말이 있습니다 scp. 를 방해하지 않습니다 scp. 그러나 나는 편집 적으로 만화 적으로 긴 명령을 줄 것이다.
DopeGhoti

감사. ProxyCommand중첩에 중점을 둔 답을 다시 작성할 수 있습니까? 내 게시물을 다시 읽으면 그것이 요점임을 알 수 있습니다. 나는 당신처럼 중첩하는 대신 모든 중간 노드를에 연결할 수 있다고 생각했습니다 ProxyCommand. 나는 그것이 어떻게 든 가능한지 여전히 궁금합니다.
1.61803

그것은 실제로 행해지고있는 것입니다. 모든 중첩 된 (그리고 점점 더 이스케이프 된) 따옴표로 인해 현장 구성 보다 읽기가 훨씬 어렵습니다 . ProxyCommand체인의 다음 호스트로 모든 지시문을 가지고 있기 때문에 그렇게해야합니다 .
DopeGhoti

이것은 잘못이다. 구성은 로컬 컴퓨터에만 있으며 제안하려고하는 동안 호스트간에 분산되지 않습니다.
Jakuje
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.