我需要运行使用远程脚本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
)使用远程用户的登录外壳。可以是任何东西。