Як запустити команду, яка передбачає перенаправлення або з'єднання з sudo?


60

Я намагаюся слідувати тому, що я вважаю найкращим методом використання sudo замість кореневого акаунта.

Я виконую просту операцію з файлом concat, наприклад:

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

Це не вдається праворуч від ">>", який він працює як звичайний користувач. Додавання додаткових sudos також не вдається (очікувана поведінка з моменту передачі файлів до команди sudo, а не у файл).

Приклад - це лише те, але він був перевірений і протестований у кореневому обліковому записі.

Відповіді:


75

Ви можете викликати нову оболонку як корінь:

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якості кореня виконуються лише команди, а не головна команда, яка може бути складною і схильною до неправильної поведінки. (не справа echo)
pabouk

19

Інший варіант, однаково безпечні, щоб використовувати sudo«s -iперейти увійти в систему з правами адміністратора:

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

Це все ще дотримується правил найкращої практики, оскільки кореневий обліковий запис насправді не ввімкнено як такий, але дозволяє робити такі речі як 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, ...

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

Або ви можете поступитися темною стороною і запустити оболонку як корінь.

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

5

Команда виходить з ладу через дозволи на файл, на який переспрямовано. Перенаправлення відбувається ще до sudoвиклику команди.

Вам доведеться переконатися, що саме root відкриває файл для запису.

Найпростіший спосіб зробити це:

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.