Запустите несколько команд от одного пользователя и получите доступ к переменным, установленным другим пользователем. - PullRequest
0 голосов
/ 09 января 2019

То, к чему я стремлюсь:

Я хочу запустить:

  1. несколько строк одновременно
  2. под другим пользователем
  3. с доступом к переменным, установленным пользователем, с которого я запускаю

Итак, из этого:

ROOT_VAR='var-set-from-root'

cmd="
 echo $ROOT_VAR
 echo `whoami`
 echo $HOME
"

желаемый результат будет:

var-set-from-root
UserA
/home/UserA

Что я пробовал до сих пор:

1 прогон с bash; команды, содержащиеся в двойных кавычках:

cmd="
 echo $ROOT_VAR
 echo `whoami`
 echo $HOME
"

sudo -u UserA bash -c "{$cmd}"

# result (has access to root var but still running as root):
var-set-from-root
root
/root

2 запустить с bash с командами в heredoc

sudo -u UserA bash -c<<EOF
 echo $ROOT_VAR
 echo `whoami`
 echo $HOME
EOF

# result (error):
bash: -c: option requires an argument

3 запускается с su и командами в heredoc с одинарной кавычкой

su UserA <<'EOF'
 echo $ROOT_VAR
 echo `whoami`
 echo $HOME
EOF

# result (no access to root var but running as correct user):

UserA
/home/UserA

4 запустить с su и командами в heredoc без кавычек

su UserA <<EOF
 echo $ROOT_VAR
 echo `whoami`
 echo $HOME
EOF

# result (has access to root var but still running as root):
var-set-from-root
root
/root

5 бег с баш; команды в двойных кавычках; корень var передается как параметр:

cmd="
 echo $1
 echo `whoami`
 echo $HOME
"

sudo -u UserA bash -c "{$cmd}" $ROOT_VAR

# result (no access to root variable parameter):

root
/root

Ни один из них не может получить доступ к переменной, установленной от пользователя root, в то же время работая под пользователем без полномочий root. Это возможно даже при использовании параметров?

Ответы [ 2 ]

0 голосов
/ 09 января 2019
# as root
var=1
export var
sudo -E -u kamil sh -c 'echo "$(whoami) var = $var"'
echo "$(whoami) var = $var"

выведет:

kamil var = 1
root var = 1
  1. sudo позволяет вам работать от имени другого пользователя
  2. sueo -E позволяет сохранить окружающую среду, см. Man sudo
  3. После sudoing вам нужно выполнить программу - обычно sh или bash для скрипта, иногда с <<'EOF' для нерасширенных многострочных команд

Следующее крыло:

export var=1
sudo -E -u kamil sh <<'EOF'
echo "I am $(whoami) and..."
echo "var = $var"
echo "Let's change it!"
var=2
echo "var = $var"
EOF
echo "$(whoami) var = $var"

выведет:

I am kamil and...
var = 1
Let's change it!
var = 2
root var = 1

Вы всегда можете быть еще более ясным с env:

sudo -u kamil env var="$var" sh -c 'echo "$var"'

, где вы точно выбираете то, что вы проходите вокруг.

0 голосов
/ 09 января 2019

Небольшая модификация вашего первого примера должна работать:

cmd="
 echo $ROOT_VAR
 echo \`whoami\`
 echo \$HOME
"

sudo -H -u UserA bash -c "{$cmd}"

-H необходимо для установки переменной $HOME пользователя на основе этого .

Что касается обратной косой черты, то здесь различие между \$HOME и $ROOT_VAR довольно сложно. Когда команда анализируется, $ROOT_VAR фактически расширяется до ее реального значения. Другими словами, значение cmd является следующим:

cmd="
  echo var-set-from-root
  echo `whoami`
  echo $HOME
"

Вам необходимо использовать обратную косую черту, чтобы избежать синтаксического анализа whoami и $HOME в среде root, и вместо этого передать выполнение команды самому bash пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...