요약

  • OpenSSH 8.7 릴리스 기록은 2021년 scp의 실험적 SFTP 모드를 도입했다. OpenSSH 9.0 기록은 2022년 4월 8일 SFTP를 기본 전송 프로토콜로 바꿨다.
  • 옛 SCP/RCP 방식은 원격 셸에 파일 이름의 와일드카드 확장을 맡겨 이중 인용 처리를 요구했다. -O는 옛 방식이 필요한 서버나 경로를 위한 출구로 남았다.

파일 이름이 명령처럼 읽힐 때

scp host:*.txt .에서 별표는 어디서 해석될까. 옛 SCP/RCP 방식에서는 원격 사용자의 셸이 그 일을 했다. OpenSSH 9.0 발표문은 그 결과 파일 이름에 셸 특수 문자가 있으면 이중으로 따옴표를 다뤄야 했다고 설명한다. 로컬 셸을 통과한 문자열이 원격 셸에서도 의도한 이름으로 남아야 했다. 파일을 옮기는 일이 작은 문법 시험으로 바뀌었다.

SFTP로 바뀐 것이 SSH 암호화 자체를 바꾼 것은 아니다. 현재 scp(1) 설명서는 SFTP도 SSH 연결 위에서 동작한다고 적는다. 달라진 것은 파일 전송의 대화 방식과 원격 경로를 누가 해석하는지다. 옛 방식이 원격 셸에 기대던 부분이 기본 경로에서 빠졌다.

먼저 실험하고 기본값을 바꾸다

2021년 8월 OpenSSH 8.7은 scp -s로 SFTP 모드를 시험할 수 있게 했다. 파일 이름을 더 예측 가능하게 처리하고 원격 셸에서 glob 패턴을 펼칠 필요가 없다는 것이 이유였다. 같은 릴리스는 원격 호스트 두 곳 사이의 복사를 로컬 호스트 경유로 바꿨다. 출발지에 목적지 접속 자격을 노출할 필요를 줄이고 로컬·출발지·목적지 셸이 파일 이름을 세 번 해석하는 문제도 피했다.

2022년 OpenSSH 9.0은 SFTP를 scp의 기본값으로 올렸다. 옛 원격 셸을 위해 작성한 이중 인용은 새 모드에서 오히려 실패를 만들 수 있었다. 프로젝트는 그런 불일치를 인정하면서 SFTP 모드에 옛 방식의 버그까지 재현하지 않겠다고 밝혔다. 오래된 스크립트를 무조건 달래려면 오래된 불편도 영구 보존해야 한다.

~user/로 시작하는 경로도 걸림돌이었다. SFTP 자체에는 다른 사용자의 홈 경로를 펼치는 규칙이 없다. 8.7 기록은 OpenSSH 서버에 경로 확장 기능을 추가했다고 적는다. 오래된 SFTP 서버에는 그 확장이 없을 수 있다. 클라이언트만 새 버전이어서는 원격 서버의 기능을 만들어 낼 수 없다.

그래서 scp -O가 남았다. 현재 설명서는 SFTP가 없는 서버, 일부 와일드카드 처리, 오래된 서버의 ~ 경로 확장에 옛 프로토콜이 필요할 수 있다고 안내한다. 그 선택은 원격 셸의 해석 부담도 다시 불러온다. 우회로를 열어 두는 것과 우회로를 새 도로처럼 취급하는 것은 다르다.

같은 명령, 다른 계약

OpenBSD 7.3의 scp(1) 설명서는 SSH 위 SFTP를 사용하는 scp를 기록한다. 현재 설명서는 기본값 전환의 시작점을 OpenSSH 9.0으로 적는다. 명령 이름은 남았고 전송 프로토콜은 바뀌었으며 기존 프로토콜은 선택 사항으로 남았다. 서버의 기능과 오래된 경로 표기, 자동화된 명령이 실제 전환 속도를 결정했다. 간판이 그대로라고 주방의 조리법까지 그대로인 것은 아니다.