$ sshpass -p "$SSH_PASS" ssh student@"$IP_NFS" "sudo rm -r /srv/nfs4/share/assets_prod/!(v$TAG)"
Warning: Permanently added 'x.x.x.x' (ED0599) to the list of known hosts.
bash: -c: line 0: syntax error near unexpected token `('
bash: -c: line 0: `sudo rm -r /srv/nfs4/share/assets_prod/!(v0.0.3-rc6)'
直接检查到 nfs 服务器的结果
student@nfs:~$ sudo echo rm -r /srv/nfs4/share/assets_prod/!(v0.0.3-rc6)
rm -r /srv/nfs4/share/assets_prod/kk.dd /srv/nfs4/share/assets_prod/kk.dkk /srv/nfs4/share/assets_prod/kk.dkkff /srv/nfs4/share/assets_prod/v0.0.3-rc2 /srv/nfs4/share/assets_prod/v0.0.3-rc3 /srv/nfs4/share/assets_prod/v0.0.3-rc4 /srv/nfs4/share/assets_prod/v0.0.3-rc5
是什么原因导致命令在运行时出现问题?
远程端真的在运行
bash -c 'sudo rm -r /srv/nfs4/share/assets_prod/!(v$TAG)'
并且为交互式外壳设置的extglob
选项未针对bash -c
调用的非交互式外壳设置。
sshpass -p "$SSH_PASS" ssh student@"$IP_NFS" "shopt -s extglob; sudo rm -r /srv/nfs4/share/assets_prod/!(v$TAG)"
应该工作。
更新:由于extglob
影响解析,因此必须在解析命令行之前启用它,但在执行x
之前完成解析x; y
。也许以下内容会起作用:
sshpass -p "$SSH_PASS" ssh student@"$IP_NFS"
"bash -O extglob -c 'sudo rm -r /srv/nfs4/share/assets_prod/!(v$TAG)'"
如果没有(或者即使有),您可以使用find
:
sshpass -p "$SSH_PASS" ssh student@"$IP_NFS"
find /srv/nfs4/share/assets_prod ! -name "v$TAG"
如果列出了要删除的文件,则可以将-delete
(如果您的find
支持)或-exec rm {} +
添加到find
命令以实际删除它们。
您已使用以下命令:
sudo rm -r /srv/nfs4/share/assets_prod/!(v$TAG)
但括号对外壳有特殊的含义。 你最好使用
$ sshpass -p "$SSH_PASS" ssh student@"$IP_NFS" "sudo rm -r '/srv/nfs4/share/assets_prod/!(v$TAG)'"
将文字字符串传递给rm
,没有外壳干扰。