Preciso executar um script remoto usando ssh
via Ruby
( net / ssh ) para copiar recursivamente uma pasta e excluir uma subpasta. Estou procurando a maneira mais rápida de fazê-lo, rsync
não é bom. Além disso, eu entendo que ssh
usa sh
e não bash
.
No bash eu faço:
cp -r srcdir/!(subdir) dstdir
e funciona bem. No entanto, quando inicio o script via ssh
, recebo o erro
sh: 1: Syntax error: "(" unexpected
porque está usando sh
.
Eu verifiquei a sh
página de manual, mas não há opção para excluir arquivos.
É minha suposição de ssh
usar o sh
correto? Alguma sugestão alternativa?
EDIT 1:
Caso seja útil, a saída de sudo cat /etc/shells
é a seguinte:
# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
/usr/bin/tmux
/usr/bin/screen
EDIT 2:
OK. Portanto, o bash está disponível e esse não parece ser o problema. Eu verifiquei que o ssh está realmente usando bash
. O problema parece estar relacionado ao escape de parênteses ou ponto de exclamação. Eu tentei executar o comando a partir do shell (macos) e este é o 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'
Dessa forma, recebo um erro diferente
cp: cannot stat '/home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/!(constant)': No such file or directory
EDIT 3:
Com base nos comentários, mudei meu comando adicionandoextglob
Se eu usar
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'
Eu recebo o seguinte erro:
cp: cannot stat '/home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/!(constant)': No such file or directory
Se eu não escapar dos parênteses, recebo
bash: -c: line 0: syntax error near unexpected token `('
ssh
(wellsshd
) usa o shell de login do usuário remoto. Poderia ser qualquer coisa.