Scp può creare una directory se non esiste?


89

Voglio usare scpper 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:


72

Questa è una delle tante cose che rsyncpossono fare.

Se usi una versione di rsyncrilasciata negli ultimi anni, ¹ la sua sintassi di comando di base è simile a scp: ²

$ rsync -r local-dir remote-machine:path

Ciò copierà local-sourcee il suo contenuto $HOME/path/local-dirsul computer remoto, creando qualunque directory sia richiesta

rsyncha 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 rsynccomando con qualcosa del genere:

$ ssh remote-host 'mkdir -p foo/bar/qux'

Ciò creerà l' $HOME/foo/bar/quxalbero se non esiste. Non si lamenterà o farà altro se non esiste già.

rsynca 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 :

  1. Prima della rsync2.6.0 (1 ° gennaio 2004), richiedeva che il -e sshflag si comportasse come scpse fosse predefinito al protocollo RSH obsoleto .

  2. scpe rsynccondividi alcune bandiere, ma c'è solo un po 'di sovrapposizione.

  3. Quando si utilizza SSHcome protocollo di trasferimento, rsyncutilizza 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.


Sto usando Mac OSX, devo installare rsync sia sul lato locale che su quello remoto?
AGamePlayer

rsyncpagina della documentazione cercata , non ho trovato come usare ssh-key per accedere. Non voglio usare username / password per accedere
AGamePlayer

1
@AwQiruiGuo: navi Mac OS X con rsync. E sì, hai bisogno anche rsyncsul lato remoto, proprio come con scp. Per quanto riguarda le chiavi SSH, rsyncattualmente utilizza SSH con l'impostazione predefinita -e ssh, quindi se hai le chiavi configurate per l'uso con scp, funzioneranno anche per rsync.
Warren Young,

1
@WarrenYoung -rnon 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 fooma rsync foo/ u@h:~/bar/non creerà la directory di destinazione bar. Quello creerà bar/foosolo se bar/esiste. In ogni caso, l'OP sta caricando i file e anche nei casi in cui funziona, funziona solo per intere directory.
terdon

1
Sì, ci ho giocato anche io. Sembra che specificare un nome di file lo faccia fallire. Quindi rsync file host:/foo/filefallisce se foo/non esiste ma rsync file host:/foo/crea la directory e inserisce filein essa. Strano. Comunque, hai ragione e lo scenario di base funziona, ritirerò il mio voto negativo.
terdon

35

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 directorynon esiste in ~/the/targeton host, verrà creato. Se, tuttavia, ~the/targetnon esiste, probabilmente avrai dei problemi: non ricordo i risultati esatti di questo caso, ma sii pronto scpa fallire.


1
scp: /home/madmike/test_bin: No such file or directoryNon 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?
MadMike,

16

Per quanto ne so, di per scpsé non può farlo, no. Tuttavia, è possibile solo sshsul 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 ~/foosull'host remoto, è possibile utilizzare il -rflag (ricorsivo):

scp ~/foo/ user@host:~/

Ciò creerà la directory di destinazione ~/foosull'host remoto. Tuttavia, non è possibile creare la directory principale. scp ~/foo user@host:~/bar/foofallirà a meno che non baresista la directory di destinazione . In ogni caso, il -rflag non aiuta a creare una directory di destinazione se si copiano singoli file.


3

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.

....


7
Ciò non creerà la directory principale di destinazione. Può copiare una directory in una posizione esistente. Quindi, scp -r foo/ u@h:~/barcreerà bar/foose il telecomando bar/esiste ma fallirà se non lo fa.
terdon

1
Non fallirà. Copia i foocontenuti 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 scpnon farà il lavoro, se quello che vuoi è replicare una struttura ad albero da un certo ramo nella struttura, allora quella struttura viene creata.
YoMismo

6
Sì, ma funziona solo se si stanno copiando directory , non file. scp -r file host:~/bar/non creerà bar/.
terdon

3

Uso la seguente funzione prima di trasferire le btrfsistantanee 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


Faccio praticamente la stessa cosa, ma devo digitare la password manualmente (per motivi di sicurezza), quindi finisco per digitarla almeno due volte ...
Stefan Reich,

0

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/

3
(1) La domanda dice "automaticamente". Questo non sembra essere automatico. (2) Questa sembra essere solo una banale variazione sulla risposta di Terdon .
G-Man il

0

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.