배치 스크립트에서 sftp나 scp로 파일을 옮길 때, 매번 비밀번호를 물어봐서 자동화가 막히는 경우가 있습니다. expect와 sshpass로 비밀번호 입력을 자동화하고, 다운로드는 curl 한 줄로 처리하는 방법입니다. 마지막에 직접 겪었던 흔한 함정 두 개도 같이 정리합니다.
1. 문제: 비밀번호를 물어보는 sftp/scp
sftp나 scp는 키 인증이 없으면 password: 프롬프트에서 멈춰 사람 입력을 기다립니다. 그래서 cron이나 배치에 그냥 넣으면 거기서 막혀버립니다. 해결은 두 갈래입니다 - sshpass로 비번을 넘기거나, expect로 프롬프트에 자동 응답하거나.
2. 가장 간단한 길: sshpass
sshpass는 비밀번호를 한 번에 넘겨주는 작은 도구입니다. 설치만 돼 있으면 제일 깔끔합니다. 특수문자가 든 비번은 작은따옴표로 감싸는 게 안전합니다(특히 !는 히스토리 확장 때문에).

3. sshpass가 없을 때: expect
운영 서버엔 sshpass가 없는 경우가 많습니다. 그럴 땐 expect로 프롬프트에 직접 응답합니다. 최초 접속 때 뜨는 호스트키 확인(yes/no)까지 같이 받아주면 안정적입니다.

4. 다운로드는 curl 한 줄로
받아오는 거라면 expect도 sshpass도 필요 없습니다. curl이 sftp를 지원해서 한 줄로 끝납니다. --ftp-create-dirs로 저장 경로가 없으면 만들어주고, 비번은 --user에 같이 넣습니다.

5. 함정 1: expect의 eof를 빠뜨리면
expect 스크립트 끝의 expect eof는 "spawn한 명령이 끝날 때까지 기다려라"는 뜻입니다. 이걸 빼먹거나 oef처럼 오타가 나면, expect가 전송이 끝나기 전에 빠져나와 파일이 잘리거나 timeout까지 멍하니 대기합니다. 비번을 보낸 다음 줄에 expect eof를 꼭 넣으세요.
6. 함정 2: 종료코드($?)는 바로 다음 줄에서 잡아라
전송 성공 여부를 $?로 보는데, 그 사이에 echo나 date 같은 명령이 끼면 $?는 전송이 아니라 그 마지막 명령의 결과(거의 항상 0)를 봅니다. 그래서 실패해도 늘 "성공"으로 찍힙니다. 종료코드는 검사할 명령 바로 다음 줄에서 변수로 잡아두는 게 답입니다.

- 키 인증(ssh-keygen + ssh-copy-id)을 쓸 수 있으면 비번 자체가 없어져서 제일 깔끔합니다
- 비번을 스크립트/명령행에 두면 프로세스 목록(ps)이나 히스토리에 노출될 수 있으니 파일 권한과 관리에 주의하세요
- 끝나면 로그의 "성공" 문구 말고, 실제로 파일이 목적지에 들어왔는지로 확인하는 게 정확합니다
함께 보면 좋은 글:
- 사무실 출근 후 업무 시작 1분컷 자동화 (로그온 자동 실행 + 멀티모니터 창 배치) - 작업환경 자동화
- 플레이라이트(Playwright)로 디버그 Chrome 세션 재사용하기 (CDP attach) - 웹 자동화(Playwright)
- 웹 자동화에서 클릭·입력이 안 먹을 때 (input 이벤트 + dispatchEvent 클릭) - 웹 자동화(Playwright)
- 파이썬 자동화 스크립트에 비밀번호를 평문으로 두지 않기 (Windows DPAPI 암호화) - 비번 암호화 저장 편
여기까지 비밀번호가 들어가는 sftp/scp를 스크립트로 자동화하는 방법과 흔한 함정에 대해서 작성해봤습니다. 여기까지 읽어주셔서 감사합니다!
'일상' 카테고리의 다른 글
| Windows에서 faster-whisper GPU로 돌리기 (CUDA/cuDNN 세팅, '쿠다 인식 안 됨' 잡기) (0) | 2026.06.27 |
|---|---|
| faster-whisper + pyannote로 화자 분리까지 (누가 말했는지 나누는 STT 파이프라인) (0) | 2026.06.27 |
| 플레이라이트(Playwright)로 매번 새 브라우저 띄우지 말고, 디버그 Chrome 세션 재사용하기 (CDP attach) (0) | 2026.06.21 |
| 사무실 출근 후 업무 시작 1분컷 자동화 (로그온 자동 실행 + 멀티모니터 창 배치) (0) | 2026.06.21 |
| 같은 숫자야구를 제미나이(Gemini)와 클로드(Claude)로 짜보니 (AI 코딩 스타일 비교) (0) | 2026.06.21 |