SSH 문서에서 원격 포트 전달에 대해 다음과 같이 말합니다.
포트 인수가 '0'이면 수신 포트가 서버에 동적으로 할당되고 런타임에 클라이언트에보고됩니다. -O forward와 함께 사용하면 할당 된 포트가 표준 출력으로 인쇄됩니다.
이 포트 번호를 어떻게 얻거나 사용할 수 있습니까?
stdout에 인쇄 된 것을 볼 수 있지만 파일에 기록하고 싶습니다.
NAT 방화벽 뒤에있는 컴퓨터가 몇 대 있는데, 모두 중앙 서버에 연결하고 SSH를 통해 다시 연결할 수 있도록 터널을 설정합니다.
현재이 작업을 수행하기 위해 고유 한 포트 번호 (예 : 12345)를 지정합니다.
ssh -R 12345:localhost:22 1.2.3.4
에 연결 1.2.3.4
하고 사용할 수 있으므로 작동 합니다.
ssh -p 12345 localhost
그러나 기록을 유지하는 것이 고통스럽기 때문에 각 컴퓨터에 대해 포트 번호를 하드 코딩하고 싶지 않습니다. 결국 연결이 실패하면 다시 연결이 작동하지 않는 경우가 있습니다 (포트가 여전히 "사용 중"이기 때문에).
대신 다음을 사용할 수 있습니다.
ssh -R 0:localhost:22 1.2.3.4
보고하는 곳 :
Allocated port 41191 for remote forward to localhost:22
하지만 그 포트 번호를 어떻게 기록합니까?
나는 그것에 접근하는 방법에 대해 명백한 것을 놓치고 있다고 가정하고 있습니다.
포트 번호를 파일에 쓸 수있는 쉘 스크립트에서 뭔가를 할 수 있습니까?
이 작업을 수행하는 여러 서버가있을 때 작동하지 않는 한 가지 옵션은 수신 대기 포트를 확인하는 것입니다.
sudo netstat -tpln | grep "127.0.0.1" | grep sshd
약간 낭비적인 것처럼 보이지만 먼저 포트 번호를 얻고 연결을 끊은 다음 사용할 수 있습니다.
port=`ssh -R 0:localhost:22 1.2.3.4 exit 2>&1 | grep 'Allocated port' | awk '/port/ { print $3 }'`;
ssh 1.2.3.4 record-port.sh "my-name" "${port}";
ssh -NTC -o ConnectTimeout=10 -o ServerAliveInterval=30 -o ExitOnForwardFailure=yes -R "${port}:localhost:22" 1.2.3.4;
더 나쁜 또 다른 옵션은 직접 포트를 임의로 선택하고 사용하기 전에 기록하는 것입니다.
while true; do
port=$(((RANDOM %= 1000) + 2000));
ssh 1.2.3.4 record-port.sh "my-name" "${port}";
ssh -NTC -o ConnectTimeout=10 -o ServerAliveInterval=30 -o ExitOnForwardFailure=yes -R "${port}:localhost:22" 1.2.3.4;
sleep 3;
done
포트 전달없이 먼저 마스터 연결을 연결합니다.
ssh -NMS /path/to/socket user@server
/path/to/socket
당신에게 달려 있습니다. 거기에 소켓이 생성됩니다. 사용하려는 스크립트에서 -f
.
그런 다음 -S /path/to/socket -O …
마스터 연결을 제어하는 데 사용 합니다. 예를 들어 여전히 작동하는지 확인할 수 있습니다.
ssh -S /path/to/socket -O check placeholder
placeholder
중요하지 않습니다 /path/to/socket
. 제어하려는 마스터 연결을 식별하는 것입니다.
이제 포트 전달을 요청할 수 있습니다.
ssh -S /path/to/socket -O forward -R 0:localhost:22 placeholder
이 명령은 포트를 알려줍니다. 즉시 종료됩니다. 이는 출력을 캡처 할 수 있음을 의미합니다. 잃어버린 것은 없습니다. 명령을 반복하면 두 번째 포트를 동일한 대상으로 전달하는 대신 동일한 포트를 다시 알려줍니다. 따라서 출력을 변수에 저장해 보겠습니다.
port="$(ssh -S /path/to/socket -O forward -R 0:localhost:22 placeholder)"
그리고 이제 변수를 사용할 수 있습니다.
완전성을 위해 다음은 전달을 취소하는 방법입니다.
ssh -S /path/to/socket -O cancel -R 0:localhost:22 placeholder
마스터 연결을 종료하기 전에 명시 적으로 취소 할 필요는 없습니다. 다음과 같이 종료합니다.
ssh -S /path/to/socket -O exit placeholder
위의 모든 명령이 가장 기본적인 스크립트에 필요한 것은 아닙니다. 다음이 필요합니다.
ssh -fNMS /path/to/socket user@server
port="$(ssh -S /path/to/socket -O forward -R 0:localhost:22 placeholder)"
# anything you want, now you know the port
ssh -S /path/to/socket -O exit placeholder
처리 할 로직이있을 수 있습니다 connection refused
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다