que utilizan este bash-código para cargar archivos en un servidor remoto, para los archivos normales esto funciona bien:rompe ssh fuera del bucle while en bash
for i in `find devel/ -newer $UPLOAD_FILE`
do
echo "Upload:" $i
if [ -d $i ]
then
echo "Creating directory" $i
ssh [email protected]$SERVER "cd ${REMOTE_PATH}; mkdir -p $i"
continue
fi
if scp -Cp $i [email protected]$SERVER:$REMOTE_PATH/$i
then
echo "$i OK"
else
echo "$i NOK"
rm ${UPLOAD_FILE}_tmp
fi
done
El único problema es que para los archivos con un espacio en el nombre, el bucle de falla, así que sustituyó a la primera línea como la siguiente:
find devel/ -newer $UPLOAD_FILE | while read i
do
echo "Upload:" $i
if [ -d $i ]
then
echo "Creating directory" $i
ssh [email protected]$SERVER "cd ${REMOTE_PATH}; mkdir -p $i"
continue
fi
if scp -Cp $i [email protected]$SERVER:$REMOTE_PATH/$i
then
echo "$i OK"
else
echo "$i NOK"
rm ${UPLOAD_FILE}_tmp
fi
done
por alguna extraña razón, los saltos de ssh-comando fuera del bucle while, por lo tanto, se crea el primer directorio que falta bien, pero todos los archivos/directorios faltantes subsiguientes son ignorados.
Supongo que esto tiene algo que ver con que ssh escriba algo a stdout que confunde el comando "leer". Comentando el comando ssh hace que el bucle funcione como debería.
¿Alguien sabe por qué sucede esto y cómo uno puede evitar que ssh rompa el ciclo while?
Como un lado, todos los nombres de variables mayúsculas están reservados por convención para las variables de entorno y builtins; no deberían usarse para variables locales a un script. –
'while read' se romperá mal cuando sus nombres de archivo contengan barras invertidas literales. Más seguro para usar 'read -r'. Del mismo modo, 'leer' quitará los espacios en blanco de los nombres; para evitar eso, debes borrar 'IFS'. –
Además, 'encontrar | while read' emite una secuencia delimitada por una nueva línea, pero los nombres de archivo legítimos en UNIX pueden contener líneas nuevas. Piense en lo que sucede si alguien hace un 'mkdir -p devel/$ '\ n'/etc' y luego escribe en' devel/$ '\ n'/etc/passwd'; será mejor que espere en este momento que su script no tenga permiso para escribir en '/ etc/passwd' en la máquina remota. –