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