Ich muss ein Remote-Skript mit ssh
via Ruby
( net / ssh ) ausführen, um einen Ordner rekursiv zu kopieren und einen Unterordner auszuschließen. Ich suche nach dem schnellsten Weg, also rsync
ist es nicht gut. Auch ich verstehe das ssh
nutzt sh
und nicht bash
.
In Bash mache ich:
cp -r srcdir/!(subdir) dstdir
und es funktioniert gut. Wenn ich das Skript jedoch über ssh
starte, erhalte ich den Fehler
sh: 1: Syntax error: "(" unexpected
weil es benutzt sh
.
Ich habe die sh
Manpage überprüft , aber es gibt keine Möglichkeit, Dateien auszuschließen.
Ist es meine Annahme ssh
, sh
richtig zu verwenden? Irgendein alternativer Vorschlag?
EDIT 1:
Falls es nützlich ist, ist die Ausgabe von sudo cat /etc/shells
der folgenden:
# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
/usr/bin/tmux
/usr/bin/screen
EDIT 2:
OK. Bash es ist verfügbar und das scheint nicht das Problem zu sein. Ich habe überprüft, dass der SSH tatsächlich verwendet bash
. Das Problem scheint mit dem Entkommen von Klammern oder Ausrufezeichen zu tun zu haben. Ich habe versucht, den Befehl über die Shell (MacOS) auszuführen, und dies ist der eigentliche Befehl:
ssh -i .ssh/key.pem ubuntu@X.X.X.X 'mkdir /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/N; cp -r /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/!\(constant\) /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/N; ln -s /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/constant /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/N/constant'
Auf diese Weise erhalte ich einen anderen Fehler
cp: cannot stat '/home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/!(constant)': No such file or directory
EDIT 3:
Basierend auf den Kommentaren habe ich meinen Befehl zum Hinzufügen geändertextglob
Wenn ich benutze
ssh -i .ssh/key.pem ubuntu@X.X.X.X 'shopt -s extglob; mkdir /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/N; cp -r /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/!\(constant\) /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/N; ln -s /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/constant /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/N/constant'
Ich erhalte folgende Fehlermeldung:
cp: cannot stat '/home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/!(constant)': No such file or directory
Wenn ich der Klammer nicht entkomme, bekomme ich
bash: -c: line 0: syntax error near unexpected token `('
ssh
(gutsshd
) verwendet die Login-Shell des Remote-Benutzers. Könnte alles sein.Antworten:
SSH führt Ihre Login-Shell auf dem Remote-System aus. Benötigt
!(foo)
abershopt -s extglob
, was Sie möglicherweise nicht auf der Fernbedienung eingestellt haben.Versuchen Sie dies, um festzustellen, ob SSH Bash auf der Remote-Seite ausführt:
Wenn dadurch etwas gedruckt wird, Ihre Startskripte jedoch nicht festgelegt sind
extglob
, können Sie dies mit dem folgenden Befehl manuell tunssh
:extglob
wirkt sich auf das Parsen der Befehlszeile aus und wird erst nach einer neuen Zeile wirksam. Daher müssen wir dort eine wörtliche neue Zeile einfügen. Ein Semikolon reicht nicht aus.Auch nicht, dass, wenn Sie der Klammer mit Backslashes entkommen, sie ihre besonderen Eigenschaften verlieren, wie alle anderen Glob-Zeichen. Dies ist in diesem Fall nicht das, was Sie tun möchten.
quelle
Ich weiß nicht, warum Sie denken, dass rsync langsam sein würde. Die Geschwindigkeit einer Kopie wird hauptsächlich durch die Geschwindigkeit der Festplatte bestimmt. Rsync bietet viele Optionen zum Festlegen, was eingeschlossen und ausgeschlossen werden soll, sodass Sie eine viel bessere Kontrolle haben als beim Shell-Globbing.
Wie im Bash-Handbuch angegeben,
!(patter)
wird das in Bash nur erkannt, wennextglob
es eingestellt ist. In Ihrem Beispiel haben Sie nicht festgelegtextglob
. Außerdem wird abash
wiesh
immer gestartet gestartetbash
, einige Erweiterungen werden jedoch aus Kompatibilitätsgründen deaktiviert.Der SSH-Server startet die Anmeldeshell des Benutzers wie in angegeben
/etc/passwd
. Sie können entweder die Shell ändern oder diese Shell verwenden, um eine andere Shell zu starten, die Ihren Anforderungen besser entspricht.quelle
time
.time cp -r mesh/!(constant) N
-> echte 1.04s undtime rsync -a mesh/ N --exclude=constant
-> echte 1.8sEin paar Anmerkungen zuerst:
sh
der Interpretation der vom Client gesendeten Befehlszeile. Er führt die Anmeldeshell des Benutzers auf dem Remote-Host als austhat-shell -c <the-string-provided-by-the-client>
. Die Login-Shell des Remote-Benutzers kann alles sein. Beachten Sie, dass einige Shells mögentcsh
,fish
oderrc
haben sehr unterschiedliche Syntax von dersh
.ssh host cmd arg1 'arg 2'
wocmd
,arg1
undarg 2
sind drei Argumente übergebenssh
,ssh
verkettet diese Argumente mit Leerzeichen und tatsächlich sendet diecmd arg1 arg 2
Zeichenfolge ansshd
, und die Remote - Shell würde , dass in Splitcmd
,arg1
,arg
und2
.!(subdir)
ist ein Glob-Operator (einksh
Glob-Operator, der auch vonzsh -o kshglob
und unterstützt wirdbash -O extglob
). Wie bei allen Globs werden versteckte Dateien ausgeschlossen. Achten Sie daher darauf, dass möglicherweise andere Dateien ausgeschlossen sind.Um das Problem beim Herausfinden der richtigen Syntax für die Remote-Shell zu vermeiden, können Sie dieser anderen Shell tatsächlich mitteilen, dass sie die gewünschte Shell starten und den Code über stdin eingeben soll (eine der unter Ausführen einer beliebigen einfachen Liste aufgeführten Optionen) Befehl über ssh ohne die Login-Shell des Remote-Benutzers zu kennen? )
bash -O extglob -O dotglob
ist eine Befehlszeile, die von allen wichtigen Shells, einschließlich Bourne-ähnlichen Shells, csh, rc, fish ..., gleich verstanden wird. Dies funktioniert, solangebash
es installiert ist und sich im Benutzer befindet$PATH
(Standard$PATH
, möglicherweise vom Benutzer geändert) Login Shell wie mit~/.zshenv
fürzsh
,~/.cshrc
fürcsh
,~/.bashrc
fürbash
).POSIXly (obwohl in der Praxis möglicherweise mehr Systeme einen
bash
Befehl als einenpax
Befehl haben) können Sie Folgendes tun:-s
Wendet Ersetzungen auf die übertragenen Pfade an. Wenn diese Ersetzung auf nichts erweitert wird, wird die Datei ausgeschlossen. Das Problem ist, dass Ersetzungen auch für das Ziel von Symlinks gelten. Aus diesem Grund verwenden wir.//.
oben, um die Wahrscheinlichkeit zu verringern, dass ein Symlink betroffen ist.quelle
Ich denke nicht, dass
ssh
es auf die Verwendung beschränkt istsh
. Es hängt vielmehr davon ab, was auf dem Zielsystem installiert ist, wie der Benutzer eingerichtet ist und welche Shells zulässig sind/etc/shells
.Hast du den
chsh
Befehl in Betracht gezogen ?quelle
Wenn Sie es schnell machen möchten, können Sie es
rsync
mit einem anderen Verschlüsselungsalgorithmus betrachten. Dies gibt Ihnen die Möglichkeit, usw. einfach auszuschließen, ohne viel Geschwindigkeit zu opfern.rsync -aHAXxv --numeric-ids --progress -e "ssh -T -c arcfour -o Compression=no -x" user@<source>:<source_dir> <dest_dir>
Zusammen mit dem Hinzufügen der
arcfour
Verschlüsselung zu der Zeile, die mitCiphers
in beginnt/etc/ssh/ssh_config
, erhalten Sie eine akzeptable Geschwindigkeit, sofern diese noch nicht aktiviert ist.WARNUNG: Die
arcfour
Verschlüsselung ist unsicher . Führen Sie dies NICHT über unsichere Kanäle aus. Wenn Sie Zugriff auf den Server von unsicheren Kanälen betroffen sindarcfour
Verschlüsselung, die Änderungetc/ssh/ssh_config
mit einem Host-spezifischen Teil für den Quell - Host - Erstellen Sie einenHost
Abschnitts in Ihrem ssh_config für Ihre Quell - Host, können SieCiphers arcfour
dort den oben spiegeln-c
Schalter, der Beschränkt diearcfour
Verschlüsselung nur auf diesen Host.Einzelheiten finden Sie in den
ssh_config
Manpages.Wenn Ihre CPUs jedoch den AES-NI-Befehlssatz unterstützen, wechseln Sie zu [email protected] (ja, das ist der Chiffrenname, einschließlich des @ -Stuffs), der den blitzschnellen (mit AES-NI) AES128 verwendet -GCM.
Wenn eine CPU AES-NI unterstützt, wechseln Sie
"ssh -T -c arcfour -o Compression=no -x"
zu,"ssh -T -c [email protected] -o Compression=no -x"
um sicherere Ergebnisse zu erzielen.Erläuterung
rsync
-z
, es ist viel langsamer)a
: Archivierungsmodus - reskursiv, behält den Besitzer, die Berechtigungen, die Änderungszeiten, die Gruppe, kopiert Symlinks als Symlinks und bewahrt Gerätedateien.H
: bewahrt HardlinksA
: behält ACLs beiX
: behält erweiterte Attribute beix
: Dateisystemgrenzen nicht überschreitenv
: Ausführlichkeit erhöhen--numeric-ds
: Ordnen Sie UID / GID-Werte nicht dem Benutzer- / Gruppennamen zu--delete
Folgendes hinzu : Löschen Sie fremde Dateien aus den Zielverzeichnissen (differenzielle Bereinigung während der Synchronisierung).--progress
: Fortschritt während der Übertragung anzeigenssh
T
: Schalten Sie pseudo-tty aus, um die CPU-Last am Ziel zu verringern.c arcfour
: Verwenden Sie die schwächste, aber schnellste SSH-Verschlüsselung. Muss "siphers arcfour" in sshd_config am Ziel angeben.o Compression=no
: Schalten Sie die SSH-Komprimierung aus.x
: Deaktivieren Sie die X-Weiterleitung, wenn sie standardmäßig aktiviert ist.Das Rindfleisch ist in den
ssh
Optionen - wenn Sie nurrsync -av
und das-e ssh -T -c arcfour -o Compression=no -x"
Teil verwenden, können Sie diese Geschwindigkeiten auch erhalten.Vergleich:
rsync -az
scp -Cr
rsync -a
sftp
scp -r
sftp -R 128 -B 65536
rsync -a -P -e "ssh -T -c arcfour -o Compression=no -x"
scp -r -c arcfour
sftp -oCiphers=arcfour
Quellen :
https://gist.github.com/KartikTalwar/4393116
http://nz2nz.blogspot.com/2018/05/rsync-scp-sftp-speed-test.html
quelle
cp -r
im Remote-System ausgeführt zu werden, daher ist die von der SSH-Verbindung verwendete Verschlüsselung nicht wirklich relevant. In jedem Fallarcfour
wird es als ziemlich kaputt angesehen und OpenSSH deaktiviert es zusammen mit anderen auf dem Server standardmäßig seit Version 6.7 (06.10.2014) . In jedem Fallssh -o Ciphers='aes128-ctr'
gibt mir etwa 90 MB / s, was auf einer 1 Gbit / s-Verbindung schnell genug sein sollte.Nach meinen Berechnungen verwendet die schnellste vollständige Kopie immer 'tar' (hier unter der Annahme von GNU
tar
oder kompatibel).Und
tar
bietet unzählige Optionen zum Bearbeiten von Attributen, Berechtigungen und zum Auswählen / Ausschließen von Dateien. Mit dem obigen Befehl wird beispielsweise der Unterordner der obersten Ebene mit dem Namen .thumbcache beim Kopieren ausgeschlossen.quelle
--exclude=.thumbcache
umfasst nicht alle die.thumbcache
Dateien, nicht nur die eine auf der obersten Ebene. Mit GNUtar
(nichtbsdtar
) können Sie--exclude=./.thumbcache
nur die.thumbcache
Datei der obersten Ebene ausschließen .