Как запустить команду, которая включает в себя перенаправление или передачу с помощью sudo?


60

Я пытаюсь следовать тому, что, как я полагаю, является лучшей практикой использования sudo вместо учетной записи root.

Я выполняю простую операцию с файлом concat, такую ​​как:

sudo echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock

Это не так, как справа от ">>", он работает как обычный пользователь. Добавление дополнительных sudos также завершается неудачно (ожидаемое поведение с момента передачи в команду sudo, а не в файл).

Пример только это, но он был проверен и протестирован под учетной записью root.

Ответы:


75

Вы можете вызвать новую оболочку от имени root:

sudo sh -c 'echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

Вы также можете просто поднять процесс для записи в файл:

sudo tee -a /etc/conf.d/hwclock > /dev/null << EOF
clock_hctosys="YES"
EOF

8
В общем, второй вариант более безопасен, потому что только teeкоманды запускаются от имени root, а не основная команда, которая может быть сложной и склонной к неправильному поведению. (не случай echo)
pabouk

19

Другой вариант, одинаково безопасны, чтобы использовать sudo«s -iвыключатель войти в систему с правами администратора:

$ sudo -i
# echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

Это по-прежнему соответствует правилам передового опыта, поскольку учетная запись root на самом деле не включена как таковая, но позволяет безопасно выполнять действия с правами root. От man sudo:

The -i (simulate initial login) option runs the shell
    specified by the password database entry of the target user
    as a login shell.  This means that login-specific resource
    files such as .profile or .login will be read by the shell.
    If a command is specified, it is passed to the shell for
    execution via the shell's -c option.  If no command is
    specified, an interactive shell is executed. 

Другая альтернативаsudo bash
starbeamrainbowlabs

11

Если вы выражаете свою команду без одинарных кавычек, вы можете поместить ее в одинарные кавычки и выполнить ее через промежуточную оболочку.

Чтобы выполнить это как root:

echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock

Напишите команду другим способом, который не использует ':

echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock

Затем вызовите sudo sh -c …:

sudo sh -c 'echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

Кроме того, чтобы записать вывод в файл, в который может записать только root, вызовите sudo tee. Передайте -aопцию, чтобы teeдобавить к файлу назначения, в противном случае файл будет усечен.

echo 'clock_hctosys="YES"' | sudo tee -a /etc/conf.d/hwclock >/dev/null

Для более сложных модификаций файлов, вы можете позвонить sudo sed, sudo ed, sudo perl, ...

В качестве альтернативы, используйте приличный редактор и заставьте его называть sudo В Emacs, откройте /sudo:/etc/conf.d/hwclock. В Vim вызовите :w !sudo tee %запись в открытый файл от имени пользователя root или используйте плагин sudo.vim . Или иди с конца sudo и позвони sudoedit /etc/conf.d/hwclock.

Или вы можете уступить темной стороне и запустить оболочку от имени root.

$ sudo -i
# echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock

5

Команда не выполнена из-за разрешений для файла, перенаправленного на. Перенаправление происходит еще до sudoвызова команды.

Вы должны будете убедиться, что это корень, который фактически открывает файл для записи.

Самый простой способ сделать это:

echo 'clock_hctosys="YES"' | sudo tee -a /etc/conf.d/hwclock >/dev/null

echoМожет работать , как вы обычный пользователь , как он просто создает текстовую строку. teeУтилита будет бежать как корень , хотя и tee -aбудет добавлять данные. Мы перенаправляем вывод в /dev/nullпотому что tee, по умолчанию, дублируют его входные данные в его стандартный вывод в дополнение к записи в указанные файлы.

С bashили любой оболочкой, которая понимает "здесь-строки":

sudo tee -a /etc/conf.d/hwclock >/dev/null <<<'clock_hctosys="YES"'

Это идентично в действительности выше. Только способ, которым мы производим строку, изменяется.


Другой, немного окольный способ сделать это:

sudo sh -c 'echo clock_hctosys=\"YES\" >>/etc/conf.d/hwclock'

Здесь перенаправление происходит внутри sh -cдочерней оболочки, работающей от имени пользователя root.


4

sudo dd of=

Чтобы добавить, как вы хотите:

echo inbytes | sudo dd of=outfile oflag=append conv=notrunc

или воссоздать файл с нуля:

echo inbytes | sudo dd of=outfile

Преимущества:

  • приятнее, чем teeбез /dev/nullперенаправления
  • приятнее, чем shс тех пор нет подоболочки
  • ddимеет много мощных опций, например, status=progressчтобы увидеть прогресс передачи

Работает потому, что sudo пересылает stdin в команду.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.