Вопрос или проблема
Распечатка оболочки не в порядке и отсутствует некоторая информация.
Я совершенно новичок в Linux и нахожусь на этапе “копировать/вставить и посмотреть, что произойдет”.
Я уже пробовал искать в Google, но безрезультатно.
Я запускаю скрипт, который использует несколько способов получения текущего пользователя.
Скрипт использует
- прямые вызовы
- вызовы с использованием
sudo
- вызовы с использованием
sudo su -
Каждый метод должен возвращать 6 значений, вместо этого первые два метода возвращают 5 значений, а третий метод возвращает все 6 значений плюс одно лишнее, которое, я предположительно, берется из второго метода, просто с задержкой.
Вопросный скрипт:
#!/usr/bin/env bash
echo ""
echo "GET USER - DIRECT"
echo ""
whoami
echo $USER
id -u -n
logname
ps -o user= -p $$ | awk '{print $1}'
echo $SUDO_UID
echo $SUDO_USER
echo ""
read -p "Press enter to continue"
echo -e "\n"
echo "GET USER - SUDO"
echo ""
sudo whoami
sudo echo $USER
sudo id -u -n
sudo logname
sudo ps -o user= -p $$ | awk '{print $1}'
sudo echo $SUDO_UID
sudo echo $SUDO_USER
echo ""
read -p "Press enter to continue"
echo -e "\n"
echo "GET USER - SUDO SU -"
echo ""
sudo su -c 'whoami; echo $USER; id -u -n; logname; ps -o user= -p $$ | awk "{print $1}"; echo $SUDO_UID; echo $SUDO_USER; echo ""'
echo -e "\n"
Вывод, который я получаю:
player1@Arcade:~/Desktop$ ./testuser.sh
GET USER - DIRECT
player1
player1
player1
player1
player1
Press enter to continue
GET USER - SUDO
[sudo] password for player1:
root
player1
root
player1
player1
Press enter to continue
GET USER - SUDO SU -
root
root
root
player1
root
1000
player1
Что я здесь упускаю? Мое предположение заключается в том, что прямой вызов $SUDO_UID
и $SUDO_USER
связан с разрешениями. Порядок, в котором происходит вывод, все еще ставит меня в тупик.
Ответ или решение
Ваша проблема с несоответствием вывода функций в bash-скрипте может быть обусловлена несколькими факторами, связанными с переменными окружения и особенностями работы команд в Linux. Ознакомьтесь с анализом каждой части вашего скрипта и причинами, по которым вывод может работать неоднозначно.
Проблемы с доступом к переменным окружения
-
Переменные окружения в разных контекстах:
- Переменные
$SUDO_UID
и$SUDO_USER
существуют только в контексте привилегированного пользователя и отображаются только в случае, если они явно установлены. В вашем случае, выполнение безsudo
приводит к отсутствию этих переменных. - Использование
sudo
может не сохранить контекст переменных окружения, и они сохраняются только в том сеансе, который выполняется с привилегиями.
- Переменные
-
Разные результаты команд:
- Результаты команд
whoami
,$USER
,id -u -n
,logname
и других могут отличаться в зависимости от текущего пользователя, привилегий пользователя и контекста, в котором они выполняются (например, использованиеsudo
илиsudo su -
).
- Результаты команд
Понять задержку вывода и взаимное влияние команд:
-
Задержка команд в Direct и Sudo:
- В вашем скрипте команда
echo $USER
выполняется после смены контекста пользователя черезsudo
. В этом случае вывод команды будет связан с пользователем, кто инициировал команду, а не актуальным пользователем, если только не используются кавычки или эскейпинг для сохранения контекста.
- В вашем скрипте команда
-
Использование
sudo su -
и различие в контексте:- Эта команда создает новый сеанс shell с собственным окружением, и поэтому вывод может быть другим. Порядок выполнения команд может измениться, если команды не строго последовательны или если влияние среды (например,
TERM
) изменяет интерпретацию.
- Эта команда создает новый сеанс shell с собственным окружением, и поэтому вывод может быть другим. Порядок выполнения команд может измениться, если команды не строго последовательны или если влияние среды (например,
Рекомендации:
-
Следование строгому контексту:
- Убедитесь, что вы понимаете, какой пользовательский контекст ожидается для каждой команды, и в этом контексте интерпретируйте вывод команды.
-
Использование эскейпингов и кавычек:
- Для переменных окружения и сложных команд используйте кавычки и другие элементы bash для управления интерпретацией, где это возможно.
-
Логирование и отладка:
- Включите отладочные выводы в ваш скрипт с помощью
set -x
иset +x
в целях анализа, чтобы видеть конкретные изменения при выполнении команд и их влияние на окружение.
- Включите отладочные выводы в ваш скрипт с помощью
Ваш сценарий будет проще отлаживать и управлять, если вы будете внимательно следить за изменением контекста выполнения команд и их переменными среды. Это особенно важно для мультиязычных систем, где различие в форматах и конфигурациях может вводить дополнительные сложности.