curl 업데이트 뒤 SMB 전송이 안 된다면? 8.23부터 지원이 빠졌다

공유 폴더에서 보고서를 가져오던 스크립트가 curl 업데이트 뒤 멈췄다. SMB를 켜고 다시 빌드해도 안 된다면 그 전송은 무엇으로 옮겨야 할까?

curl 업데이트 뒤 SMB 전송이 안 된다면? 8.23부터 지원이 빠졌다
세 줄 요약
  • curl 8.23.0은 smb://와 smbs:// 전송 지원을 제거했다.
  • 명령줄 curl과 애플리케이션이 쓰는 libcurl의 버전·지원 목록을 각각 확인해야 한다.
  • 공유 파일 다운로드는 smbclient 같은 전용 클라이언트로 옮길 수 있다.

8.23의 SMB 오류는 기능 제거부터 확인한다

업데이트 뒤 SMB URL이 지원되지 않는다는 오류가 나면 curl 버전부터 확인해야 한다. 10월 14일 공개된 curl 8.23.0은 SMB 지원을 제거했다. 예전 버전에서 빌드 옵션으로 기능을 켜던 해결법을 그대로 적용할 수 없다.

libcurl 공식 API 문서도 SMB와 SMBS가 모두 8.23.0에서 제거됐다고 명시한다. 프로토콜 허용 목록을 ALL로 바꿔도 없는 구현이 추가되지는 않는다. 해당 옵션은 라이브러리가 지원하는 프로토콜 중 사용할 범위를 고르는 기능이다.

터미널의 curl과 앱의 libcurl을 따로 본다

명령줄에서는 다음 출력의 버전과 Protocols: 줄을 본다. curl의 --version 옵션은 실행 파일과 연결된 libcurl 정보를 함께 표시한다.

curl --version

PHP 확장이나 다른 프로그램 안에서 실패한다면 터미널 출력만으로 결론을 내리기 어렵다. 그 프로그램이 실제로 사용하는 libcurl을 확인해야 한다. C API에서는 curl_version_info()가 버전과 protocols 목록을 제공한다.

오래된 설치와 8.23의 실패 원인도 구별한다. curl은 8.20.0부터 SMB를 선택적으로 켜는 기능으로 전환했으므로, 그 이후의 이전 버전에서도 빌드에 따라 SMB가 빠질 수 있었다. 반면 8.23에서는 지원 자체가 제거됐다.

공유에 접속한 뒤 get으로 다운로드한다

Samba의 smbclient는 SMB 서버의 파일을 내려받거나 올릴 수 있는 클라이언트다. 설치된 환경에서 서버가 fileserver, 공유 이름이 reports, 계정이 alice인 경우 다음처럼 접속할 수 있다. 이름은 설명용 예시다.

smbclient '//fileserver/reports' -U alice

비밀번호는 요청 프롬프트에 입력한다. 접속한 뒤 공유 루트의 report.csv를 다른 로컬 이름으로 받는 명령은 다음과 같다.

get report.csv report-copy.csv
exit

get의 첫 인수는 원격 파일, 두 번째는 로컬 파일 이름이다. curl의 URL 전체를 붙여 넣는 방식에서 서버·공유와 파일 경로를 나누는 방식으로 바뀐다. 자동 실행 스크립트로 옮길 때는 대화형 비밀번호 입력을 그대로 둘 수 없으므로 인증 방식도 함께 설계해야 한다.

예전 curl도 SMB1까지만 지원했다

예전 curl의 SMB 지원은 SMB1에 한정됐다. curl의 공식 권고는 SMB1이 보안상 권장되지 않으며 서버에서 꺼 두는 경우가 많다고 설명한다. 이전 curl에서 SMB가 된다는 사실이 최신 공유 서버와의 호환성을 뜻하지는 않았다.

smbclient는 기본적으로 지원 가능한 가장 높은 SMB3 버전을 상한으로 사용한다. 실제 연결은 서버와 클라이언트 설정에 따라 달라지므로, 전송을 옮긴 뒤 공유 경로·인증·파일 다운로드를 확인한다. curl 옵션을 계속 바꾸기보다 SMB를 처리할 클라이언트를 정하는 것이 이번 변경에 맞는 다음 단계다.