Этот ответ объясняет, какой пользователь выполняет подстановку команд $(whoami)
, показанную в вопросе. На самом деле, мы надеемся, что конструкция echo $(whoami)
никогда не будет использоваться, поскольку whoami
сам по себе будет правильным способом вывода имени пользователя текущего пользователя.
Вызов echo
при подстановке команды просто не нужен и может даже при некоторых обстоятельствах изменить вывод команды в подстановке команды. Не используйте echo $(...)
.
Запуск whoami
выведет имя непривилегированного пользователя в вопросе, а sudo whoami
выведет root
.
Чтобы оболочка запускала команду
sudo echo $(whoami)
он должен сначала выяснить, с какими аргументами вызывать sudo
. echo
— это просто строка, поэтому оболочка ничего с ней не делает, а $(whoami)
— это подстановка команд, которую необходимо расширить. Он делает это, выполняя whoami
и заменяя подстановку команды своим выводом. Затем он готов вызвать sudo
.
Это означает, что sudo
будет выполняться с echo
и выводом whoami
(, который был выполнен от вашего непривилегированного пользователя )в качестве аргументов.
Если вы хотите запустить whoami
внутри замены команды на sudo
,вы можете поместить его в скрипт и запустить скрипт с sudo
, как вы сделали, или вы можете использовать скрипт в строке -, как в
sudo sh -c 'echo "$(whoami)"'
Здесь сценарий sh -c
запускается от имени пользователя root, поэтому whoami
также будет выполняться от имени пользователя root.
Дело в том, что оболочка, которая запускает whoami
, выполняется от имени пользователя root.
Оболочка, которая выполняет whoami
в первой команде, sudo echo $(whoami)
, запускается как обычный пользователь, а не root.
ExecStart
не является нормальной строкой оболочки. Изsystemd.service(5)
:
ExecStart=
Commands with their arguments that are executed when this service is started. The value is split into zero or more command lines according to the rules described below (see section "Command Lines" below).
Вы работаете с системным блоком, а не с пользовательским, так что вы уже root
и вам не нужно усложнять Exec
сsudo
:
ExecStart=/bin/bash -c "echo 0 > /sys/module/hid_apple/parameters/fnmode"