Bash远程ssh命令执行失败:通配符*提前展开无法删除远程目录内容
解决方案
问题根源是未加引号保护的通配符*会优先被本地Bash解析展开,不会作为原始参数传递到远程主机执行,可根据场景选择以下方案:
- 方案1:单引号包裹整条远程命令(通用场景,无本地变量代入需求)
单引号内的所有字符在本地Bash中都会作为字面量传递,不会提前解析通配符、变量:
# 无需交互输入sudo密码的写法 inboxResult=$(ssh username@host 'sudo -u rootUser rm -Rf /my/path/here/inbox/*') # 需要交互输入sudo密码,保留原伪终端分配参数的写法 inboxResult=$(ssh -t -t username@host 'sudo -u rootUser rm -Rf /my/path/here/inbox/*')
- 方案2:转义通配符(适用需要本地拼接路径变量的场景)
如果路径中有本地定义的变量需要代入,单引号会阻断本地变量解析,这时候可以单独转义*避免本地展开:
# 示例:本地变量定义远程路径前缀 REMOTE_BASE="/my/path/here" inboxResult=$(ssh username@host sudo -u rootUser rm -Rf "${REMOTE_BASE}/inbox/\*")
- 方案3:find命令替代通配符(最稳妥,无空目录报错问题)
如果远程inbox目录为空,未匹配到文件的通配符*会作为字面量传递给rm,触发「No such file or directory」报错。用find命令可以完全规避通配符展开问题,同时自动跳过inbox目录本身:
# 主流Linux/Unix系统通用写法 inboxResult=$(ssh username@host 'sudo -u rootUser find /my/path/here/inbox/ -mindepth 1 -delete') # 老旧系统不支持-delete参数的替代写法 inboxResult=$(ssh username@host 'sudo -u rootUser find /my/path/here/inbox/ -mindepth 1 -exec rm -rf {} +')
参数说明:-mindepth 1表示只处理inbox目录下的内容,不修改目录本身。
内容的提问来源于stack exchange,提问作者madtyn
相关产品推荐
相关产品推荐

