Мне нужно запустить удаленный скрипт , используя с sshпомощью Ruby( нетто / SSH ) рекурсивно скопировать папку и исключить папку. Я ищу самый быстрый способ сделать это, так что rsyncэто не хорошо. Также я понимаю, что sshиспользует shи нет bash.
В Bash я делаю:
cp -r srcdir/!(subdir) dstdir
и работает нормально. Однако, когда я запускаю скрипт через, sshя получаю сообщение об ошибке
sh: 1: Syntax error: "(" unexpected
потому что он использует sh.
Я проверил shсправочную страницу, но нет возможности исключить файлы.
Это мое предположение об sshиспользовании shправильно? Любое альтернативное предложение?
РЕДАКТИРОВАТЬ 1:
В случае, если это полезно, выдается sudo cat /etc/shellsследующее:
# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
/usr/bin/tmux
/usr/bin/screen
РЕДАКТИРОВАТЬ 2:
ОК. Так что Bash это доступно, и это, кажется, не проблема. Я убедился, что ssh на самом деле использует bash. Эта проблема, по-видимому, связана с удалением скобок или восклицательного знака. Я попытался запустить команду из оболочки (MacOS), и это фактическая команда:
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'
Таким образом, я получаю другую ошибку
cp: cannot stat '/home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/!(constant)': No such file or directory
РЕДАКТИРОВАТЬ 3:
На основе комментариев я изменил мою команду добавленияextglob
Если я использую
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'
Я получаю следующую ошибку:
cp: cannot stat '/home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/!(constant)': No such file or directory
Если я не уйду в скобки, я получу
bash: -c: line 0: syntax error near unexpected token `('
ssh(хорошоsshd) использует оболочку входа удаленного пользователя. Может быть что угодно.