SCP-Befehl mit ausgewählten Dateien und Verzeichnissen zum Herunterladen fragt nach dem Kennwort für jede neue Datei oder jedes neue Verzeichnis

9

Auf meinem Fedora 20-System verwende ich häufig scp, und dies ist das zweite Mal, dass ich darauf stoße, wenn ich diesen Befehl ausführe:

scp -r -P PORT user@host:/home/user/something/{file1,folder1,folder2,folder3,folder4} folder/folder2/

Es fragt mich nach dem Passwort für jede Datei / jedes Verzeichnis, das es überträgt.

user@host's password: "password here"

Frage:

Was passiert hier?

Ist das normal, ich würde denken, dass dies ein sehr eigenartiges Verhalten ist?

etwas etwas
quelle

Antworten:

13

Ihre lokale Shell (wahrscheinlich Bash) wird erweitert

user@host:/home/user/something/{file1,folder1,folder2,folder3,folder4}

in:

user@host:/home/user/something/file1 user@host:/home/user/something/folder1 user@host:/home/user/something/folder2 user@host:/home/user/something/folder3 user@host:/home/user/something/folder4

Stattdessen können Sie Folgendes tun:

scp -r -P PORT user@host:"/home/user/something/file1 /home/user/something/folder1 /home/user/something/folder2 /home/user/something/folder3 /home/user/something/folder4" folder/folder2/

Wenn Sie wissen, dass die Anmeldeshell des Benutzers auf der Remote-Seite bash ist, können Sie auch die Klammererweiterung verwenden:

scp -r -P PORT user@host:"/home/user/something/{file1,folder1,folder2,folder3,folder4}" folder/folder2/

Damit die Remote-Shell die Zeichenfolge anstelle der lokalen Shell in Argumente aufteilt.

Geirha
quelle
5

Ja, das ist normal. Was passiert ist, dass Ihre Shell die geschweiften Klammern erweitert, bevor Sie den Befehl ausführen, so dass Sie tatsächlich ausführen

scp -r -P PORT user@host:/home/user/something/file1 \ 
               user@host:/home/user/something/folder1 \ 
               user@host:/home/user/something/folder3 \ 
               user@host:/home/user/something/folder4 folder/folder2

Grundsätzlich werden scpmehrere Verbindungsanforderungen angezeigt, sodass für jede eine neue Verbindung geöffnet wird. EinwegDer einfachste Weg(Die Verwendung von Anführungszeichen, wie von @geirha vorgeschlagen, ist für eine einmalige Operation einfacher.) Um dies zu lösen, müssen Sie passwortlos einrichten ssh/ scp:

$ ssh-keygen 
$ ssh-copy-id -p PORT user@host

Diese beiden Befehle einmal (und beantworten Sie die Anweisungen , je nach Bedarf) Nach dem Ausführen, sind Sie in der Lage sein , ssh/ scpfür alle zukünftigen SSH - Verbindungen ohne Verwendung eines Passworts. Dies ist i) tatsächlich sicherer und ii) viel bequemer.

terdon
quelle
+1, nette Art (natürlich muss die ssh-keygen & ssh-copy-id nur einmal gemacht werden). Ich würde sagen, dass es sicherer ist ... nur wenn Sie sicherstellen , dass der private Teil von niemandem außer diesem Benutzer "nicht erreichbar" ist ... Was nicht immer einfach ist.
Olivier Dulac
@OlivierDulac was meinst du? Der id.rsahat 600standardmäßig Berechtigungen und sshfunktioniert nicht einmal, wenn dies nicht der Fall ist. Dies bedeutet, dass es vor jedem sicher ist, aber rootnichts ist wirklich sicher root, schon gar nicht vor Passwörtern.
Terdon
Ich wollte nur diesen Kommentar hinzufügen, damit Benutzer, die einen kennwortlosen Zugriff einrichten, die Tatsache berücksichtigen (und grok), dass sich der private Schlüssel in einer sicheren Umgebung befinden muss und nicht lesbar / nicht freigegeben / etc. (dh es ist eine sanfte Art, darauf hinzuweisen, da diejenigen, die fragen, möglicherweise nicht alle Auswirkungen kennen, die das Teilen / Zulassen des Zugriffs auf den privaten Schlüssel haben könnte)
Olivier Dulac
@OlivierDulac ah, fair genug. Ich fand es nicht erwähnenswert, weil 1) es bei der Verwendung automatisch geschieht ssh-keygenund 2) ssh / scp sich beschwert und nach einem Passwort fragt, wenn die Datei von jemand anderem gelesen werden kann. Zumindest unter Linux.
Terdon
4

scp ist nicht sehr klug: Wenn mehrere Befehlszeilenargumente angegeben werden, die Dateien vom selben Remote-Host sind, wird für jedes Argument eine neue Verbindung geöffnet.

Sie können rsyncstattdessen verwenden scp, es ist auf diese Weise (und auf andere Weise) intelligenter.

rsync -r -e 'ssh -P PORT' user@host:/home/user/something/{file1,folder1,folder2,folder3,folder4} folder/folder2/

Ein anderer Ansatz besteht darin , ein einzelnes Argument zu übergeben scp, das mehrere Dateien beschreibt .

Ein anderer Ansatz besteht darin, Ihr System so einzurichten, dass Sie sich nicht ständig authentifizieren müssen. Richten Sie vorzugsweise die Schlüsselauthentifizierung ein , die in den meisten Szenarien sowohl bequemer als auch sicherer ist. Alternativ oder zusätzlich können Sie die Verbindungsfreigabe einrichten , sodass Sie sich nur einmal pro Sitzung authentifizieren müssen. Richten Sie in jedem Fall einen Alias ​​ein, damit Sie nicht jedes Mal den Benutzernamen und den Port angeben müssen. In Ihrem ~/.ssh/config:

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r

Host nick
HostName real-host-name.example.com
User bob
Port 1234

Führen Sie ssh -Nf nickdiese Option aus , um eine Verbindung zu öffnen. Alle nachfolgenden Verbindungen nickwerden dann auf die vorhandene Verbindung übertragen. Jetzt kannst du einfach rennen

scp -r nick:/home/user/something/{file1,folder1,folder2,folder3,folder4} folder/folder2/
Gilles 'SO - hör auf böse zu sein'
quelle