Невозможно инициализировать переменные при запуске от имени другого пользователя в оболочке - PullRequest
0 голосов
/ 11 декабря 2018

Я запускаю сценарий оболочки, который будет выполнять какую-то работу от имени разных пользователей (сценарий показан ниже).Я могу получить доступ к переменным, объявленным в скрипте, работая от имени другого пользователя.Переменные, назначенные в области действия пользователя, не инициализируются.

#!/bin/bash
presentdir="$(pwd)"
sudo -H -u user1 bash <<EOF
echo "$presentdir"
#its is printing the value on console
EOF

Это работает, но я должен инициализировать переменные в пользовательском bash.Когда я пробовал таким образом, он показывает пустой.

sudo -H -u user1 bash <<EOF
presentdir="$(pwd)"
echo "$presentdir"
#its just prints empty line
EOF

Я делаю правильно или я что-то упускаю?

EDIT1:

pre_dir=$(dirname "$0")
sudo -u user bash <<"EOF"
echo $pre_dir
#its not printing anything
EOF

Какя могу получить доступ к переменной, определенной выше и внутри?

EDIT2: я понял, что положил.Просто сохраните текущую среду, передав -E и экспортировав переменную.

export pre_dir=$(dirname "$0")
sudo -E -u user bash <<"EOF"
echo $pre_dir
#its prints file directory 
EOF

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Расширение происходит на исходной стороне пользователя, а не на стороне после sudo.

sudo -H -u user1 bash <<EOF
presentdir="$(pwd)"
echo "$presentdir"
EOF

Теперь после расширения это выглядит так:

sudo -H -u user1 bash <<EOF
presentdir="/home/orinal_user"
echo ""
EOF

т.е.оба расширения $presentdir и $(pwd) происходят на исходной стороне пользователя.

Таким образом, порядок:

  1. Сначала разверните все переменные в heredoc <<EOF ... EOF
  2. Затем выполните sudo bash
  3. Затем sudo bash снова расширит переменные (но ничего не останется).

Вы хотите:

  1. Запустить sudobash
  2. Затем разверните переменные

Вы должны решить, с какой стороны вы хотите, чтобы это расширение произошло.Лично я бы вообще не использовал для этого heredoc, а использовал бы опцию -c, которая позволяет мне более явно контролировать цитирование:

sudo -H -u user1 bash -c 'presentdir="$(pwd)"; echo "$presentdir"'

выведет вывод $(pwd) run после sudo -u user1.

Или заключите в кавычки переменные:

sudo -H -u user1 bash <<EOF
presentdir="\"\$(pwd)\""
echo "\"\$presentdir\""
EOF

Первое расширение расширяется "\"\$var\"" в "$var", затем второе расширение на стороне sudo bashрасширяет "$var" до его буквального значения.

Или вы можете поместить разделитель heredoc в кавычки (' или " не имеет значения)

sudo -H -u user1 bash <<"EOF"
presentdir="$(pwd)"
echo "$presentdir"
EOF

Это сделает этот heredocне расширен на исходной стороне пользователя (маленький и полезный трюк).

0 голосов
/ 11 декабря 2018

$variable и $(command) оба расширяются внутри здесь документов перед выполнением команды, использующей здесь документ.

Во втором случае строка, переданная bash, работающая как user1, буквально

presentdir="working directory before running sudo -H"
echo ""

Вы можете выбрать $ с помощью \$ в этом документе, чтобы исправить ваш сценарий.Вы можете заменить sudo -H -u user1 bash на cat, чтобы напечатать строку, которая будет передана.

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