1

Я пытаюсь запустить различные команды через 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"

Это фактически входит в корневую оболочку вместо выполнения команды, так как команда неверно истолкована. Я вижу это в sudo.log:

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; это будет работать. Тем не менее, для некоторых моих вещей, я должен сначала запустить команду cd или что-то подобное.

Это, кажется, из-за знака равенства, который заставляет sudo думать, что я устанавливаю ENV. Если я удаляю знак равенства (т.е. удаляем -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 ответ1

0

Попробуйте выполнить команду оболочки через sudo а не передавать ее напрямую. Например, сделайте что-то вроде:

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

Конечно, это глупый пример, поскольку можно просто выполнить sudo ls -al /root , но, надеюсь, это поможет.

Выполнение команды оболочки гораздо более явное, чем передача команды sudo с использованием флага -i так как она выполнит оболочку, назначенную пользователю root в данной системе. Кроме того, исключаются любые потенциальные проблемы с файлами ресурсов входа в систему пользователя root .

Bash (или ваша предпочтительная оболочка) должен правильно разобрать символ = . Я пошел дальше и проверил это на своем конце для полноты и не столкнулся с какими-либо проблемами. Если нет, однако, просто экранируйте символ = , добавив к нему символ \ .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .