sshpass와 scp로 다른 포트 파일 전송

sshpass는 SSH 비밀번호를 비대화형으로 전달하는 도구입니다. scp와 함께 사용하면 자동화된 파일 전송이 가능합니다. 특히 비표준 포트를 사용하는 서버로의 전송에 유용합니다.

언제 사용하나요?

  • SSH 키 설정 없이 자동화된 파일 전송
  • 배포 스크립트에서 원격 서버로 파일 복사
  • 비표준 포트(22 이외)를 사용하는 서버 접속
  • CI/CD 파이프라인에서 파일 배포

sshpass 설치

# CentOS / RHEL
sudo yum install sshpass

# Ubuntu / Debian
sudo apt-get install sshpass

# macOS (Homebrew)
brew install hudochenkov/sshpass/sshpass

기본 사용법

# 비밀번호로 SSH 접속
sshpass -p "비밀번호" ssh user@host

# 비밀번호로 SCP 파일 전송
sshpass -p "비밀번호" scp file.txt user@host:/path/

# 디렉토리 전송 (-r 옵션)
sshpass -p "비밀번호" scp -r /local/dir user@host:/remote/dir

다른 포트 사용

# SSH 다른 포트 접속 (-p 옵션)
sshpass -p "비밀번호" ssh -p 2222 user@host

# SCP 다른 포트 전송 (-P 옵션, 대문자)
sshpass -p "비밀번호" scp -P 2222 file.txt user@host:/path/

# 디렉토리 전송 + 다른 포트
sshpass -p "비밀번호" scp -P 2222 -r /local/dir user@host:/remote/

# 주의: SSH는 -p, SCP는 -P (대문자)

호스트 키 확인 무시

# 처음 접속 시 호스트 키 확인 건너뛰기
sshpass -p "비밀번호" ssh -o StrictHostKeyChecking=no user@host

# SCP에서도 동일
sshpass -p "비밀번호" scp -o StrictHostKeyChecking=no file.txt user@host:/path/

# 알려진 호스트 파일에 저장 안함
sshpass -p "비밀번호" ssh -o UserKnownHostsFile=/dev/null 
    -o StrictHostKeyChecking=no user@host

파일에서 비밀번호 읽기

# 비밀번호 파일 생성 (권한 주의)
echo "비밀번호" > /secure/password.txt
chmod 600 /secure/password.txt

# 파일에서 비밀번호 읽기 (-f 옵션)
sshpass -f /secure/password.txt ssh user@host

# 환경변수에서 비밀번호 읽기 (-e 옵션)
export SSHPASS="비밀번호"
sshpass -e ssh user@host

실전 예시: 배포 스크립트

#!/bin/bash
# deploy.sh

HOST="192.168.1.100"
PORT="2222"
USER="deploy"
PASS="secretpassword"
LOCAL_DIR="/app/build"
REMOTE_DIR="/var/www/html"

# 빌드 파일 전송
sshpass -p "$PASS" scp -P $PORT -r 
    -o StrictHostKeyChecking=no 
    $LOCAL_DIR/* $USER@$HOST:$REMOTE_DIR/

# 원격 서버에서 명령 실행
sshpass -p "$PASS" ssh -p $PORT 
    -o StrictHostKeyChecking=no 
    $USER@$HOST "sudo systemctl restart nginx"

echo "배포 완료!"

압축 전송

# 압축해서 전송 (-C 옵션)
sshpass -p "비밀번호" scp -C -P 2222 
    large_file.sql user@host:/backup/

# tar와 함께 사용 (파이프)
tar czf - /local/dir | sshpass -p "비밀번호" 
    ssh -p 2222 user@host "tar xzf - -C /remote/"

rsync와 함께 사용

# rsync로 동기화 (더 효율적)
sshpass -p "비밀번호" rsync -avz 
    -e "ssh -p 2222 -o StrictHostKeyChecking=no" 
    /local/dir/ user@host:/remote/dir/

# 삭제 동기화
sshpass -p "비밀번호" rsync -avz --delete 
    -e "ssh -p 2222" 
    /local/dir/ user@host:/remote/dir/

보안 주의사항

  • 명령줄 비밀번호는 프로세스 목록에 노출됨
  • 가능하면 SSH 키 인증 사용 권장
  • 비밀번호 파일은 600 권한으로 보호
  • 스크립트에 비밀번호 하드코딩 금지
  • 환경변수나 보안 저장소 활용

SSH 키 대안

# SSH 키 생성
ssh-keygen -t rsa -b 4096

# 공개키 복사 (권장 방법)
ssh-copy-id -p 2222 user@host

# 키로 접속 (비밀번호 불필요)
ssh -p 2222 user@host
scp -P 2222 file.txt user@host:/path/