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

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 
  • Как изменить оболочки через скрипт?
  • Блокировать встроенное приложение?
  • Отключите некоторые программы от sudo
  • Процесс приостанавливается при асинхронном запуске
  • Трафик tcpdump трафика через SSH - но нет доступа root ssh
  • Ограничьте стандартных пользователей для запуска команды с определенным аргументом
  • Разрешить пользователю использовать команды brclt-like без sudo
  • Можем ли мы установить пакет через сценарий оболочки?
  • Разница между пользователем sudo и пользователем root
  • Могу ли я увеличить мощность sudo в каталогах / файлах distination на оболочке bash?
  • Безопасное хранение необработанных изображений на USB-накопителях
  • Interesting Posts

    Я переместил новую программу в папку bin, но ничего не происходит, когда я пытаюсь запустить ее

    Почему моя среда полна ␀s?

    Настройка двойного монитора с различными разрешениями с использованием драйвера open source ati

    Псевдоним для перемещения файлов и последующего их назначения

    Почему нет других дистрибутивов / спинов на базе openSuSE?

    mknfsmnt не работает с «Ошибка системного вызова -1»

    Перезапуск службы клиентов LDAP

    Может ли apt-get upgrade выполнить dist-upgrade с одной версии стабильной версии debian на следующую?

    scp copy direction: что такое источник, что такое цель?

    Патч-файлы

    Как сделать vim apply / var / log / messages подсветкой синтаксиса для любого файла, называемого «сообщениями» или «сообщениями»?

    Как перейти в каждый каталог и выполнить команду по определенному файлу?

    Как захватить вывод mplayer в файл?

    Проблемы с сервером

    Не удается загрузить, задача btrfs-transacti заблокирована более чем на 120 секунд, как это исправить?

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