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

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

 echo "something" > /path/foobar 

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

  • Как убить процесс, запущенный как демон?
  • UNC Аргумент в bash scipt
  • Почему удаление файлов по названию мучительно медленное, а также исключительно быстрое?
  • Завершение заполнения для Mercurial в Bash?
  • Bash: разрешение отклонено при попытке эхо-передачи данных непосредственно в сеть
  • Bash - как запустить команду после предыдущего?
  • Я пытался

     sudo echo "something" > /path/foobar 

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

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

     echo "something" | sudo tee /path/foobar 

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

     sudo !! 

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

  • Получить iSerial с lsusb без sudo
  • Как запустить автозаполнение без клавиши табуляции?
  • Источник .bashrc в zsh без печати какого-либо вывода
  • Как запустить часть скрипта со сниженными привилегиями?
  • SSH-туннель через посреднический сервер - как подключиться в один шаг (используя пару ключей)?
  • Копировать файл при замене текста в нем
  • 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 
    Linux и Unix - лучшая ОС в мире.