1264377Sdes# $OpenBSD: scp.sh,v 1.10 2014/01/26 10:49:17 djm Exp $ 2137015Sdes# Placed in the Public Domain. 3137015Sdes 4137015Sdestid="scp" 5137015Sdes 6137015Sdes#set -x 7137015Sdes 8137015Sdes# Figure out if diff understands "-N" 9137015Sdesif diff -N ${SRC}/scp.sh ${SRC}/scp.sh 2>/dev/null; then 10137015Sdes DIFFOPT="-rN" 11137015Sdeselse 12137015Sdes DIFFOPT="-r" 13137015Sdesfi 14137015Sdes 15137015SdesCOPY2=${OBJ}/copy2 16137015SdesDIR=${COPY}.dd 17137015SdesDIR2=${COPY}.dd2 18137015Sdes 19137015SdesSRC=`dirname ${SCRIPT}` 20146998Sdescp ${SRC}/scp-ssh-wrapper.sh ${OBJ}/scp-ssh-wrapper.scp 21146998Sdeschmod 755 ${OBJ}/scp-ssh-wrapper.scp 22146998Sdesscpopts="-q -S ${OBJ}/scp-ssh-wrapper.scp" 23262566Sdesexport SCP # used in scp-ssh-wrapper.scp 24137015Sdes 25137015Sdesscpclean() { 26137015Sdes rm -rf ${COPY} ${COPY2} ${DIR} ${DIR2} 27137015Sdes mkdir ${DIR} ${DIR2} 28137015Sdes} 29137015Sdes 30157016Sdesverbose "$tid: simple copy local file to local file" 31157016Sdesscpclean 32157016Sdes$SCP $scpopts ${DATA} ${COPY} || fail "copy failed" 33157016Sdescmp ${DATA} ${COPY} || fail "corrupted copy" 34157016Sdes 35137015Sdesverbose "$tid: simple copy local file to remote file" 36137015Sdesscpclean 37137015Sdes$SCP $scpopts ${DATA} somehost:${COPY} || fail "copy failed" 38137015Sdescmp ${DATA} ${COPY} || fail "corrupted copy" 39137015Sdes 40137015Sdesverbose "$tid: simple copy remote file to local file" 41137015Sdesscpclean 42137015Sdes$SCP $scpopts somehost:${DATA} ${COPY} || fail "copy failed" 43137015Sdescmp ${DATA} ${COPY} || fail "corrupted copy" 44137015Sdes 45137015Sdesverbose "$tid: simple copy local file to remote dir" 46137015Sdesscpclean 47137015Sdescp ${DATA} ${COPY} 48137015Sdes$SCP $scpopts ${COPY} somehost:${DIR} || fail "copy failed" 49137015Sdescmp ${COPY} ${DIR}/copy || fail "corrupted copy" 50137015Sdes 51157016Sdesverbose "$tid: simple copy local file to local dir" 52157016Sdesscpclean 53157016Sdescp ${DATA} ${COPY} 54157016Sdes$SCP $scpopts ${COPY} ${DIR} || fail "copy failed" 55157016Sdescmp ${COPY} ${DIR}/copy || fail "corrupted copy" 56157016Sdes 57137015Sdesverbose "$tid: simple copy remote file to local dir" 58137015Sdesscpclean 59137015Sdescp ${DATA} ${COPY} 60137015Sdes$SCP $scpopts somehost:${COPY} ${DIR} || fail "copy failed" 61137015Sdescmp ${COPY} ${DIR}/copy || fail "corrupted copy" 62137015Sdes 63137015Sdesverbose "$tid: recursive local dir to remote dir" 64137015Sdesscpclean 65137015Sdesrm -rf ${DIR2} 66137015Sdescp ${DATA} ${DIR}/copy 67137015Sdes$SCP $scpopts -r ${DIR} somehost:${DIR2} || fail "copy failed" 68137015Sdesdiff ${DIFFOPT} ${DIR} ${DIR2} || fail "corrupted copy" 69137015Sdes 70157016Sdesverbose "$tid: recursive local dir to local dir" 71157016Sdesscpclean 72157016Sdesrm -rf ${DIR2} 73157016Sdescp ${DATA} ${DIR}/copy 74157016Sdes$SCP $scpopts -r ${DIR} ${DIR2} || fail "copy failed" 75157016Sdesdiff ${DIFFOPT} ${DIR} ${DIR2} || fail "corrupted copy" 76157016Sdes 77137015Sdesverbose "$tid: recursive remote dir to local dir" 78137015Sdesscpclean 79137015Sdesrm -rf ${DIR2} 80137015Sdescp ${DATA} ${DIR}/copy 81137015Sdes$SCP $scpopts -r somehost:${DIR} ${DIR2} || fail "copy failed" 82137015Sdesdiff ${DIFFOPT} ${DIR} ${DIR2} || fail "corrupted copy" 83137015Sdes 84157016Sdesverbose "$tid: shell metacharacters" 85157016Sdesscpclean 86157016Sdes(cd ${DIR} && \ 87157016Sdestouch '`touch metachartest`' && \ 88157016Sdes$SCP $scpopts *metachar* ${DIR2} 2>/dev/null; \ 89157016Sdes[ ! -f metachartest ] ) || fail "shell metacharacters" 90157016Sdes 91146998Sdesif [ ! -z "$SUDO" ]; then 92146998Sdes verbose "$tid: skipped file after scp -p with failed chown+utimes" 93146998Sdes scpclean 94146998Sdes cp -p ${DATA} ${DIR}/copy 95146998Sdes cp -p ${DATA} ${DIR}/copy2 96146998Sdes cp ${DATA} ${DIR2}/copy 97146998Sdes chmod 660 ${DIR2}/copy 98146998Sdes $SUDO chown root ${DIR2}/copy 99146998Sdes $SCP -p $scpopts somehost:${DIR}/\* ${DIR2} >/dev/null 2>&1 100157016Sdes $SUDO diff ${DIFFOPT} ${DIR} ${DIR2} || fail "corrupted copy" 101146998Sdes $SUDO rm ${DIR2}/copy 102146998Sdesfi 103146998Sdes 104137015Sdesfor i in 0 1 2 3 4; do 105137015Sdes verbose "$tid: disallow bad server #$i" 106137015Sdes SCPTESTMODE=badserver_$i 107137015Sdes export DIR SCPTESTMODE 108137015Sdes scpclean 109137015Sdes $SCP $scpopts somehost:${DATA} ${DIR} >/dev/null 2>/dev/null 110137015Sdes [ -d {$DIR}/rootpathdir ] && fail "allows dir relative to root dir" 111137015Sdes [ -d ${DIR}/dotpathdir ] && fail "allows dir creation in non-recursive mode" 112137015Sdes 113137015Sdes scpclean 114137015Sdes $SCP -r $scpopts somehost:${DATA} ${DIR2} >/dev/null 2>/dev/null 115137015Sdes [ -d ${DIR}/dotpathdir ] && fail "allows dir creation outside of subdir" 116137015Sdesdone 117137015Sdes 118157016Sdesverbose "$tid: detect non-directory target" 119137015Sdesscpclean 120157016Sdesecho a > ${COPY} 121157016Sdesecho b > ${COPY2} 122157016Sdes$SCP $scpopts ${DATA} ${COPY} ${COPY2} 123157016Sdescmp ${COPY} ${COPY2} >/dev/null && fail "corrupt target" 124157016Sdes 125157016Sdesscpclean 126146998Sdesrm -f ${OBJ}/scp-ssh-wrapper.scp 127