J'ai besoin d'exécuter un script distant en utilisant ssh
via Ruby
( net / ssh ) pour copier récursivement un dossier et exclure un sous-dossier. Je cherche le moyen le plus rapide de le faire donc ce rsync
n'est pas bon. Aussi, je comprends que cela ssh
utilise sh
et non bash
.
En bash je fais:
cp -r srcdir/!(subdir) dstdir
et ça marche bien. Cependant, lorsque je lance le script via, ssh
je reçois l'erreur
sh: 1: Syntax error: "(" unexpected
car il utilise sh
.
J'ai vérifié la sh
page de manuel, mais il n'y a pas d'option pour exclure des fichiers.
Est-ce ma supposition d' ssh
utiliser sh
correctement? Une autre suggestion?
EDIT 1:
Si cela est utile, la sortie de sudo cat /etc/shells
est la suivante:
# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
/usr/bin/tmux
/usr/bin/screen
EDIT 2:
OK. Alors bash, il est disponible et cela ne semble pas être le problème. J'ai vérifié que le ssh utilise réellement bash
. Le problème semble être lié à la fuite de parenthèses ou d'exclamation. J'ai essayé d'exécuter la commande à partir du shell (macos) et voici la commande réelle:
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'
De cette façon, je reçois une erreur différente
cp: cannot stat '/home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/!(constant)': No such file or directory
EDIT 3:
Sur la base des commentaires, j'ai changé ma commande en ajoutantextglob
Si j'utilise
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'
Je reçois l'erreur suivante:
cp: cannot stat '/home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/!(constant)': No such file or directory
Si je n'échappe pas à la parenthèse, je reçois
bash: -c: line 0: syntax error near unexpected token `('
ssh
(enfinsshd
) utilise le shell de connexion de l'utilisateur distant. Ça pourrait être n'importe quoi.