Contents
see List작성일 2018. 12. 06.
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/