QA가 오랫동안 기다려온 Prod 배포 기능을 승인했기 때문에 안도의 한숨을 쉬었습니다. 그러나 프로세스의 일부로 해당 기능이 로컬 개발자 및 QA 테스트 시스템 외부에서 작동하는지 확인하는 데 사용할 수 있는 테스트 계정이 있는 UAT 환경에 먼저 배포됩니다.
하지만... 테스트 스위트를 실행하면 많은 실패가 발생합니다!
항상 관련성이 높은 "하지만 내 컴퓨터에서는 작동합니다!"라고 답장하세요.
무슨 일을 하시나요? 코드가 작동한다고 확실합니다. 물론이죠. 그렇다면 문제는 UAT 환경에 있는 것일까요? 하지만 환경에 어떤 문제가 있을 수 있을까요? 새로 생성된 테스트 계정이 잘못 구성되었을 수 있습니까? 아마도 그렇다고 생각합니다. 환경에 대한 로그에 액세스할 수 있지만 실패한 시나리오에서는 문제를 식별하는 로그가 없는 것으로 제한되었습니다. 내부적으로 조상 개발자들을 저주합니다.
또 다른 옵션이 있나요? 원격 디버깅! 이는 좋은 생각이지만 앱을 지속적으로 사용하는 환경에서는 거의 실용적이지 않습니다. 코드가 "핫 경로"에 있는 경우 어떤 요청이 귀하의 것인지 알아내는 데 행운이 있기를 바랍니다. 또한 앱 속도가 크게 느려질 수 있습니다.
기본적으로 원하는 것은 마치 로컬 시스템에 배포된 것처럼 애플리케이션을 디버깅하지만 UAT 서버의 데이터베이스를 디버깅하는 것입니다. 그러나 UAT 서버는 로컬 애플리케이션에서 직접 액세스할 수 없으므로 운이 좋지 않습니다.
아니면 당신인가요? 걱정하지 마세요. SSH 터널이 여러분을 구해줄 것입니다.
SSH 터널이란 무엇입니까? 그리고 어떻게 사용하나요?
짧은 답변:
SSH 터널링을 사용하면 애플리케이션이 마치 원격 시스템에 배포된 것처럼 작동하여 UAT 데이터베이스에 액세스할 수 있습니다.
긴 답변:
Linux ssh 명령은 "포트 전달" 기능을 제공합니다. 물론 "포트 포워딩"이라는 용어는 설명하기가 매우 어렵습니다. 따라서 StackOverflow에서는 여기에서 설명할 수 있는 것보다 SSH 터널링에 대해 더 자세하고 훨씬 쉽게 설명할 수 있도록 하겠습니다. 여기에서 읽을 수 있습니다: https://unix.stackexchange.com/a/115906. 텍스트 기반 답변보다 훨씬 이해하기 쉬운 다이어그램이 포함되어 있으므로 답변을 읽어 보시기를 권합니다.
하지만 관련 섹션은 여기에 복사하겠습니다.
ssh -L 123:farawayhost:456 remotehostlocal: -L 로컬(클라이언트) 호스트의 지정된 포트가 원격 측의 지정된 호스트 및 포트로 전달되도록 지정합니다.
ssh -L sourcePort:forwardToHost:onPort connectToHost는 다음을 의미합니다. ssh를 사용하여 connectToHost에 연결하고 local sourcePort에 대한 모든 연결 시도를 ForwardToHost라는 시스템의 포트 onPort로 전달합니다. connectToHost 시스템에서 도달했습니다.
사용 사례의 샘플 명령은 다음과 같습니다.
ssh -L 568e74c5956ba89112fe7fdaabb41460:b2f665a9b90666d6a83e424219399c6f:dc3263fd61fcd67fbc142f42df1434e2 5d52d8acfe7b7e4852ce923bbefbb027
참고로 여기서 JumpHost는 b2f665a9b90666d6a83e424219399c6f
이 사실을 알아내고 나면 나머지는 모두 순조롭게 진행됩니다!
단순히 명령을 실행하면 로컬 호스트:7a8b497a9383281f27af4426603fe5b4에서 UAT 데이터베이스에 액세스할 수 있습니다. 거의 마법같은 느낌이에요!
여러 데이터베이스에 연결해야 하는 경우 이 명령을 여러 번 실행해야 합니다. 또는 구성 파일을 동적으로 읽어 여러 SSH 터널을 열 수 있는 bash 스크립트를 작성할 수 있습니다.
저는 Java 프로그래머로서 bash와 같은 동적으로 유형이 지정되는 언어에 대해 걱정하기보다는 정적으로 컴파일된 Java 코드를 다루는 것을 선호합니다. 그래서 저는 jsch 라이브러리를 활용하여 여러 SSH 터널을 생성하고 유지 관리하는 확장 가능한 프로젝트를 준비했습니다. 여기에서 확인할 수 있습니다: https://github.com/darshitpp/java-ssh-tunnel
java-ssh-tunnel └── src └── main ├── java │ └── dev │ └── darshit │ └── java_ssh_tunnel │ ├── Main.java │ ├── MultiTunneler.java │ ├── Tunneler.java │ └── ssh │ ├── TunnelDetails.java │ └── UserDetails.java └── resources
모든 것이 순조롭게 진행되면 stdout에 다음과 같은 출력이 표시됩니다
Starting tunneling... ddcb5c1bacff0836f10cdd2321f9f344:8a6b8c664579886bf5b95b43fd19938f is available on localhost:64967425d451d2d8f5c2863f9f50868c Press Enter to terminate the tunnels...
위의 방법은 매우 편리하지만 PROD에 연결하는 데 사용하지 마세요. 네, 강조해서 굵은 글씨로 써야 했어요. 메시지를 stderr에도 인쇄할까요? 아래에 댓글을 달아주세요.
위 내용은 Java를 사용한 SSH 터널링의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!