Выполнить строку команд с помощью одного sudo

Например, если я хочу создать файл и ввести текст в одну строку, я могу перенаправить вывод в файл с помощью оператора > :

 echo "something" > /path/foobar 

но если у меня нет доступа к папке /path/ и нужны права sudo, как я могу достичь той же команды, что и обычный пользователь с правами sudo?

Я пытался

 sudo echo "something" > /path/foobar 

но это не работает, потому что sudo учитывает только edit но не для правой части
of >

Конечно, я мог бы стать root раньше с sudo su или использовать tee вместо этого:

 echo "something" | sudo tee /path/foobar 

Но я хотел бы найти решение, где я могу работать с последней строкой в ​​качестве замены через

 sudo !! 

Разве нет способа «переработать» последнюю строку и просто добавить sudo впереди?

  • Запуск сценария Python Portio как обычного пользователя без доступа root
  • Судо доступ к учетной записи другого пользователя
  • Как узнать, кто добавил пользователя?
  • Как мне спросить пароль по приглашению GUI при использовании sudo в скрипте?
  • Может редактировать файл с правами root, но не использовать sudo
  • sudo занимает слишком много времени, чтобы начать
  • Почему суперпользователь отключен в iOS и Android
  • Сделать суперпользователь действовать как какой-либо другой пользователь в определенном дереве каталогов
  • 3 Solutions collect form web for “Выполнить строку команд с помощью одного sudo”

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

     sudo bash -c !! 

    за исключением того, что это не совсем работает, потому что !! интерполирует текст предыдущей команды, специальные символы и все. Вам нужно получить текст команды в виде строки и передать это как аргумент sh . К счастью, bash's fc builtin позволяет вам сделать это.

     sudo bash -c "$(fc -ln -1)" 

    Или даже, чтобы вызвать ту же версию bash, которая в настоящее время запущена:

     sudo "$BASH" -c "$(fc -ln -1)" 

    Обратите внимание: поскольку команда выполняется в отдельном процессе оболочки, она наследует переменные среды (только те, которые sudo сохраняет, ум), но не внутренние переменные оболочки. kshglob Shell (например, kshglob ) и другие настройки будут начинаться с значения по умолчанию.

    Эта же команда² работает в zsh и ksh, хотя ATT ksh93 требует, чтобы и first и last номер передавались в fc ³ (который также работает в bash, zsh и pdksh / mksh):

     sudo zsh -c "$(fc -ln -1)" sudo ksh -c "$(fc -ln -1 -1)" sudo "$0" -c "$(fc -ln -1 -1)" 

    Использование $0 для назначения исполняемого файла работающей оболочки работает только в том случае, если оболочка была вызвана через $ PATH, а $ PATH не изменилась или через абсолютный путь.

    Вот еще один метод в zsh, который немного яснее, но длиннее:

     sudo zsh -c $history[$[HISTCMD-1]] 

    Последнее слово предупреждения: sudo – для потенциально опасных команд. Не делайте его слишком простым в использовании!

    ¹ В начале есть несколько лишних пробелов, и в конце команда заменяет строки новой строки, но синтаксис оболочки не заботится об этом.
    ² Я не думаю, что zsh или ksh имеют что-то вроде bash's $BASH ; $0 работает только в том случае, если это абсолютный путь или когда он не содержит косой черты, а путь поиска команд не изменился.
    ³ fc является псевдонимом для hist в ATT ksh, но это так же хорошо.

    Если вы хотите повторить ту же команду с sudo! после выполнения такой команды:

     echo "something">/path/file 

    Вы используете глобальный синтаксис замены, чтобы вызвать команду:

     !!:gs/>/|sudo tee -a / 

    Используйте пробел после параметра -a .

    Это эквивалентно sudo !! но помогает вам обходить ограничения sudo для <и>. Поскольку sudo не позволяет использовать [<,>].


    Чтобы обойти ограничения sudo вообще для перенаправления, вы можете использовать его следующим образом:

     echo "something" | sudo tee myfile 

    команда tee позволит вам читать со стандартного ввода и записывать на стандартный вывод и файлы

    Если вы хотите повторить команду и добавить текст в файл, команда tee имеет параметр -a для добавления. Поэтому вы можете вспомнить команду с

     sudo !! 

    и текст будет добавлен в файл

    пример:

     echo "something" | sudo tee -a /path/file sudo !! 

    Кажется, это так же просто, как sudo sh -c "!!" :

     $ cd / $ echo hello > foo bash: foo: Permission denied $ sudo sh -c "!!" sudo sh -c "echo hello > foo" $ ls -l foo -rw-r--r-- 1 root root 6 Jun 20 16:21 foo 
    Interesting Posts

    Открытие командной строки в текстовом редакторе – что это называется?

    Создание RPM приводит к тому, что ничего не генерируется в каталоге RPMS

    Не удается загрузить в LUbuntu после настройки RAID

    Найти каталоги, исключая конечную скобку ')'

    Как просмотреть основные файлы для целей отладки в Linux?

    В чем основные отличия между BSD- и Linux-операционными системами?

    Означает ли факт, что MacOS работает на ядре BSD, означает, что это лучший выбор для этого оборудования?

    Как извлечь vmlinux из образа ARM?

    Ноутбук Manjaro внезапно не загрузит среду рабочего стола Xfce. Как загрузиться нормально?

    Удаление начального 10 МБ из открытого файла

    Что такое подсистема (например, подсистема netfilter)?

    Вывод трубы из одной команды в нестандартный ввод другой команды

    Использование / dev / random, / dev / urandom для генерации случайных данных

    Уникальная идентификация диска (а не раздела)

    найти и найти: использование, плюсы и минусы друг друга

    Linux и Unix - лучшая ОС в мире.