我使用这个 bash 代码将文件上传到远程服务器,对于普通文件,这可以正常工作:
for i in `find devel/ -newer $UPLOAD_FILE`
do
echo "Upload:" $i
if [ -d $i ]
then
echo "Creating directory" $i
ssh $USER@$SERVER "cd ${REMOTE_PATH}; mkdir -p $i"
continue
fi
if scp -Cp $i $USER@$SERVER:$REMOTE_PATH/$i
then
echo "$i OK"
else
echo "$i NOK"
rm ${UPLOAD_FILE}_tmp
fi
done
唯一的问题是,对于名称中带有空格的文件,for 循环会失败,因此我将第一行替换为如下所示:
find devel/ -newer $UPLOAD_FILE | while read i
do
echo "Upload:" $i
if [ -d $i ]
then
echo "Creating directory" $i
ssh $USER@$SERVER "cd ${REMOTE_PATH}; mkdir -p $i"
continue
fi
if scp -Cp $i $USER@$SERVER:$REMOTE_PATH/$i
then
echo "$i OK"
else
echo "$i NOK"
rm ${UPLOAD_FILE}_tmp
fi
done
由于某些奇怪的原因,ssh 命令打破了 while 循环,因此第一个丢失的目录创建得很好,但所有后续丢失的文件/目录都被忽略。
我想这与 ssh 向标准输出写入一些内容有关,这会混淆“读取”命令。注释掉 ssh 命令可以使循环正常工作。
有谁知道为什么会发生这种情况以及如何防止 ssh 破坏 while 循环?
问题是ssh
从标准输入读取,因此它会吃掉所有剩余的行。您可以将其标准输入连接到任何地方:
ssh $USER@$SERVER "cd ${REMOTE_PATH}; mkdir -p $i" < /dev/null
您还可以使用ssh -n
而不是重定向。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)