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?
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?
Respuestas:
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ón
rsync
. Y sí, también necesita rsync
en el lado remoto, al igual que con scp
. En cuanto a las claves SSH, en rsync
realidad está utilizando SSH debajo del valor predeterminado -e ssh
, por lo que si tiene claves configuradas para su uso scp
, también funcionarán rsync
.
-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 destino foo
pero rsync foo/ u@h:~/bar/
no creará el directorio de destino bar
. Ese creará bar/foo
solo si bar/
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 si foo/
no existe pero rsync file host:/foo/
crea el directorio y lo coloca file
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:
$ scp -pr /source/directory user@host:the/target/directory
Si directory
no existe en ~/the/target
on host
, 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 el scp
fracaso previsto .
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 simplemente ssh
ir a la máquina de destino, crear el directorio y luego copiar. Algo como:
ssh user@host "mkdir -p /target/path/" &&
scp /path/to/source user@host:/target/path/
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):
scp ~/foo/ user@host:~/
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 que bar
exista el directorio de destino . En cualquier caso, el -r
indicador no ayudará a crear un directorio de destino si está copiando archivos individuales.
Sí tu puedes. Según la página de manual de scp:
hombre scp
.....
-r Copiar recursivamente directorios completos. Tenga en cuenta que scp sigue los enlaces simbólicos encontrados en el recorrido del árbol.
....
scp -r foo/ u@h:~/bar
se creará bar/foo
si el control remoto bar/
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, entonces scp
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 crear bar/
.
Uso la siguiente función antes de transferir btrfs
instantáneas ssh
:
check_remote_dir() {
printf "\ntesting remote directory: '$1' "
if ssh -p $PORT $ROOT@$REMOTE "[ ! -d $1 ]"; then
printf "\nCreating: $1 on $ROOT@$REMOTE\n"
ssh -p $PORT $ROOT@$REMOTE "mkdir -p $1"
else
printf "[OK]\n"
fi
}
Simplemente llame a la función en su script con:
check_remote_dir /my/remote/path
Puede encadenar el comando con el comando mkdir y luego hacer referencia a la carpeta que ha creado:
mkdir ~/new-folder/ && scp -P 22 <remote/url>:~/new-folder/
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:
rsync -e 'ssh -p22' -av -f"+ */" -f"- *" ~/.ssh backup@1.2.3.4:~/
scp -P22 ~/.ssh/id_rsa.pub backup@1.2.3.4:~/.ssh/authorized_keys
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.