2013-11-02 3 views
3

Я пишу сценарий оболочки bash, который должен запускаться с правами администратора (sudo).Почему я не могу перенаправить текст в текстовый файл?

Я бегу следующие команды

sudo -u $SUDO_USER touch /home/$SUDO_USER/.kde/share/config/kcmfonts > /dev/null 
sudo -u $SUDO_USER echo "[General]\ndontChangeAASettings=true\nforceFontDPI=96" >> /home/$SUDO_USER/.kde/share/config/kcmfonts 

Первая команда успешно и создает файл. Однако вторая команда продолжает erroring со следующим:

не может создать /home/username/.kde/share/config/kcmfonts: Отказано в

Я не могу понять, почему это держит erroring на разрешениях. Я запускаю команду как пользователь, который вызвал sudo, поэтому у меня должен быть доступ к записи в этот файл. Файл kcmfonts создается успешно.

Может кто-нибудь помочь мне?

+1

Даже суперпользователю требуется явное разрешение на запись. Если в режиме файла 444, root не поможет ... – Floris

+0

См. Http://stackoverflow.com/questions/82256/how-do-i-use-sudo-to-redirect-output-to-a-location -i-dont-have-permission-to-wr – shf301

+0

umask может быть установлен в 0666, что приводит к появлению новых файлов 0444. Кроме того, почему вы перенаправляете вывод в/dev/null в первой строке? –

ответ

3
sudo -u $SUDO_USER echo "some text" >> /home/$SUDO_USER/filename 

sudo выполняет команду echo "some text" как `$ SUDO_USER».

Но Перенаправление делается под вашего счета, а не под $SUDO_USER счета. Перенаправление обрабатывается процессом оболочки, что ваш и не находится под контролем sudo

Попробуйте это:.

sudo -u $SUDO_USER sh -c 'echo "some text" >> /home/$SUDO_USER/filename' 

Таким образом, процесс sh будет выполнен $SUDO_USER, и это процесс, который будет обрабатывать перенаправление (и будет записываться в выходной файл).

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

$ cat foo.sh 
#!/bin/sh 
echo "some text" >> /home/$SUDO_USER/filename 
$ sudo -u $SUDO_USER ./foo.sh 

Теперь это ./foo.sh команда (которая выполняется как /bin/sh ./foo.sh), который будет работать под $SUDO_USER счета, и он должен иметь разрешение на пишите в выходной файл.

3

Рассмотрим это сделать:

echo "some text" | sudo -u $SUDO_USER tee -a /home/$SUDO_USER/filename 

Команда тройник может помочь вам направить вывод в файл. tee's -a вариант для добавления (например, >>) без него вы скроете файл (например, >).

Вам не нужно выполнять левую сторону с приподнятыми привилегиями (хотя это просто эхо, это хорошая вещь, чтобы сформироваться как привычка), вам нужны только приподнятые привилегии для записи в файл. Таким образом, с помощью этой команды вы только повышаете разрешения для tee.

Смежные вопросы