scp.sh revision 255670
1#	$OpenBSD: scp.sh,v 1.9 2013/05/17 10:35:43 dtucker Exp $
2#	Placed in the Public Domain.
3
4tid="scp"
5
6#set -x
7
8# Figure out if diff understands "-N"
9if diff -N ${SRC}/scp.sh ${SRC}/scp.sh 2>/dev/null; then
10	DIFFOPT="-rN"
11else
12	DIFFOPT="-r"
13fi
14
15COPY2=${OBJ}/copy2
16DIR=${COPY}.dd
17DIR2=${COPY}.dd2
18
19SRC=`dirname ${SCRIPT}`
20cp ${SRC}/scp-ssh-wrapper.sh ${OBJ}/scp-ssh-wrapper.scp
21chmod 755 ${OBJ}/scp-ssh-wrapper.scp
22scpopts="-q -S ${OBJ}/scp-ssh-wrapper.scp"
23
24scpclean() {
25	rm -rf ${COPY} ${COPY2} ${DIR} ${DIR2}
26	mkdir ${DIR} ${DIR2}
27}
28
29verbose "$tid: simple copy local file to local file"
30scpclean
31$SCP $scpopts ${DATA} ${COPY} || fail "copy failed"
32cmp ${DATA} ${COPY} || fail "corrupted copy"
33
34verbose "$tid: simple copy local file to remote file"
35scpclean
36$SCP $scpopts ${DATA} somehost:${COPY} || fail "copy failed"
37cmp ${DATA} ${COPY} || fail "corrupted copy"
38
39verbose "$tid: simple copy remote file to local file"
40scpclean
41$SCP $scpopts somehost:${DATA} ${COPY} || fail "copy failed"
42cmp ${DATA} ${COPY} || fail "corrupted copy"
43
44verbose "$tid: simple copy local file to remote dir"
45scpclean
46cp ${DATA} ${COPY}
47$SCP $scpopts ${COPY} somehost:${DIR} || fail "copy failed"
48cmp ${COPY} ${DIR}/copy || fail "corrupted copy"
49
50verbose "$tid: simple copy local file to local dir"
51scpclean
52cp ${DATA} ${COPY}
53$SCP $scpopts ${COPY} ${DIR} || fail "copy failed"
54cmp ${COPY} ${DIR}/copy || fail "corrupted copy"
55
56verbose "$tid: simple copy remote file to local dir"
57scpclean
58cp ${DATA} ${COPY}
59$SCP $scpopts somehost:${COPY} ${DIR} || fail "copy failed"
60cmp ${COPY} ${DIR}/copy || fail "corrupted copy"
61
62verbose "$tid: recursive local dir to remote dir"
63scpclean
64rm -rf ${DIR2}
65cp ${DATA} ${DIR}/copy
66$SCP $scpopts -r ${DIR} somehost:${DIR2} || fail "copy failed"
67diff ${DIFFOPT} ${DIR} ${DIR2} || fail "corrupted copy"
68
69verbose "$tid: recursive local dir to local dir"
70scpclean
71rm -rf ${DIR2}
72cp ${DATA} ${DIR}/copy
73$SCP $scpopts -r ${DIR} ${DIR2} || fail "copy failed"
74diff ${DIFFOPT} ${DIR} ${DIR2} || fail "corrupted copy"
75
76verbose "$tid: recursive remote dir to local dir"
77scpclean
78rm -rf ${DIR2}
79cp ${DATA} ${DIR}/copy
80$SCP $scpopts -r somehost:${DIR} ${DIR2} || fail "copy failed"
81diff ${DIFFOPT} ${DIR} ${DIR2} || fail "corrupted copy"
82
83verbose "$tid: shell metacharacters"
84scpclean
85(cd ${DIR} && \
86touch '`touch metachartest`' && \
87$SCP $scpopts *metachar* ${DIR2} 2>/dev/null; \
88[ ! -f metachartest ] ) || fail "shell metacharacters"
89
90if [ ! -z "$SUDO" ]; then
91	verbose "$tid: skipped file after scp -p with failed chown+utimes"
92	scpclean
93	cp -p ${DATA} ${DIR}/copy
94	cp -p ${DATA} ${DIR}/copy2
95	cp ${DATA} ${DIR2}/copy
96	chmod 660 ${DIR2}/copy
97	$SUDO chown root ${DIR2}/copy
98	$SCP -p $scpopts somehost:${DIR}/\* ${DIR2} >/dev/null 2>&1
99	$SUDO diff ${DIFFOPT} ${DIR} ${DIR2} || fail "corrupted copy"
100	$SUDO rm ${DIR2}/copy
101fi
102
103for i in 0 1 2 3 4; do
104	verbose "$tid: disallow bad server #$i"
105	SCPTESTMODE=badserver_$i
106	export DIR SCPTESTMODE
107	scpclean
108	$SCP $scpopts somehost:${DATA} ${DIR} >/dev/null 2>/dev/null
109	[ -d {$DIR}/rootpathdir ] && fail "allows dir relative to root dir"
110	[ -d ${DIR}/dotpathdir ] && fail "allows dir creation in non-recursive mode"
111
112	scpclean
113	$SCP -r $scpopts somehost:${DATA} ${DIR2} >/dev/null 2>/dev/null
114	[ -d ${DIR}/dotpathdir ] && fail "allows dir creation outside of subdir"
115done
116
117verbose "$tid: detect non-directory target"
118scpclean
119echo a > ${COPY}
120echo b > ${COPY2}
121$SCP $scpopts ${DATA} ${COPY} ${COPY2}
122cmp ${COPY} ${COPY2} >/dev/null && fail "corrupt target"
123
124scpclean
125rm -f ${OBJ}/scp-ssh-wrapper.scp
126