Создайте учетную запись пользователя системы - с UID меньше чем 1 000. Учетные записи с UID меньше чем 1 000 скрыты в gdm и вероятно менеджерах по оформлению других.
Можно создать системную учетную запись путем выполнения useradd
с -r
флаг.
Судо Су -
, который является сложным способом написания 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
.
В моем случае мне нужно было передать массив и у меня возникли проблемы, но через некоторое время я добился успеха, передав значения массива в 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[@]};
...
Это не работает, потому что функция 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
и сами варианты.