Devo eseguire uno script remoto usando ssh
via Ruby
( net / ssh ) per copiare ricorsivamente una cartella ed escludere una sottocartella. Sto cercando il modo più veloce per farlo, quindi rsync
non va bene. Inoltre, capisco che ssh
usa sh
e non bash
.
In bash faccio:
cp -r srcdir/!(subdir) dstdir
e funziona benissimo. Tuttavia quando avvio lo script tramite ssh
ricevo l'errore
sh: 1: Syntax error: "(" unexpected
perché sta usando sh
.
Ho controllato la sh
pagina man, ma non esiste alcuna opzione per escludere i file.
È la mia ipotesi di ssh
utilizzo sh
corretto? Qualche suggerimento alternativo?
EDIT 1:
Nel caso sia utile, l'output di sudo cat /etc/shells
è il seguente:
# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
/usr/bin/tmux
/usr/bin/screen
MODIFICA 2:
OK. Quindi bash è disponibile e questo non sembra essere il problema. Ho verificato che l'ssh sta effettivamente usando bash
. Il problema sembra essere legato alla fuga di parentesi o punto esclamativo. Ho provato a eseguire il comando dalla shell (macos) e questo è il comando effettivo:
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'
In questo modo ricevo un errore diverso
cp: cannot stat '/home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/!(constant)': No such file or directory
MODIFICA 3:
In base ai commenti ho modificato l'aggiunta del mio comandoextglob
Se io uso
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'
Ricevo il seguente errore:
cp: cannot stat '/home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/!(constant)': No such file or directory
Se non sfuggo alla parentesi, ottengo
bash: -c: line 0: syntax error near unexpected token `('
ssh
(benesshd
) usa la shell di login dell'utente remoto. Potrebbe essere qualsiasi cosa.