- Fix trailing whitespace in kex.rs and s3.rs - Add missing KexProposal import in kex_complete.rs - Auto-fix clippy warnings across all crates - All 153 tests pass
146 lines
4.7 KiB
Bash
Executable File
146 lines
4.7 KiB
Bash
Executable File
#!/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
|