我正在尝试运行各种命令须藤,其中等号 (=)是命令的一部分。在某些情况下,似乎须藤混淆了设置和环境变量的符号。
我在 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
,但希望它能够表达出要点。
执行sudo
shell 命令比使用标志传递命令更明确,因为那将执行在给定系统上-i
分配给用户的 shell 。此外,还可以避免用户登录资源文件的任何潜在问题。root
root
Bash(或您首选的 shell)应该可以正确解析该=
字符。我继续测试了此操作以确保完整性,没有遇到任何问题。但是,如果没有,只需=
在其前面加上一个\
字符即可退出。