Перенаправлення виводу здійснюється оболонкою, з якої викликана команда . Отже, розбиваючи все на біти, ось що відбувається *:
викликає оболонку sudo echo "options drm_kms_helper poll=N"
, яка виконує sudo
команду з echo "options drm_kms_helper poll=N"
командного рядка
sudo запитує пароль, відкриває оболонку суперрусера і викликає echo "options drm_kms_helper poll=N"
, який запускає echo
команду, передаючи його"options drm_kms_helper poll=N"
echo, працює з root
привілеями, друкує рядок до його стандартного виводу.
echo
команда припиняється, оболонка суперрусера виходить, sudo
закінчується
оболонка, з якої викликана команда, збирає результат і намагається перенаправити його, до /etc/modprobe.d/local.conf
якого можна записати лише корінь. Він отримує помилку "відмовлено у дозволі".
Про способи виправити це див. У відповіді @shantanu.
(*) - хоча вищевказана послідовність допомагає зрозуміти, чому команда не вдається, насправді все відбувається дещо поза порядком: оригінальна оболонка помічає перенаправлення та намагається відкрити файл для запису перед тим, як викликати sudo ...
команду. Під час відкриття файлу не вдається, оболонка навіть не викликає команду, яка повинна була написати в файл (спасибі @PanosRontogiannis за вказівку на це).
Ось швидкий тест:
$ touch ./onlyroot.txt
$ sudo chown root:root ./onlyroot.txt
$ sudo bash -c "whoami | tee who.txt" > onlyroot.txt
bash: onlyroot.txt: Permission denied
У тесті вище whoami | tee who.txt
збирався створити файл з назвою, who.txt
що містить слово "root". Однак, коли перенаправлення виводу виходить з ладу в оболонці виклику, файл "who.txt" також відсутній, оскільки команду не викликали.
saji@laptop:~$ sudo echo "Hi" [sudo] password for saji: Hi