#!/bin/bash # SSH/SFTP/SCP/rsync 完整整合測試 - 自動化執行腳本 # 用法: bash tests/ssh_full_integration.sh set -e SERVER_PORT=2024 SSH_OPTS="-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" RSYNC_RSH="ssh -p $SERVER_PORT $SSH_OPTS" PASS=0 FAIL=0 log() { echo -e "\n\033[36m=== $1 ===\033[0m"; } pass() { echo -e " \033[32m✅ $1\033[0m"; PASS=$((PASS+1)); } fail() { echo -e " \033[31m❌ $1\033[0m"; FAIL=$((FAIL+1)); } cleanup() { rm -f /tmp/sftp_test_*.bin /tmp/scp_*.bin /tmp/rsync_*.bin /tmp/batch_*.bin rm -rf /tmp/rsync_dir* /tmp/scp_dir* /tmp/parallel_* } # ── 建立測試檔案 ── log "建立測試檔案" dd if=/dev/urandom of=/tmp/sftp_test_2m.bin bs=1M count=2 2>/dev/null dd if=/dev/urandom of=/tmp/sftp_test_5m.bin bs=1M count=5 2>/dev/null SRC_MD5=$(md5 /tmp/sftp_test_5m.bin | awk '{print $NF}') echo " 5MB source MD5: $SRC_MD5" # ── 1. SSH 連線 ── log "1. SSH Basic Connection" if timeout 10 ssh -p $SERVER_PORT $SSH_OPTS demo@127.0.0.1 'echo "SSH_OK"' 2>/dev/null | grep -q SSH_OK; then pass "SSH connection + auth" else fail "SSH connection" fi # ── 2. SFTP 操作 ── log "2. SFTP Upload + Download" timeout 60 sftp -P $SERVER_PORT $SSH_OPTS demo@127.0.0.1 << EOF 2>/dev/null >/dev/null put /tmp/sftp_test_5m.bin sftp_5m.bin get sftp_5m.bin /tmp/sftp_test_5m_dl.bin rm sftp_5m.bin bye EOF DL_MD5=$(md5 /tmp/sftp_test_5m_dl.bin 2>/dev/null | awk '{print $NF}') if [ "$SRC_MD5" = "$DL_MD5" ]; then pass "SFTP 5MB (MD5: $SRC_MD5)" else fail "SFTP 5MB MD5 mismatch: src=$SRC_MD5 dl=$DL_MD5" fi # ── 3. SFTP Enterprise Errors ── log "3. SFTP Error Handling" ERRORS=$(timeout 10 sftp -P $SERVER_PORT $SSH_OPTS demo@127.0.0.1 << 'EOF' 2>&1 mkdir /etc/forbidden stat /nonexistent bye EOF ) if echo "$ERRORS" | grep -iq "permission denied"; then pass "SFTP Permission denied" else fail "SFTP Permission denied missing" fi if echo "$ERRORS" | grep -iq "no such file"; then pass "SFTP No such file" else fail "SFTP No such file missing" fi # ── 4. SFTP Batch Files ── log "4. SFTP Batch Transfer" for i in 1 2 3 4 5; do dd if=/dev/urandom of=/tmp/batch_${i}.bin bs=1K count=64 2>/dev/null done timeout 60 sftp -P $SERVER_PORT $SSH_OPTS demo@127.0.0.1 << EOF 2>/dev/null >/dev/null lcd /tmp put batch_1.bin batch_2.bin batch_3.bin batch_4.bin batch_5.bin get batch_1.bin batch_2.bin batch_3.bin batch_4.bin batch_5.bin rm batch_1.bin batch_2.bin batch_3.bin batch_4.bin batch_5.bin bye EOF ALL_OK=true for i in 1 2 3 4 5; do S=$(md5 /tmp/batch_${i}.bin | awk '{print $NF}') D=$(md5 /tmp/batch_${i}.bin 2>/dev/null | awk '{print $NF}') [ "$S" != "$D" ] && ALL_OK=false done $ALL_OK && pass "SFTP Batch (5 files)" || fail "SFTP Batch MD5 mismatch" # ── 5. SCP ── log "5. SCP Transfer" timeout 30 scp -P $SERVER_PORT $SSH_OPTS /tmp/sftp_test_5m.bin demo@127.0.0.1:scp_test.bin 2>/dev/null timeout 30 scp -P $SERVER_PORT $SSH_OPTS demo@127.0.0.1:scp_test.bin /tmp/scp_dl.bin 2>/dev/null SCP_MD5=$(md5 /tmp/scp_dl.bin 2>/dev/null | awk '{print $NF}') if [ "$SRC_MD5" = "$SCP_MD5" ]; then pass "SCP 5MB (MD5: $SCP_MD5)" else fail "SCP MD5 mismatch" fi # ── 6. rsync ── log "6. rsync Transfer" timeout 30 rsync -avz --rsh="$RSYNC_RSH" /tmp/sftp_test_5m.bin demo@127.0.0.1:rsync_test.bin 2>/dev/null >/dev/null timeout 30 rsync -avz --rsh="$RSYNC_RSH" demo@127.0.0.1:rsync_test.bin /tmp/rsync_dl.bin 2>/dev/null >/dev/null RSYNC_MD5=$(md5 /tmp/rsync_dl.bin 2>/dev/null | awk '{print $NF}') if [ "$SRC_MD5" = "$RSYNC_MD5" ]; then pass "rsync 5MB (MD5: $RSYNC_MD5)" else fail "rsync MD5 mismatch" fi # ── 7. Delta rsync ── log "7. rsync Delta Transfer" echo "delta" >> /tmp/sftp_test_5m.bin timeout 30 rsync -avz --rsh="$RSYNC_RSH" /tmp/sftp_test_5m.bin demo@127.0.0.1:rsync_test.bin 2>&1 | grep -q "speedup" && \ pass "rsync delta (small change)" || fail "rsync delta" # ── 8. Shell Commands ── log "8. SSH Shell Commands" OUT=$(timeout 10 ssh -p $SERVER_PORT $SSH_OPTS demo@127.0.0.1 'echo hello; whoami' 2>/dev/null) echo "$OUT" | grep -q hello && echo "$OUT" | grep -q demo && \ pass "SSH shell commands" || fail "SSH shell commands" # ── 9. Stress: 10 consecutive connections ── log "9. Stress Test (10 connections)" CONN_OK=0 for i in $(seq 1 10); do timeout 10 ssh -p $SERVER_PORT $SSH_OPTS demo@127.0.0.1 'echo OK' 2>/dev/null | grep -q OK && CONN_OK=$((CONN_OK+1)) done [ "$CONN_OK" -eq 10 ] && pass "10/10 connections OK" || fail "$CONN_OK/10 connections OK" # ── Summary ── log "SUMMARY" echo -e " \033[32mPassed: $PASS\033[0m" echo -e " \033[31mFailed: $FAIL\033[0m" [ "$FAIL" -eq 0 ] && echo -e "\033[32m\n ✅ ALL TESTS PASSED\033[0m" || echo -e "\033[31m\n ❌ SOME TESTS FAILED\033[0m" cleanup exit $FAIL