본문 바로가기

Programmer/JAVA

Java에서 원격 Windows 서버 디스크 용량 확인 (테스트 서버 대상)

기능 테스트용 Windows 서버의 디스크 용량을 확인해야 하는 상황이 생겼다.

 

로컬 서버라면 java.io.File이나 Files.getFileStore() 같은 API로
디스크 용량을 쉽게 확인할 수 있지만,
문제는 원격 서버였다.

 

Java 표준 API만으로는
원격 서버의 디스크 상태를 직접 조회하는 방법이 없다.

 

이번 글에서는
운영 서버가 아닌 테스트 서버를 대상으로,
Java에서 원격 Windows 서버의 디스크 용량을 확인하기 위해
실험 삼아 구현해본 방법을 정리해본다.

 

아래 내용은 테스트 서버 기준이기에

운영 환경에 그대로 적용하기에는 보안·안정성 측면에서
추가 고려가 필요하다.


Java 기본 방식의 한계

Java에서는 아래와 같은 방식으로
현재 실행 중인 서버의 디스크 용량을 확인할 수 있다.

 
File root = new File("/"); root.getFreeSpace();

하지만 이 방식은 어디까지나
로컬 서버 기준이다.

 

Java 애플리케이션이 실행 중인 서버, 원격 서버의 디스크 정보 조회

확인이 힘들다.

 

즉, Java만으로는
원격 서버의 디스크 용량을 직접 확인할 수 없다.


테스트 서버에서 선택한 해결 방법

테스트 환경은 다음과 같았다.

Windows Server, SSH 접속 가능, 내부용 테스트 서버

이 조건을 바탕으로
다음과 같은 우회 방법을 선택했다.

 

접근 방식

  1. Java에서 SSH 명령 실행
  2. 원격 Windows 서버에서 wmic 명령 실행
  3. 출력 결과를 Java에서 파싱

사용한 Windows 명령어 (wmic)

 
wmic logicaldisk get size,freespace,caption

이 명령어는 Windows에서 논리 디스크 정보를 출력한다.

항목설명
caption 드라이브 문자 (C:, D:)
freespace 남은 용량 (Byte)
size 전체 용량 (Byte)

테스트 서버에서 사용한 Java 코드

아래는 테스트 서버에서 실제로 사용해본 코드이다.

 
private String getFreeSpace(String user, String host) {
    String command = "\"cmd.exe /c \\\"wmic logicaldisk get size,freespace,caption\\\"\"";
    StringBuilder result = new StringBuilder();
    DecimalFormat df = new DecimalFormat("#,##0.00");

    try {
        // SSH 명령 실행
        ProcessBuilder pb = new ProcessBuilder(
            "ssh",
            user + "@" + host,
            command
        );
        pb.redirectErrorStream(true);
        Process process = pb.start();

        try (BufferedReader reader = new BufferedReader(
                new InputStreamReader(process.getInputStream(), Charset.defaultCharset()))) {

            String line;
            boolean headerSkipped = false;

            while ((line = reader.readLine()) != null) {
                line = line.trim();
                if (line.isEmpty()) continue;

                // 헤더 라인 제거
                if (!headerSkipped && line.toLowerCase().contains("caption")) {
                    headerSkipped = true;
                    continue;
                }

                String[] parts = line.split("\\s+");
                if (parts.length >= 3) {
                    try {
                        String drive = parts[0];
                        long freeBytes = Long.parseLong(parts[1]);
                        double freeGB = freeBytes / Math.pow(1024, 3);

                        result.append(drive)
                              .append(" - ")
                              .append(df.format(freeGB))
                              .append(" GB")
                              .append(System.lineSeparator());
                    } catch (NumberFormatException e) {
                        // 파싱 오류 무시
                    }
                }
            }
        }

        process.waitFor();
    } catch (Exception e) {
        e.printStackTrace();
    }

    return result.toString();
}

 


실행 결과 예시

실행 결과는 다음과 같이 출력된다.

C: - 120.35 GB D: - 850.12 GB

테스트 서버에서 각 드라이브의 남은 용량을 한눈에 확인할 수 있었다.


이 방법의 장점

테스트 서버 기준으로 느낀 장점은 다음과 같다.

  • Java만으로 원격 Windows 디스크 확인 가능
  • 별도의 에이전트 설치 불필요
  • 빠르게 테스트 및 검증 가능
  • 사람이 읽기 쉬운 결과 포맷

한계와 주의할 점

다만 이 방식에는 분명한 한계가 있다.

  • wmic는 Windows에서 점점 deprecated 되는 추세
  • SSH 계정 및 권한 관리 필요
  • 명령 실행 타임아웃 처리 필요
  • 운영 서버에서는 보안 이슈 발생 가능

따라서 이 방식은
운영 서버에서는 보안 이슈로 부적합하다.


마무리

이번 구현은 테스트 서버에서 원격 Windows 디스크 상태를 빠르게 확인하기 위한 목적으로
실험 삼아 만들어본 코드였다.

 

Java에서 원격 서버의 상태를 확인해야 할 경우,
표준 API만으로는 해결되지 않는 부분이 많다는 점을
다시 한 번 느낄 수 있었다.

 

시간이 된다면

다음에는 에이전트 방식이나 PowerShell을 이용해 디스크 정보를 조회하는 방식
정리해볼 생각이다.