Necesito ejecutar un script remoto usando ssh
via Ruby
( net / ssh ) para copiar recursivamente una carpeta y excluir una subcarpeta. Estoy buscando la forma más rápida de hacerlo, así rsync
que no es bueno. Además, entiendo que los ssh
usos sh
y no bash
.
En bash hago:
cp -r srcdir/!(subdir) dstdir
y funciona bien Sin embargo, cuando inicio el script vía ssh
, recibo el error
sh: 1: Syntax error: "(" unexpected
Debido a que está utilizando sh
.
He revisado la sh
página del manual, pero no hay ninguna opción para excluir archivos.
¿Es mi suposición de ssh
usar sh
correcto? ¿Alguna sugerencia alternativa?
EDITAR 1:
en caso de que sea útil, la salida de sudo cat /etc/shells
es la siguiente:
# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
/usr/bin/tmux
/usr/bin/screen
EDITAR 2:
OK. Entonces bash está disponible y ese no parece ser el problema. He verificado que el ssh está usando realmente bash
. El problema parece estar relacionado con el escape de paréntesis o signo de exclamación. He intentado ejecutar el comando desde el shell (macos) y este es el comando real:
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 esta manera recibo un error diferente
cp: cannot stat '/home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/!(constant)': No such file or directory
EDITAR 3:
Basado en los comentarios, he cambiado mi comando agregandoextglob
Si yo 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'
Recibo el siguiente error:
cp: cannot stat '/home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/!(constant)': No such file or directory
Si no escapo del paréntesis me sale
bash: -c: line 0: syntax error near unexpected token `('
ssh
(buenosshd
) usa el shell de inicio de sesión del usuario remoto. Podría ser cualquier cosa.