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.