Функция переадресации и переменные в sudo su - <пользователь> <<EOF

Создайте учетную запись пользователя системы - с UID меньше чем 1 000. Учетные записи с UID меньше чем 1 000 скрыты в gdm и вероятно менеджерах по оформлению других.

Можно создать системную учетную запись путем выполнения useradd с -r флаг.

9
28.08.2018, 02:01
3 ответа

Судо Су - , который является сложным способом написания Sudo -i , создает первозданную среду. Это точка входной оболочки. Даже простые Sudo удаляет большинство переменных из окружающей среды. Кроме того Sudo - внешняя команда; Нет никаких способов повышать привилегии в сам сценарий оболочки, только для запуска внешней программы ( Sudo ) с дополнительными привилегиями, и это означает, что любые переменные оболочки (то есть не экспортируемые переменные) и функции, определенные в родительском Shell не будет доступен в дочерней оболочке.

Вы можете пропустить переменные среды, не вызывая входной оболочки ( Sudo Bash вместо Sudo SU - или Sudo -i ) и настроить Sudo для Пусть эти переменные через (с по умолчанию! ENV_RESET или по умолчанию env_Keep = ... в файле sudoers ). Это не поможет вам на функции (хотя Bash имеет функциональный экспортный объект, Sudo блокирует его).

Нормальный способ получить ваши функции в Reting Shell будет, чтобы его там определить. Позаботьтесь о цитировании: если вы используете << EOF для документа здесь здесь, содержимое документа здесь, сначала расширяется родительской оболочкой, и результатом того, что расширение становится сценарием, который видит корпус ребенка Отказ То есть, если вы пишете

sudo -u "$target_user" -i <<EOF
echo "$(whoami)"
EOF

, это отображает имя исходного пользователя, а не целевого пользователя. Чтобы избежать этой первой фазы расширения, процитируйте здесь маркер документа после << << << << << <<

sudo -u "$target_user" -i <<'EOF'
echo "$(whoami)"
EOF

, поэтому, если вам не нужно передавать данные из родительской оболочки до корпуса ребенка, вы можете использовать a a quoted здесь документ:

#!/bin/bash
sudo -u "$target_user" -i  <<'EOF'
log_f() {
echo "LOG line: $@"
}
intVAR=$(date)
log_f "${intVAR}"
EOF

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

sudo -u "$target_user" -i <<EOF
echo "$(whoami)"
EOF

Выход WHOAMI становится немного кодом оболочки, а не строкой. Например, если команда WHOAMI вернулась »; RM -RF /;« True , затем Rething Shell выполнит команду ECHO »; RM -RF /; «Истинно» .

Если вам нужно передавать данные из родительской оболочки, простой способ передавать его аргументами. Вызвать явную оболочку ребенка и пропустите его позиционные параметры:

#!/bin/bash
extVAR="yourName"
sudo -u "$target_user" -i sh  _ "$extVAR" <<'EOF'
  log_f() {
  echo "LOG line: $@"
  }
  intVAR=$(date)
  log_f "${intVAR}" "${1}"
EOF

Если у вас есть несколько переменных для пропускания, он будет более читабелен для их по имени. Вызов ENV Явно установить переменные среды для раковины для детей.

#!/bin/bash
extVAR="yourName"
sudo -u "$target_user" -i env extVAR="$extVAR" sh <<'EOF'
  log_f() {
  echo "LOG line: $@"
  }
  intVAR=$(date)
  log_f "${intVAR}" "${1}"
EOF

Обратите внимание, что если вы ожидаете / etc / profile и целевой пользователя ~ / .profile , чтобы быть прочитанным, вам придется явно прочитать их или звонить Bash --логин вместо Sh .

4
27.01.2020, 20:07

В моем случае мне нужно было передать массив и у меня возникли проблемы, но через некоторое время я добился успеха, передав значения массива в env-key и обернув предполагаемый код в bash -c '<предполагаемый код>', и по сути заставив его воссоздать массив, например:INNER_KEY=($).

Для примера:

#!/usr/bin/env bash
PLUGINS=(foo bar baz)
sudo -u <some-user> -i env PLUGINS="`echo ${PLUGINS[@]}`" sh <<'EOF'
  bash -c '
    FOO=($PLUGINS);
    echo values: \[${FOO[@]}\];

    for pl in ${FOO[@]};
      do echo value: $pl;
    done;
  '
EOF

Проблема была в том, что я не мог напрямую сделать что-то вроде следующего (не используя bash -c '...'):

FOO=($PLUGINS);
for pl in ${FOO[@]};
...
1
27.01.2020, 20:07

Это не работает, потому что функция LOG_F не объявляется в Sudo SU - запуска вы запускается. Вместо этого:

extVAR="yourName"

sudo su - <user> << EOF

log_f() {
echo "LOG line: $@"
}

  intVAR=$(date)
  log_f ${intVAR} ${extVAR}
EOF

Вам нужно получить функцию, определенную в корневой подставке. Это может сделать это, но .... Я не знаю, что делает большинство этого веща. По крайней мере, - так долго, как ни один sudo , ни SU нуждается в STDIN для чтения пароля - это должно быть включено log_f () .

Я доверяю, что вы хотите расширить эти значения в вход корневой оболочки, кстати. Если вы не хотите сделать это, то вам следует цитировать EOF и сами варианты.

1
27.01.2020, 20:07

Теги

Похожие вопросы