비밀번호 프롬프트가 스크립트의 후반부를 방해하지 않도록 ssh-agent에 내 키를 추가하는 동안 원격 Host1을 통해 원격 Host2에서 명령을 실행하려면 어떻게 해야 합니까?
기본적으로 비밀번호 프롬프트로 인해 중단되지 않고 원격 Host1을 통해 원격 Host2에서 명령을 실행하려고 합니다. (로컬 컴퓨터는 원격 Host2에 직접 SSH를 통해 연결할 수 없습니다.) [SSH는 키 인증을 사용하도록 설정되어 있습니다. ]
최종 결과는 궁극적으로 파일을 파이핑하는 것이지만 더 일반적인 설명이 여전히 관련이 있다고 생각합니다.
다음과 같이 명령을 중첩하면:
ssh -t Host1 "ssh Host2 "cat remotefile.mp4""
브로커에 키가 없기 때문에 Host1의 비밀번호를 묻는 메시지가 나타납니다.
이 명령의 출력을 Host2에서 로컬 시스템의 다른 프로세스로 파이프하려면 암호 프롬프트도 파이프되거나 리디렉션됩니다.
그래서 관련 명령을 실행하기 전에 Hosts1의 키를 에이전트에 가져오기 위해 다음을 수행하는 것에 대해 생각했습니다.
ssh -t Host1 "`eval ssh-agent -s`; ssh-add ~/.ssh/host1-id_key; ssh-add -l; ssh Host2 "cat remotefile.mp4""
그러나 올바른 구문을 사용하여 bash에서 위 명령을 연결/중첩하는 데 문제가 있습니다.
나는 얻다:
syntax error near unexpected token `;;'
나는 이것이 백틱 명령 대체 구문과 관련이 있다고 생각하며 그것이 무엇을 의미하는지 완전히 이해하지 못한다는 것을 인정합니다.
동일한 결과로 다음 변형을 시도했습니다.
ssh -t Host1 "`eval ssh-agent -s` && ssh-add ~/.ssh/host1-id_key && ssh-add -l; ssh Host2 "cat remotefile.mp4""
ssh -t Host1 << HERE
`eval ssh-agent -s`;
ssh-add ~/.ssh/host1-id_key;
ssh-add -l;
ssh Host2 "cat remotefile.mp4"
HERE
원격 셸에서 실행되는 여러 명령, 특히 eval ssh-agent 명령을 성공적으로 연결/중첩하는 방법입니다.
답변1
를 사용하여 프록시 전달을 활성화할 수 있습니다 -A
. 이렇게 하면 ssh-agent
원격 호스트에서 로컬 호스트로 연결할 수 있습니다.
ssh -A Host1 ssh Host2 cat remotefile.mp4
만약 너라면언제나프록시를 에 전달하려면 Host1
에 다음을 추가하면 되며 ~/.ssh/config
을 지정할 필요가 없습니다 -A
.
Host Host1
ForwardAgent yes
프록시 전달의 보안 위험에 유의하십시오. ssh(1)
매뉴얼 페이지 에서 :
프록시 전달은 주의해서 활성화해야 합니다. 원격 호스트(에이전트의 UNIX 도메인 소켓용)에서 파일 권한을 우회할 수 있는 사용자는 전달된 연결을 통해 로컬 에이전트에 액세스할 수 있습니다. 공격자는 프록시에서 키 자료를 얻을 수 없지만 프록시에 로드된 ID를 사용하여 인증할 수 있는 키에 대한 작업을 수행할 수 있습니다. 더 안전한 대안은 점프 호스트(-J 참조)를 사용하는 것입니다.
-J
대안은 매뉴얼 페이지에 설명된 대로 jumphost( ) 옵션을 사용하는 것입니다 . 유연성은 떨어지지만 첫 번째 호스트에서 SSH를 통해 두 번째 호스트에 연결하는 것뿐이라면 잘 작동합니다. 이를 사용하기 위해 예제 명령을 다음과 같이 수정합니다.
ssh -J Host1 Host2 cat remotefile.mp4
이는 TCP 전달( )을 통해 원격 호스트에 연결을 -J Host1
지시합니다 .ssh
Host2
Host1
항상 점프 호스트로 연결하려면 다음에서 이를 수행할 수 있습니다 Host2
.Host1
~/.ssh/config
Host Host2
ProxyJump Host1
그런 다음 실행하면 ssh Host2 cat remotefile.mp4
터널 ssh
을 통해 자동으로 연결이 설정됩니다 Host1
.