Voglio usare scp
per caricare file ma a volte la directory di destinazione potrebbe non esistere.
È possibile creare automaticamente la cartella? Se é cosi, come? In caso contrario, quale modo alternativo posso provare?
Voglio usare scp
per caricare file ma a volte la directory di destinazione potrebbe non esistere.
È possibile creare automaticamente la cartella? Se é cosi, come? In caso contrario, quale modo alternativo posso provare?
Risposte:
Questa è una delle tante cose che rsync
possono fare.
Se usi una versione di rsync
rilasciata negli ultimi anni, ¹ la sua sintassi di comando di base è simile a scp
: ²
$ rsync -r local-dir remote-machine:path
Ciò copierà local-source
e il suo contenuto $HOME/path/local-dir
sul computer remoto, creando qualunque directory sia richiesta
rsync
ha alcune restrizioni qui che possono influenzare se questo funzionerà nella tua situazione particolare. Non creerà più livelli di directory remote mancanti, ad esempio; creerà solo un livello mancante sul telecomando. Puoi aggirare facilmente ciò precedendo il rsync
comando con qualcosa del genere:
$ ssh remote-host 'mkdir -p foo/bar/qux'
Ciò creerà l' $HOME/foo/bar/qux
albero se non esiste. Non si lamenterà o farà altro se non esiste già.
rsync
a volte ha altri comportamenti sorprendenti. Fondamentalmente, gli stai chiedendo di capire cosa volevi copiare e le sue ipotesi potrebbero non corrispondere ai tuoi presupposti. Provalo e vedi. Se non si comporta come ti aspetti e non riesci a capire perché, pubblica ulteriori dettagli sulle tue impostazioni di directory locali e remote e dai il comando che hai provato.
Note a piè di pagina :
Prima della rsync
2.6.0 (1 ° gennaio 2004), richiedeva che il -e ssh
flag si comportasse come scp
se fosse predefinito al protocollo RSH obsoleto .
scp
e rsync
condividi alcune bandiere, ma c'è solo un po 'di sovrapposizione.
Quando si utilizza SSH
come protocollo di trasferimento, rsync
utilizza gli stessi valori predefiniti. Quindi, proprio come scp
, supponiamo che ci sia un utente con lo stesso nome dell'utente locale sul computer remoto per impostazione predefinita.
rsync
pagina della documentazione cercata , non ho trovato come usare ssh-key per accedere. Non voglio usare username / password per accedere
rsync
. E sì, hai bisogno anche rsync
sul lato remoto, proprio come con scp
. Per quanto riguarda le chiavi SSH, rsync
attualmente utilizza SSH con l'impostazione predefinita -e ssh
, quindi se hai le chiavi configurate per l'uso con scp
, funzioneranno anche per rsync
.
-r
non fa differenza. Lo scenario che descrivi funziona solo se stai copiando una directory e se esiste la directory principale di destinazione. Quindi, rsync foo/ u@h:~/
creerà la directory di destinazione foo
ma rsync foo/ u@h:~/bar/
non creerà la directory di destinazione bar
. Quello creerà bar/foo
solo se bar/
esiste. In ogni caso, l'OP sta caricando i file e anche nei casi in cui funziona, funziona solo per intere directory.
rsync file host:/foo/file
fallisce se foo/
non esiste ma rsync file host:/foo/
crea la directory e inserisce file
in essa. Strano. Comunque, hai ragione e lo scenario di base funziona, ritirerò il mio voto negativo.
Se stai copiando un gruppo di file, non proprio. Se stai copiando una directory e tutti i contenuti sottostanti, sì. Dato questo comando:
$ scp -pr /source/directory user@host:the/target/directory
Se directory
non esiste in ~/the/target
on host
, verrà creato. Se, tuttavia, ~the/target
non esiste, probabilmente avrai dei problemi: non ricordo i risultati esatti di questo caso, ma sii pronto scp
a fallire.
scp: /home/madmike/test_bin: No such file or directory
Non appena manca la directory di destinazione, questo si interrompe sulla mia configurazione. Utilizzo di cygwin sul client e RHEL 6.9 sul server. Qual è la tua configurazione?
Per quanto ne so, di per scp
sé non può farlo, no. Tuttavia, è possibile solo ssh
sul computer di destinazione, creare la directory e quindi copiare. Qualcosa di simile a:
ssh user@host "mkdir -p /target/path/" &&
scp /path/to/source user@host:/target/path/
Nota che se stai copiando intere directory, non è necessario quanto sopra. Ad esempio, per copiare la directory ~/foo
sull'host remoto, è possibile utilizzare il -r
flag (ricorsivo):
scp ~/foo/ user@host:~/
Ciò creerà la directory di destinazione ~/foo
sull'host remoto. Tuttavia, non è possibile creare la directory principale. scp ~/foo user@host:~/bar/foo
fallirà a meno che non bar
esista la directory di destinazione . In ogni caso, il -r
flag non aiuta a creare una directory di destinazione se si copiano singoli file.
Si, puoi. Secondo la pagina man di scp:
man scp
.....
-r Copia ricorsivamente intere directory. Nota che scp segue i collegamenti simbolici che si incontrano nell'attraversamento degli alberi.
....
scp -r foo/ u@h:~/bar
creerà bar/foo
se il telecomando bar/
esiste ma fallirà se non lo fa.
foo
contenuti nella nuova directory /bar
. Naturalmente il nome è stato cambiato, il che potrebbe non essere quello che l'OP vuole. Se quello che vuoi è una nuova struttura ad albero creata nella macchina di destinazione, allora scp
non farà il lavoro, se quello che vuoi è replicare una struttura ad albero da un certo ramo nella struttura, allora quella struttura viene creata.
scp -r file host:~/bar/
non creerà bar/
.
Uso la seguente funzione prima di trasferire le btrfs
istantanee su 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
}
Basta chiamare la funzione nel tuo script con:
check_remote_dir /my/remote/path
Potresti concatenare il comando con il comando mkdir e quindi fare riferimento alla cartella che hai creato:
mkdir ~/new-folder/ && scp -P 22 <remote/url>:~/new-folder/
Se limitato a scp o sftp senza ssh disponibile (da rssh), è possibile creare directory copiando l'albero di directory vuoto con rsync e quindi copiando i file.
È così che inserisco la chiave pubblica ssh nell'host remoto quando ssh-copy-id non funziona e la directory .ssh non esiste:
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
È possibile combinare questi comandi in un rsync aggiungendo un altro filtro di inclusione nel mezzo, se il nome del file di destinazione è lo stesso.