Preciso executar um script remoto usando sshvia Ruby( net / ssh ) para copiar recursivamente uma pasta e excluir uma subpasta. Estou procurando a maneira mais rápida de fazê-lo, rsyncnão é bom. Além disso, eu entendo que sshusa she 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 shpágina de manual, mas não há opção para excluir arquivos.
É minha suposição de sshusar o shcorreto? 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.