대상 탐색
호스트와 포트 직접 입력은 항상 사용할 수 있습니다. Wi-Fi가 연결되면 별도 탐색 제어기가 현재 /24에서 선택한 TCP 포트를 검색하고, 포트나 Android 기본 네트워크가 바뀌면 결과를 갱신합니다.
| 구현 | Flutter UI, Dart SSH 클라이언트와 터미널 에뮬레이터 |
|---|---|
| 자동 탐색 | 현재 Wi-Fi /24의 254개 주소, 선택한 TCP 포트 하나 |
| 인증 | 사용자명과 비밀번호 |
| 서버 식별 | 호스트·포트별 TOFU 호스트 키 지문 |
탐색은 후보 끝점을 만들 뿐 세션을 자동 시작하지 않습니다. 가용성 확인과 인증·권한을 분리합니다.
딥 링크 경계
WiFi Scanner는 dstools-ssh://connect/connect?host=<host>&port=<port>를 열 수 있습니다. 앱 경계를 건너는 값은 호스트와 포트뿐이며 사용자명·비밀번호·명령·터미널 내용은 제외합니다.
- 자격증명 화면을 열기 전에 대상을 해석하고 검증합니다.
- 호출한 쪽이 끝점을 골랐으므로 딥 링크 진입에서는 전체 탐색을 건너뜁니다.
- 저장된 자격증명은 로컬에서 채울 수 있지만 링크에 들어가지 않습니다.
- Android 샌드박스가 다르므로 다른 앱의 자격증명을 조용히 가져오지 않습니다.
TOFU와 보안 로컬 저장
처음 연결할 때 서버 키 종류와 SHA-256 지문을 보여주고 승인을 받습니다. 승인한 지문은 대상별로 저장합니다. 이후 값이 달라지면 알려진 값을 조용히 바꾸지 않고 호스트 키 변경 경고를 냅니다.
TOFU는 첫 신뢰 이후의 변경을 찾습니다. 처음 만난 끝점이 정당하다는 증명은 아니므로 중요하면 별도 신뢰 경로로 첫 지문을 비교해야 합니다.
저장한 자격증명과 알려진 호스트 지문은 앱의 보안 키-값 경계를 통해 Android 기반 보안 저장소에 둡니다. 사용자가 앱 자료나 항목을 지우기 전까지 로컬에 남습니다.
터미널 자료 경로
인증 뒤 터미널 화면 크기에 맞는 PTY를 엽니다. 표준 출력과 오류를 디코딩해 터미널로 보내고 터미널 입력은 인코딩해 SSH 세션에 씁니다. 크기 변경은 원격 PTY에 반영하며 모바일 키 모음이 화면 키보드에서 누르기 어려운 키를 제공합니다.
- 연결 작업은 터미널 화면의 수명 주기에 묶입니다.
- 화면을 닫으면 보이지 않는 셸을 남기지 않고 세션을 닫습니다.
- 스트림이 끝나면 터미널에 로컬 종료 표시를 남깁니다.
검증과 확인된 제약
Wi-Fi 네트워크 변경, 포트 검색, 탐색 취소, 대상 해석, 보안 저장소, TOFU 결정, 터미널 키 변환, 설정과 지역화 UI 경로를 시험합니다.
- 자동 탐색은 IPv4 /24 편의 기능이며 일반 네트워크 자산 조사가 아닙니다.
- 방화벽과 클라이언트 격리 때문에 접속 가능한 SSH 서버가 보이지 않을 수 있습니다.
- 현재 제품 경로는 비밀번호 인증을 문서화하며 키 파일 절차를 암시하지 않습니다.
- 선택한 호스트에 접근할 권한은 사용자가 확인해야 합니다.