2009-08-27 14 views
51

No estoy seguro si esto es posible o no. Básicamente, estoy escribiendo un script que me permite scp un archivo para mi hosting. Esto es todo hasta ahora. Argumento 1 es el archivo y el argumento 2 es la carpeta que quiero que sea colocado en el servidor remoto:¿Cómo creo un directorio en el host remoto si no existe sin ssh-ing?

function upload { 
    scp $1 [email protected]:$2 
} 

Como se puede/no puede saber, si el directorio que especifique cuando llamo a la función doesn' t existe, entonces la transferencia falla. ¿Hay alguna manera de verificar si el directorio existe en la función? Si no, créelo.

Preferiría no tener que hacer ssh en todo momento y crear el directorio, pero si no tengo otra opción, entonces no tengo otra opción.

Respuesta

31

Puede usar rsync.

Por ejemplo,

rsync -ave ssh fileToCopy ssh.myhost.net:/some/nonExisting/dirToCopyTO 

Nota sobre rsync:

rsync es un software de utilidad y el protocolo de red para Unix que sincroniza los archivos y directorios de un lugar a otro de transferencia de datos y reducir al mínimo mediante el uso de codificación delta cuando apropiado utilizando el algoritmo rsync que es más rápido que otras herramientas.

+3

Esto no funciona para mí (solo se queja de que el directorio de destino no existe) - ¿requiere una versión inusualmente reciente de rsync? Sin embargo, 'rsync -R' se puede usar para lograr el efecto deseado si el archivo local está en un directorio apropiadamente nombrado, por ejemplo:' rsync -Rave ssh some/nonExisting/dirToCopyTo/fileToCopy ssh.myhost.net:/' –

+1

Me gusta @MartinKleppmann Solo me da un error al quejarse sobre el directorio que no existe al usar esto. ¿Has visto realmente esto funcionando? Si es así, me interesaría averiguar qué es diferente acerca de nuestros programas rsync. – DougW

+2

Ah, parece que esto funciona si solo tiene que crear un nivel de directorio para copiar. Intenté implementar en/var/www/myapp/test /. Cuando el servidor solo tenía/var/www /, falló. Cuando creé/var/www/myapp /, creó la carpeta de prueba y copió todo en ella. Por lo tanto, si necesita crear más de un nivel de estructura de directorios, necesitará una solución como @ire_and_curses a continuación. – DougW

18

Si realiza un scp recursivo (-r), copiará los directorios también. Por lo tanto, si crea localmente un directorio con el nombre que desea en el host remoto, copia el archivo en él y luego lo copia recursivamente, se creará el directorio, con el archivo en él.

Un poco incómodo, pero haría el trabajo.

+0

¿Qué sucede si el directorio remoto ya existe (y no está vacío)? – mouviciel

+0

Los nuevos contenidos se agregarán al directorio existente. – bejota

23

Supongo que quiere decir que no desea iniciar sesión de forma interactiva y crear directorios a mano, en lugar de que desee evitar el uso de ssh en total, ya que todavía necesita una contraseña o clave pública con scp.

Si usando ssh no interactiva es aceptable, entonces se puede transmitir su archivo usando cat sobre ssh:

cat $1 | ssh $2 "mkdir $3;cat >> $3/$1" 

donde

$1 = filename 
$2 = [email protected] 
$3 = dir_on_server 

Si el directorio ya existe, mkdir se queja pero el archivo todavía está copiado. El directorio existente no se sobrescribirá. Si el directorio no existe, mkdir lo creará.

+14

'mkdir -p $ 3' evite que mkdir se queje en el directorio ya existente. Además, te permite crear directorios de múltiples niveles. – FabienAndre

6

¿Qué tal, por ejemplo,
ssh [email protected] '[ -d /tmp/nonexist/dir ] || mkdir -p /tmp/nonexist/dir ]'; scp test.txt [email protected]:/tmp/nonexist/dir

+0

Definitivamente veo 'SSH', así como' scp' que, según Wikipedia '... se basa en el protocolo Secure Shell (SSH). Esto no es lo que el OP estaba pidiendo. – Bojangles

+0

No hay nada malo con el uso de ssh o scp y no hay necesidad de evitarlos. El script del usuario debe recordar lo que se ha creado en el host remoto, por lo que las comprobaciones no se realizarán una y otra vez. De hecho, escribí un script de copia de seguridad de registro recientemente utilizando este método. Me encantaría saber si hay otras opciones que comprueben y creen nuevas carpetas en el host remoto si no proporcionan formas como CIFS, NFS, FTP o rsync (esta realidad se ejecuta en ssh) para el acceso remoto a archivos. –

+0

Lo siento si encontré el camino equivocado Rico, me refería a que los OP no querían usar SSH, pero debería haber leído la pregunta con más cuidado; scp está bien. – Bojangles

Cuestiones relacionadas