Quiero usar scppara cargar archivos, pero a veces el directorio de destino puede no existir.
¿Es posible crear la carpeta automáticamente? ¿Si es así, cómo? Si no, ¿qué forma alternativa puedo probar?
Esta es una de las muchas cosas que rsyncpuede hacer.
Si está utilizando una versión rsynclanzada en los últimos años, ¹ su sintaxis de comando básica es similar a scp: ²
$ rsync -r local-dir remote-machine:path
Eso copiará local-sourcey su contenido $HOME/path/local-diren la máquina remota, creando los directorios necesarios.
rsynctiene algunas restricciones aquí que pueden afectar si esto funcionará en su situación particular. No creará múltiples niveles de directorios remotos faltantes, por ejemplo; solo creará hasta un nivel faltante en el control remoto. Puede evitar esto fácilmente precediendo el rsynccomando con algo como esto:
$ ssh remote-host 'mkdir -p foo/bar/qux'
Eso creará el $HOME/foo/bar/quxárbol si no existe. No va a quejarse o hacer cualquier otra cosa malo si no existe ya.
rsynca veces tiene otros comportamientos sorprendentes. Básicamente, le está pidiendo que descubra lo que quería copiar, y sus suposiciones pueden no coincidir con sus suposiciones. Pruébalo y verás. Si no se comporta como espera y no puede ver por qué, publique más detalles sobre sus configuraciones de directorio local y remoto, y dé el comando que intentó.
Notas al pie :
Antes de rsync2.6.0 (1 de enero de 2004), requería el -e sshindicador para que se comportara como si scpno se ajustara al protocolo RSH obsoleto .
scpy rsynccompartir algunas banderas, pero solo hay un poco de superposición.
Cuando se usa SSHcomo protocolo de transferencia, rsyncusa los mismos valores predeterminados. Entonces, al igual scp, asumirá que hay un usuario con el mismo nombre que su usuario local en la máquina remota de forma predeterminada.
rsyncen la página de documentación, no encontré cómo usar ssh-key para iniciar sesión. No quiero usar nombre de usuario / contraseña para iniciar sesiónrsync. Y sí, también necesitarsyncen el lado remoto, al igual que conscp. En cuanto a las claves SSH, enrsyncrealidad está utilizando SSH debajo del valor predeterminado-e ssh, por lo que si tiene claves configuradas para su usoscp, también funcionaránrsync.-rno hace ninguna diferencia. El escenario que describe solo funciona si está copiando un directorio y si existe el directorio padre de destino. Por lo tanto,rsync foo/ u@h:~/creará el directorio de destinofooperorsync foo/ u@h:~/bar/no creará el directorio de destinobar. Ese crearábar/foosolo sibar/existe. En cualquier caso, el OP está cargando archivos e incluso en los casos en que esto funciona, solo funciona para directorios completos.rsync file host:/foo/filefalla sifoo/no existe perorsync file host:/foo/crea el directorio y lo colocafileen él. Extraño. De todos modos, tienes toda la razón y el escenario básico funciona, retractaré mi voto negativo.Si está copiando un grupo de archivos, en realidad no. Si está copiando un directorio y todos los contenidos debajo de él, sí. Dado este comando:
Si
directoryno existe en~/the/targetonhost, se creará. Sin embargo,~the/targetsi no existe, es probable que tenga problemas: no recuerdo los resultados exactos de este caso, pero esté preparado para elscpfracaso previsto .fuente
scp: /home/madmike/test_bin: No such file or directoryTan pronto como falta el directorio de destino, esto se rompe en mi configuración. Usando cygwin en el cliente y RHEL 6.9 en el servidor. ¿Cuál es tu configuración?Que yo sepa,
scpno puede hacer eso, no. Sin embargo, podría simplementesshir a la máquina de destino, crear el directorio y luego copiar. Algo como:Tenga en cuenta que si está copiando directorios completos, no se necesita lo anterior. Por ejemplo, para copiar el directorio
~/fooal host remoto, puede usar el-rindicador (recursivo):Eso creará el directorio de destino
~/fooen el host remoto. Sin embargo, no puede crear el directorio padre.scp ~/foo user@host:~/bar/foofallará a menos quebarexista el directorio de destino . En cualquier caso, el-rindicador no ayudará a crear un directorio de destino si está copiando archivos individuales.fuente
Sí tu puedes. Según la página de manual de scp:
fuente
scp -r foo/ u@h:~/barse crearábar/foosi el control remotobar/existe pero fallará si no existe.foocontenidos al nuevo directorio/bar. Por supuesto, el nombre ha sido cambiado, lo que puede no ser lo que quiere el OP. Si lo que desea es una nueva estructura de árbol creada en la máquina de destino, entoncesscpno hará el trabajo, si lo que quiere es replicar una estructura de árbol de una determinada rama en el árbol, entonces se crea esa estructura.scp -r file host:~/bar/no va a crearbar/.Uso la siguiente función antes de transferir
btrfsinstantáneasssh:Simplemente llame a la función en su script con:
check_remote_dir /my/remote/pathfuente
Puede encadenar el comando con el comando mkdir y luego hacer referencia a la carpeta que ha creado:
fuente
Cuando se restringe a solo scp o sftp sin ssh disponible (por rssh), es posible crear directorios copiando el árbol de directorios vacío con rsync y luego copiando los archivos.
Así es como pongo la clave ssh pública en el host remoto cuando ssh-copy-id no funciona y el directorio .ssh no existe:
Es posible combinar estos comandos en un rsync agregando un filtro de inclusión más en el medio, si el nombre del archivo de destino es el mismo.
fuente