sudo执行以连字符开头的命令时触发非法选项错误的原因咨询
sudo执行以连字符开头的命令时触发非法选项错误的原因咨询
嘿,我碰到过一模一样的问题!咱们来掰扯清楚到底是怎么回事:
首先,你用sudo --login --user=maria -- "$COMMAND"执行普通命令没问题,但碰到以-开头的命令(比如-do-things-)就报-sh: 0: Illegal option -d,核心原因出在**--login选项的执行逻辑**上,和你用不用--分隔sudo选项没关系!
你已经知道sudo的--是用来区分自身选项和要执行的命令,这步没错,但当你加了--login(也就是-i)后,sudo的执行流程变了:
sudo会调用目标用户的登录shell,并把你指定的命令传递给这个shell处理,而不是直接执行命令本身。
登录shell在启动时,会把接收到的命令参数当成shell的启动选项来解析——比如-do-things-会被shell拆解成-d、-o、-t等一串选项,但你的shell(比如sh)根本没有-d这个启动选项,自然就报错了。
那怎么解决?给你几个实用的方案:
- 方案1:明确告诉shell要执行的是命令,不是选项
用shell的-c参数来指定要执行的命令,让shell跳过启动选项解析,直接执行命令:
如果命令在当前目录,也可以写成sudo --login --user=maria -- sh -c "-do-things-"sh -c "./-do-things-",效果一样。 - 方案2:如果不需要登录环境,直接去掉
--login
要是你的场景不需要加载目标用户的登录shell配置(比如.profile、.bashrc这些),直接用普通sudo执行就行,这时候sudo会直接运行命令,不会经过登录shell,自然就不会有选项解析的问题:sudo --user=maria -- "-do-things-" - 方案3:用路径形式指定命令
把命令写成相对路径(比如./-do-things-)或绝对路径(比如/bin/-do-things-),这样shell会识别出这是一个可执行文件路径,而不是启动选项:sudo --login --user=maria -- "./-do-things-"
再补个小验证:你可以试试在普通shell里直接运行sh "-do-things-",同样会报 Illegal option -d,这就能确认是shell的问题,不是sudo的锅~
备注:内容来源于stack exchange,提问作者V. Bozz
相关产品推荐
相关产品推荐

