쉘 스크립트의 일부로 백그라운드에서 터널을 실행하는 방법

쉘 스크립트의 일부로 백그라운드에서 터널을 실행하는 방법

나는 이것들을 실행한다두 가지 명령항상 다음과 같이 방화벽 뒤에서 보호되는 AWS의 내 rds 인스턴스에 연결합니다(따라서 ec2 인스턴스를 통해 터널링합니다).

명령 1: 터널 열기(백그라운드에서 실행)

ssh -N -L port:host:5432 user@$ip -i ~/.ssh/key.pub &

명령 2: 터널 포트를 통해 DB에 연결:

PGPASSWORD=password psql dbname -U user -h ip_address -p port;

굉장합니다. 하지만 저는 이 두 가지를 하나의 함수에 넣고 싶습니다. 하지만 나에게는 아무것도 효과가 없었습니다.

시도 1: 배경 없이 실행:

function db()
{
    ssh -N -L port:host:5432 user@$ip -i ~/.ssh/key.pub &
    PGPASSWORD=password psql dbname -U user -h ip_address -p port;
}

단순히 나에게 이렇게 말합니다.

$proddb
[1] 62924
psql: could not connect to server: Connection refused
    Is the server running on host "127.0.0.1" and accepting
    TCP/IP connections on port 6666?

초기 명령이 백그라운드에서 실행 중이지만:

ps aux | grep host
(standard input):435:abdullah         62924   0.0  0.0  4315660   5828 s006  S     3:06PM   0:00.03 ssh -N -L port:host:5432 user@$ip -i ~/.ssh/key.pub

그 후 즉시 다음 명령을 실행하면 .. DB에 잘 연결됩니다!

PGPASSWORD=password psql dbname -U user -h ip_address -p port;
user=>

이 작업을 어떻게 수행하나요?

답변1

두 번째 명령이 실행될 때 첫 번째 명령은 터널을 설정할 시간이 없었으므로 "연결이 거부되었습니다"가 발생했습니다.

그냥 사용하지 말고 &대신 옵션을 사용하세요-f:

-f
명령 실행 직전에 ssh에 백그라운드로 이동하도록 요청합니다. 이는 ssh가 비밀번호나 패스프레이즈를 요청하지만 사용자가 백그라운드에서 이를 원하는 경우에 유용합니다. 이는 -n을 의미합니다. 원격 사이트에서 X11 프로그램을 시작하는 데 권장되는 방법은 ssh -f host xterm과 같은 방법을 사용하는 것입니다.
ExitOnForwardFailure 구성 옵션이 "yes"로 설정된 경우 -f로 시작된 클라이언트는 백그라운드에 배치되기 전에 모든 원격 포트 전달이 성공적으로 설정될 때까지 기다립니다.

이 모든 것을 종합하면 함수의 ssh 줄을 다음으로 바꿉니다.

ssh -o ExitOnForwardFailure=yes -f -N -L port:host:5432 user@$ip -i ~/.ssh/key.pub

그런 식으로 함수를 여러 번 실행하면 (다중-1) 쓸모없는 SSH 실행이 종료되지 않습니다.

-N짧은 원격 절전 명령으로 대체하는 것도 가능합니다 . 이렇게 하면 종료해야 하는 경우 검색해야 하는 오래 지속되는 유휴 ssh 명령이 없습니다. SSH는 종료되기 전에 터널 사용이 끝날 때까지 기다리므로 짧은 지연은 문제가 되지 않습니다.

ssh -o ExitOnForwardFailure=yes -f -L port:host:5432 user@$ip -i ~/.ssh/key.pub sleep 15

답변2

@AB의 이 솔루션은 백엔드 호스트에 대한 SSH 포트 전달 터널을 사용하여 dmz(인터넷 또는 에지 엔드포인트)와 mz(백엔드) 사이에 "점프 서버"를 생성하는 데에도 사용할 수 있습니다. 예:

(모든 해당 포트는 방화벽-cmd를 사용하여 열어야 함)

desthost_ip는 액세스 중인 서비스의 대상 IP입니다. 여기에 바인딩된 응답 프로세스(예: tomcat, webapp 등)가 있어야 합니다.

DMZ 가장자리에서:

ssh -o ExitOnForwardFailure=yes -f -L localhost_ip:port:desthost_ip:port user@dest_ip -i xyz.key sleep 15

따라서 localhost에도 공개 IP가 있는 경우; desthost에 https 기반 서비스가 실행 중이라고 가정하면 다음과 같이 작동할 수 있습니다.

https://public_ip_of_localhost:port

그러면 desthost_ip:port 서비스 웹페이지가 나타납니다.

ssh -o ExitOnForwardFailure=yes -f -L 192.168.1.199:8001:192.168.2.10:8081 [email protected] -i xyz.key sleep 15

그리고

https://192.168.1.199:8001 

또는

https://public_ip_for_192.168.1.199:8001

에 서비스 페이지가 나타납니다 192.168.2.10:8081.

관련 정보