Выполнить строку команд с помощью одного 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 впереди?

  • Могу ли я запустить команду, загруженную из .bashrc с помощью sudo?
  • Проблема с sudoing ssh - `sudo ssh ...` не работает
  • Отключите некоторые программы от sudo
  • разрешить пользователю chroot?
  • Как сделать скрипт sudo без пароля для любого пользователя в bash
  • Судо долго ждать пользователя Active Directory
  • Отрицательные / недопустимые настройки Ubuntu без полномочий root sudo
  • Почему root должен запускать неограниченные команды как сам по doas?
  • 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

    KSH / bash для создания файлов динамически

    Как задержать аргумент командной строки?

    Что означает -fnoninteractive означает в вызове debconf-communication?

    Использование sudo для доступа к другой учетной записи на одной машине

    Драйвер ядра для отслеживания на Lenovo Thinkpad 13

    Новая запись меню в GRUB2, «файл не найден» и «вам нужно загрузить первые ошибки ядра»

    Grub не запускает недавно установку Debian

    Улучшить команду sed для замены первого экземпляра символа и всех следующих символов?

    Как загрузить файл на удаленную машину через SSH?

    Должен ли я изменить разрешения двоичных файлов?

    Как получить дизайн коричного окна

    Samba4's ldbsearch жалуется на аутентификацию для базовых поисков

    Необходимо понимать cpio -d и -make-каталоги, пожалуйста, помогите с примером

    Изменить разрешение экрана без монитора под Linux?

    Не удается установить второй жесткий диск 1 ТБ в Linux, отлично работает в Windows 8.1

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