Devo eseguire uno script remoto usando sshvia Ruby( net / ssh ) per copiare ricorsivamente una cartella ed escludere una sottocartella. Sto cercando il modo più veloce per farlo, quindi rsyncnon va bene. Inoltre, capisco che sshusa she non bash.
In bash faccio:
cp -r srcdir/!(subdir) dstdir
e funziona benissimo. Tuttavia quando avvio lo script tramite sshricevo l'errore
sh: 1: Syntax error: "(" unexpected
perché sta usando sh.
Ho controllato la shpagina man, ma non esiste alcuna opzione per escludere i file.
È la mia ipotesi di sshutilizzo shcorretto? 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.