Например, если я хочу создать файл и ввести текст в одну строку, я могу перенаправить вывод в файл с помощью >
оператора:
echo "something" > /path/foobar
но если у меня нет доступа к папке /path/
и мне нужны привилегии sudo, как я могу выполнить эту же команду как обычный пользователь с правами sudo?
Я пытался
sudo echo "something" > /path/foobar
но это не работает, потому что Суда только подсчитываю для edit
но не для правой части
из>
Конечно, я мог бы стать пользователем root с помощью sudo su
или использовать tee
вместо:
echo "something" | sudo tee /path/foobar
Но я хотел бы найти решение, где я могу работать с последней строкой в качестве замены через
sudo !!
Разве нет способа «переработать» последнюю строку и просто добавить sudo
впереди?
bash
sudo
command-history
rubo77
источник
источник
alias sudo !!
?Ответы:
Вы не можете просто вставлять
sudo
перед командой оболочки, вы должны вызвать оболочку для повторной оценки этой команды (например, расширение переменных, открытие файлов для операторов перенаправления и т. Д.). Так вотза исключением того, что это не совсем работает, потому что
!!
интерполирует текст предыдущей команды, специальные символы и все. Вам нужно извлечь текст команды в виде строки и передать его в качестве аргументаsh
. К счастью,fc
встроенная функция bash позволяет вам это делать.Или даже, чтобы быть уверенным, что вы вызовете ту же версию bash, которая в данный момент работает:
Обратите внимание, что поскольку команда выполняется в отдельном процессе оболочки, она наследует переменные среды (только те, которые
sudo
сохраняются, помните), но не внутренние переменные оболочки.kshglob
Параметры оболочки (например ) и другие настройки будут также начинаться со значения по умолчанию.Та же команда² работает в zsh и ksh, хотя ATT ksh93 требует, чтобы
first
иlast
число, и число передавались вfc
³ (что также работает в bash, zsh и pdksh / mksh):Использование
$0
для обозначения исполняемого файла работающей оболочки работает только в том случае, если оболочка была вызвана через $ PATH, а $ PATH не изменилась или через абсолютный путь.Вот еще один метод в zsh, который немного понятнее, но длиннее:
Последнее слово предупреждения:
sudo
для потенциально опасных команд. Не делайте это слишком простым в использовании!¹ В начале есть несколько лишних пробелов, а подстановка команд удаляет новые строки в конце, но синтаксис оболочки не заботится об этом.
² Я не думаю, что у zsh или ksh есть что-то похожее на bash
$BASH
;$0
работает только в том случае, если это абсолютный путь или когда он не содержит косой черты и путь поиска команд не изменился.³ это псевдоним для ATT ksh, но это так же хорошо.
fc
hist
источник
Если вы хотите повторить ту же команду с sudo !! после выполнения такой команды:
Вы используете глобальный синтаксис замены, чтобы вызвать команду:
Используйте пробел после параметра -a .
Это эквивалентно sudo !! но помогает обойти ограничения sudo для <и>. Потому что sudo не позволяет вам использовать [<,>].
Чтобы обойти ограничения sudo в целом для перенаправлений, вы можете использовать его следующим образом:
Команда tee позволит вам читать со стандартного ввода и записывать в стандартный вывод и файлы
Если вы хотите повторить команду и добавить текст в файл, у команды tee есть опция -a для добавления. Чтобы вы могли вспомнить команду с
и текст будет добавлен в файл
пример:
источник
-a
действительно необходимо?>
перепишет файл,tee -a
добавит, что будет>>
Это выглядит так просто, как
sudo sh -c "!!"
:источник
echo "foo bar"
что станет,sh -c "echo "foo bar""
а что просто напечататьfoo
вместоfoo bar
.sudo sh -c '!!'
Вместо этого я попытался, если ваша команда, но это тоже не работаетa=b
и тогда ,echo "$a" >file
и тогдаsudo sh -c '!!'
она будет расширяться ,sudo sh -c 'echo $a >file'
которая будет печатать пустую строку вместоb
вfile
.sudo
для получения корневой оболочки, а затем копирование и вставка команды в нее было бы наиболее близким, но завершилось неудачно, если команда ожидала использования переменных, установленных в вашей некорневой оболочке. Использованиеsudo sh -c "!!"
отлично работает для простых команд, но чревато сложными. Я думаю, что лучший совет - не ожидать, что есть какая-то команда, которая будет работать 100% времени, - изучить некоторые возможные решения и применять каждое из них, когда оно подходит лучше всего.