Quiero usar scp
para 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 rsync
puede hacer.
Si está utilizando una versión rsync
lanzada 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-source
y su contenido $HOME/path/local-dir
en la máquina remota, creando los directorios necesarios.
rsync
tiene 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 rsync
comando 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.
rsync
a 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 rsync
2.6.0 (1 de enero de 2004), requería el -e ssh
indicador para que se comportara como si scp
no se ajustara al protocolo RSH obsoleto .
scp
y rsync
compartir algunas banderas, pero solo hay un poco de superposición.
Cuando se usa SSH
como protocolo de transferencia, rsync
usa 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.
rsync
en 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 necesitarsync
en el lado remoto, al igual que conscp
. En cuanto a las claves SSH, enrsync
realidad está utilizando SSH debajo del valor predeterminado-e ssh
, por lo que si tiene claves configuradas para su usoscp
, también funcionaránrsync
.-r
no 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 destinofoo
perorsync foo/ u@h:~/bar/
no creará el directorio de destinobar
. Ese crearábar/foo
solo 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/file
falla sifoo/
no existe perorsync file host:/foo/
crea el directorio y lo colocafile
en é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
directory
no existe en~/the/target
onhost
, se creará. Sin embargo,~the/target
si no existe, es probable que tenga problemas: no recuerdo los resultados exactos de este caso, pero esté preparado para elscp
fracaso previsto .fuente
scp: /home/madmike/test_bin: No such file or directory
Tan 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,
scp
no puede hacer eso, no. Sin embargo, podría simplementessh
ir 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
~/foo
al host remoto, puede usar el-r
indicador (recursivo):Eso creará el directorio de destino
~/foo
en el host remoto. Sin embargo, no puede crear el directorio padre.scp ~/foo user@host:~/bar/foo
fallará a menos quebar
exista el directorio de destino . En cualquier caso, el-r
indicador 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:~/bar
se crearábar/foo
si el control remotobar/
existe pero fallará si no existe.foo
contenidos 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, entoncesscp
no 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
btrfs
instantáneasssh
:Simplemente llame a la función en su script con:
check_remote_dir /my/remote/path
fuente
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