Ik wil graag bestanden kopiëren van/naar een externe server in verschillende mappen.
Ik wil bijvoorbeeld deze 4 opdrachten tegelijk uitvoeren.
scp remote:A/1.txt local:A/1.txt
scp remote:A/2.txt local:A/2.txt
scp remote:B/1.txt local:B/1.txt
scp remote:C/1.txt local:C/1.txt
Wat is de gemakkelijkste manier om dat te doen?
Antwoord 1, autoriteit 100%
Kopieer meerdere bestanden van extern naar lokaal:
$ scp [email protected]:/some/remote/directory/\{a,b,c\} ./
Kopieer meerdere bestanden van lokaal naar extern:
$ scp foo.txt bar.txt [email protected]:~
$ scp {foo,bar}.txt [email protected]:~
$ scp *.txt [email protected]:~
Kopieer meerdere bestanden van afstandsbediening naar afstandsbediening:
$ scp [email protected]:/some/remote/directory/foobar.txt \
[email protected]:/some/remote/directory/
Bron: http://www.hypexr.org/linux_scp_help.php
Antwoord 2, autoriteit 45%
Van lokaal naar server:
scp file1.txt file2.sh [email protected]:~/pathtoupload
Van server naar lokaal:
scp -T [email protected]:"file1.txt file2.txt" "~/yourpathtocopy"
Antwoord 3, autoriteit 17%
Je kunt hele mappen kopiëren met de schakelaar -r
, dus als je je bestanden in een eigen map kunt isoleren, kun je alles in één keer kopiëren.
scp -r ./dir-with-files [email protected]:upload-path
scp -r [email protected]:path-to-dir-with-files download-path
dus bijvoorbeeld
scp -r [email protected]:/var/log ~/backup-logs
Of als er maar een paar zijn, kunt u het volgende gebruiken:
scp 1.txt 2.txt 3.log [email protected]:upload-path
Antwoord 4, autoriteit 12%
Zoals Jiri al zei, kun je scp -r [email protected]:/some/remote/path /some/local/path
gebruiken om bestanden recursief te kopiëren. Dit veronderstelt dat er een enkele map is die alle bestanden bevat die u wilt overbrengen (en niets anders).
SFTP biedt echter een alternatief als u bestanden uit meerdere verschillende mappen wilt overbrengen en de bestemmingen niet identiek zijn:
sftp [email protected] << EOF
get /some/remote/path1/file1 /some/local/path1/file1
get /some/remote/path2/file2 /some/local/path2/file2
get /some/remote/path3/file3 /some/local/path3/file3
EOF
Dit gebruikt de “here doc”-syntaxis om een reeks SFTP-invoeropdrachten te definiëren. Als alternatief kunt u de SFTP-commando’s in een tekstbestand plaatsen en sftp [email protected] -b batchFile.txt
uitvoeren
Antwoord 5, autoriteit 7%
De antwoorden met {file1,file2,file3}
werken alleen met bash (op afstand of lokaal)
De echte manier is:
scp [email protected]:'/path1/file1 /path2/file2 /path3/file3' /localPath
Antwoord 6, autoriteit 4%
Na een tijdje met scp te hebben gespeeld, heb ik de meest robuuste oplossing gevonden:
(Pas op voor de enkele en dubbele aanhalingstekens)
Lokaal naar extern:
scp -r "FILE1" "FILE2" HOST:'"DIR"'
Op afstand naar lokaal:
scp -r HOST:'"FILE1" "FILE2"' "DIR"
Merk op dat alles wat na “HOST:” naar de afstandsbediening wordt verzonden en daar wordt geparseerd. We moeten er dus voor zorgen dat ze niet door de lokale shell worden verwerkt. Daarom komen er enkele aanhalingstekens voor. De dubbele aanhalingstekens worden gebruikt om spaties in de bestandsnamen te verwerken.
Als bestanden allemaal in dezelfde map staan, kunnen we * gebruiken om ze allemaal te matchen, zoals
scp -r "DIR_IN"/*.txt HOST:'"DIR"'
scp -r HOST:'"DIR_IN"/*.txt' "DIR"
Vergeleken met het gebruik van de “{}”-syntaxis die alleen door sommige shells wordt ondersteund, is deze universeel
Antwoord 7, autoriteit 3%
De eenvoudigste manier is
local$ scp remote:{A/1,A/2,B/3,C/4}.txt ./
Dus {.. } lijst kan mappen bevatten (A, B en C hier zijn mappen; “1.txt” en “2.txt” zijn bestandsnamen in die mappen).
Hoewel het al deze vier bestanden naar één lokale map zou kopiëren, weet ik niet zeker of dat is wat je wilde.
In het bovenstaande geval zul je de externe bestanden A/1.txt, A/2.txt, B/3.txt en C/4.txt kopiëren naar een enkele lokale map, met bestandsnamen ./1 .txt, ./2.txt, ./3.txt en ./4.txt
Antwoord 8, autoriteit 3%
Probleem: meerdere mappen kopiëren van een externe server naar een lokale machine met behulp van een enkele SCP-opdracht en elke map behouden zoals deze zich op de externe server bevindt.
Oplossing: SCP kan dit eenvoudig doen. Dit lost het vervelende probleem op van het meerdere keren invoeren van een wachtwoord bij gebruik van SCP met meerdere mappen. Dit scheelt dus ook veel tijd!
bijv.
# copies folders t1, t2, t3 from `test` to your local working directory
# note that there shouldn't be any space in between the folder names;
# we also escape the braces.
# please note the dot at the end of the SCP command
~$ cd ~/working/directory
~$ scp -r [email protected]:/work/datasets/images/test/\{t1,t2,t3\} .
PS: Gemotiveerd door dit geweldige antwoord: scp of sftp kopieer meerdere bestanden met één opdracht
Op basis van de opmerkingen werkt dit ook prima in Git Bash op Windows
Antwoord 9, autoriteit 2%
Meerdere mappen kopiëren:
scp -r dir1 dir2 dir3 [email protected]:~/
Antwoord 10
Je kunt het als volgt doen:
scp [email protected]:/path/to/files/\\{file1,file2,file3\\}.fileExtension ./
Hiermee worden alle vermelde bestandsnamen gedownload naar de lokale map waarin u zich bevindt.
Zorg ervoor dat er geen spaties tussen elke bestandsnaam staan, gebruik alleen een komma ,
.
Antwoord 11
OPMERKING: bij voorbaat mijn excuses voor het beantwoorden van slechts een deel van de bovenstaande vraag. Ik vond deze commando’s echter nuttig voor mijn huidige Unix-behoeften.
Specifieke bestanden uploaden van een lokale computer naar een externe computer:
~/Desktop/dump_files$ scp file1.txt file2.txt lab1.cpp etc.ext [email protected]:Folder1/DestinationFolderForFiles/
Een volledige map uploaden van een lokale machine naar een externe machine:
~$ scp -r Desktop/dump_files [email protected]:Folder1/DestinationFolderForFiles/
Een volledige map downloaden van een externe machine naar een lokale machine:
~/Desktop$ scp -r [email protected]:Public/web/ Desktop/
Antwoord 12
In mijn geval ben ik beperkt tot het gebruik van de opdracht sftp.
Ik moest dus een batchbestand met sftp gebruiken. Ik heb een script gemaakt zoals het volgende. Dit veronderstelt dat u in de map /tmp werkt en dat u de bestanden in destdir_on_remote_system op het externe systeem wilt plaatsen. Dit werkt ook alleen met een niet-interactieve login. U moet openbare/privésleutels instellen zodat u kunt inloggen zonder een wachtwoord in te voeren. Wijzig indien nodig.
#!/bin/bash
cd /tmp
# start script with list of files to transfer
ls -1 fileset1* > batchfile1
ls -1 fileset2* >> batchfile1
sed -i -e 's/^/put /' batchfile1
echo "cd destdir_on_remote_system" > batchfile
cat batchfile1 >> batchfile
rm batchfile1
sftp -b batchfile [email protected]
Antwoord 13
In het specifieke geval waarin alle bestanden dezelfde extensie hebben maar met een ander achtervoegsel (bijvoorbeeld het nummer van het logbestand), gebruik je het volgende:
scp [email protected]:/some/log/folder/some_log_file.* ./
Hiermee worden alle bestanden met de naam some_log_file gekopieerd uit de opgegeven map in de afstandsbediening, dwz- some_log_file.1 , some_log_file.2, some_log_file.3 ….
Antwoord 14
Is eenvoudiger zonder scp
te gebruiken:
tar cf - file1 ... file_n | ssh [email protected] 'tar xf -'
Hiermee kun je ook een aantal dingen doen, zoals het comprimeren van de stream (-C
) of (sinds OpenSSH v7.3) -J
om op elk moment door een stream te springen (of meer) proxyservers.
U kunt voorkomen dat u wachtwoorden gebruikt die uw openbare sleutel kopiëren naar ~/.ssh/authorized_keys
met ssh-copy-id
.
Ook hier geplaatst (met meer details) en hier.
Antwoord 15
scp remote:"[A-C]/[12].txt" local:
Antwoord 16
scp gebruikt ssh voor gegevensoverdracht met dezelfde authenticatie en biedt dezelfde beveiliging als ssh.
Een best practice hier is om “SSH-SLEUTELS EN PUBLIC KEY AUTHENTICATION” te implementeren. Hiermee kunt u uw scripts schrijven zonder u zorgen te maken over authenticatie. Zo simpel.