>source

셸 명령을 실행하려고합니다 ( netstat -an -pt , cat /proc/net/tcp ) Android 장치에서 열린 TCP 포트를 확인하기 위해 Java 코드에서. 장치가 루팅되지 않았습니다 (루팅 된 장치에서는 문제가 없습니다).

Java 코드에서 쉘 명령을 호출하는 두 가지 유형이 있음을 알았습니다.

프로세스 개체를 얻으려면 다음을 사용하십시오.

  • Runtime.getRuntime().exec(command);

  • new ProcessBuilder().command("sh", "-c", command).start();

  • 나중에 InputStream 객체를 처리하고 결과를 출력합니다.

    문제는 cat /proc/net/tcp 명령은 빈 문자열이고 결과는 netstat -an -pt is :

    Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address           Foreign Address         State       Active UNIX domain sockets (w/o servers) Proto RefCnt Flags    Type       State       I-Node Path
    
    

    ... 헤더입니다. netstat 명령.

    Android 셸에서 위의 명령을 직접 실행할 때 ( adb shell 루팅되지 않은 장치 내부) 모든 것이 잘 작동하고 명령 출력이 콘솔에 표시됩니다.

    루팅 된 기기에서 작동하기 때문에 권한에 문제가있는 것 같습니다.

    다음 명령 중 하나를 실행할 때의 Logcat 출력 :

    W cat     : type=1400 audit(0.0:3***4): avc: denied { read } for name="tcp" dev="proc" ino=4*2653***6 scontext=u:r:untrusted_app:s*:c**9,c**7,c5**,c*6* tcontext=u:object_r:proc_net_tcp_udp:s0 tclass=file permissive=0
    
    

    이것이 권한 문제인 경우 내 응용 프로그램으로 루팅되지 않은 Android 장치에서 현재 열려있는 TCP 포트를 읽는 다른 방법이 있습니까?

    • 답변 # 1

      나는 부분적으로 충분한 내 대답을 찾았습니다. 기본적으로 문제는 처음에 의심되는 권한에있었습니다.

      문서에 명시된대로 : Android 버전 10에서 /proc/net 파일 시스템이 제한되어 액세스 할 수 없습니다. 운이 좋지 않은 (또는 운이 좋다고 말해야하나요) 내 비 루팅 테스트 장치가 Android 10이므로 읽기 권한이 없기 때문에 프로세스 개체가 상태 1을 반환했을 것입니다. /proc/net 파일 시스템.

      Android 8에서 동일한 코드를 테스트했으며 모든 것이 예상대로 작동했습니다.

      사용 된 포트에 액세스하는 방법을 아직 파악하지 못했지만 이전에 링크 된 문서에서 언급 한대로 NetworkStatsManager 및 ConnectivityManager 클래스를 살펴 보겠습니다.

    관련 자료

  • 이전 javascript - 이 SFTP 다운로드가 왜 그렇게 느린가요?
  • 다음 css - 도움이 필요하다! 이미지 아래에 탐색 링크를 배치하려고합니다