带有等号(=)的 sudo 命令与环境变量混淆

带有等号(=)的 sudo 命令与环境变量混淆

我正在尝试运行各种命令须藤,其中等号 (=)是命令的一部分。在某些情况下,似乎须藤混淆了设置和环境变量的符号。

我在 sudo(8) man 中看到这个:

Environment variables to be set for the command may also be passed on the command line in the form of VAR=value...

这对我来说是一个问题,例如,如果我尝试运行如下命令:

sudo -i "cd /tmp; /usr/bin/hadoop fs -D dfs.replication=2 -ls"

它实际上进入了 root shell,而不是执行命令,因为命令被误解了。我看到这个日志

Apr 29 16:11:40 : my_user : TTY=pts/7 ; PWD=/home/my_user ; USER=root ; ENV=cd /tmp; /usr/bin/hadoop fs -D dfs.replication=2 -ls ; COMMAND=/bin/bash

如您所见,该命令实际上被误解为尝试设置 ENV。

如果我删除前面的命令,cd /tmp;它就可以正常工作。但是,对于我的某些内容,我必须运行光盘命令或者类似的东西。

这似乎是因为等号导致须藤认为我正在设置 ENV。如果我删除等号(即 remove -D dfs.replication=2),那么它就可以正常工作,并且正确记录:

Apr 29 16:08:46 : my_user : TTY=pts/7 ; PWD=/home/my_user ; USER=root ; COMMAND=/bin/tcsh -c cd /tmp; /usr/bin/hadoop fs -ls

所以我的问题是:我该如何摆脱这种情况=字符,和/或让 sudo 将命令作为整个命令读取,而不是认为等号正在设置环境变量?

非常感谢!

答案1

尝试执行通过 shell 命令sudo而不是直接传递命令。例如,执行以下操作:

sudo bash -c "cd /root; ls -al"

当然,这是一个愚蠢的例子,因为人们可以简单地执行sudo ls -al /root,但希望它能够表达出要点。

执行sudoshell 命令比使用标志传递命令更明确,因为那将执行在给定系统上-i分配给用户的 shell 。此外,还可以避免用户登录资源文件的任何潜在问题。rootroot

Bash(或您首选的 shell)应该可以正确解析该=字符。我继续测试了此操作以确保完整性,没有遇到任何问题。但是,如果没有,只需=在其前面加上一个\字符即可退出。

相关内容