Мне был предоставлен доступ sudo к одному из наших Linux-пакетов RedHat для разработки, и я, похоже, довольно часто нуждаюсь в перенаправлении вывода в местоположение, к которому у меня обычно нет доступа для записи.
Проблема в том, что этот надуманный пример не работает:
sudo ls -hal /root/ > /root/test.out
Я просто получаю ответ:
-bash: /root/test.out: Permission denied
Как я могу заставить это работать?
root
(в этом случае перейдите к чтению ответов), но очень часто вам просто нужно создать файл где-то еще, как вы сами.Ответы:
Ваша команда не работает, потому что перенаправление выполняется вашей оболочкой, у которой нет разрешения на запись
/root/test.out
. Перенаправление вывода не выполняется sudo.Есть несколько решений:
Запустите оболочку с помощью sudo и введите команду, используя
-c
параметр:Создайте скрипт с вашими командами и запустите этот скрипт с помощью sudo:
Беги
sudo ls.sh
. Посмотрите ответ Стива Беннетта, если вы не хотите создавать временный файл.Запустите оболочку, а
sudo -s
затем запустите ваши команды:Используйте
sudo tee
(если вам приходится много избегать при использовании-c
опции):Редирект
/dev/null
необходимо для остановки тройник с выводом на экран. Чтобы добавить вместо перезаписи выходной файл (>>
), используйтеtee -a
илиtee --append
(последний относится к GNU coreutils ).Благодарю Jd , Adam J. Forster и Johnathan за второе, третье и четвертое решения.
источник
perl -e 'print "STDIN\n"; print STDERR "STDERR\n"; ' > >( tee stdout.log ) 2> >( tee stderr.log >&2 )
Кто-то здесь только что предложил sudoing tee:
Это также может быть использовано для перенаправления любой команды в каталог, к которому у вас нет доступа. Это работает, потому что программа tee фактически является программой «echo to a file», и перенаправление на / dev / null - это остановка ее вывода на экран, чтобы сохранить ее такой же, как в оригинальном надуманном примере выше.
источник
sudo
(т. Е. Для самой команды) может быть опущенУловка, которую я понял сам, была
источник
sudo dd
лучше, чемsudo tee /root/file > /dev/null
примеры выше!dd
это имя команды,of=/root/test.out
это аргумент, который говорит,dd
что такое выходные файлы.of
означает выходной файл иdd
является очень популярным инструментом, используемым как в Linux, так и в OSX (в основном для записи образов на диски). Это хитрый трюк наверняка.dd
вероятно, в равной степени полезно, какtee
здесь. В обоих случаях вы используете обычную, хорошо известную команду для цели, которая, хотя и немного отличается от ее первоначального предназначения, по-прежнему хорошо известна и хорошо документирована. Хотяdd
он хорош в копировании огромных объемов данных, он не сосет с небольшими объемами. Это имеет то преимущество, что не выводит вывод на стандартный вывод.sudo dd
рядом друг с другом, вы очень и очень уверены, что приведенные ниже аргументы верны (особенно учитывая его нестандартный синтаксис). Они не называют это «разрушитель диска» даром ...Проблема в том, что команда запускается
sudo
, но перенаправление запускается под вашим пользователем. Это делается оболочкой, и вы мало что можете с этим поделать.Обычные способы обойти это:
Оберните команды в скрипт, который вы вызываете под sudo.
Если команды и / или файл журнала изменяются, вы можете заставить скрипт принимать их в качестве аргументов. Например:
Вызовите оболочку и передайте командную строку в качестве параметра с
-c
Это особенно полезно для составных команд. Например:
источник
Еще одна вариация на тему:
Или конечно:
У них есть (крошечное) преимущество в том, что вам не нужно запоминать аргументы
sudo
илиsh
/bash
источник
Разъяснение, почему предпочтительным является вариант тройника
Предполагая, что у вас есть соответствующее разрешение на выполнение команды, которая создает выходные данные, если вы перенаправили выходные данные своей команды на tee, вам нужно только повысить привилегии tee с помощью sudo и направить tee для записи (или добавления) в рассматриваемый файл.
в примере, приведенном в вопросе, это будет означать:
для пары более практических примеров:
В каждом из этих примеров вы берете выходные данные непривилегированной команды и записываете в файл, который обычно доступен для записи только пользователю root, что является источником вашего вопроса.
Это хорошая идея, потому что команда, которая генерирует вывод, не выполняется с повышенными привилегиями. Здесь это не имеет значения,
echo
но когда исходная команда представляет собой сценарий, которому вы не полностью доверяете, это очень важно.Обратите внимание, что вы можете использовать опцию -a, чтобы добавить add (например
>>
) в целевой файл, а не перезаписать его (например>
).источник
Заставьте sudo запустить оболочку, например так:
источник
Я бы хотел решить эту проблему:
Если вам нужно написать / заменить файл:
Если вам нужно добавить в файл:
источник
Как насчет написания сценария?
Имя файла: myscript
Затем используйте sudo для запуска скрипта:
источник
Всякий раз, когда мне нужно сделать что-то подобное, я просто становлюсь пользователем root:
Это, вероятно, не лучший способ, но это работает.
источник
Я бы сделал это так:
источник
su
):$ sudo su -c 'pstree -sp $$ >/dev/fd/1'
init(1)───gnome-terminal(6880)───bash(6945)───sudo(401)───su(402)───bash(410)───pstree(411)
Не хочу бить мертвую лошадь, но есть слишком много ответов здесь , что использование
tee
, что означает , что вы должны перенаправитьstdout
к ,/dev/null
если вы не хотите , чтобы увидеть копию на экране.Более простое решение - просто использовать
cat
так:Обратите внимание, как перенаправление помещается в кавычки, чтобы оно оценивалось оболочкой, запущенной
sudo
вместо той, которая его запускает.источник
sudo bash -c "ls -hal /root > /root/test.out"
. Использование тройника позволяет избежать необходимости в раковине, а кошка - нет.Это основано на ответе с участием
tee
. Чтобы упростить ситуацию, я написал небольшой скрипт (я его называюsuwrite
) и вставил его/usr/local/bin/
с+x
разрешения:Как показано в ИСПОЛЬЗОВАНИИ в коде, все, что вам нужно сделать, - это передать выходные данные в этот скрипт, за которым следует желаемое доступное для суперпользователя имя файла, и оно при необходимости автоматически запросит ваш пароль (поскольку он включает в себя
sudo
).Обратите внимание, что, поскольку это простая оболочка
tee
, она также примет-a
опцию tee для добавления, а также поддерживает запись в несколько файлов одновременно.Он также имеет некоторую упрощенную защиту от записи на
/dev/
устройства, которая была упомянута в одном из комментариев на этой странице.источник
Может быть, вы получили доступ sudo только к некоторым программам / путям? Тогда нет способа делать то, что вы хотите. (если вы не взломаете это как-то)
Если это не так, то, возможно, вы можете написать скрипт bash:
Нажмите ctrl+ d:
Надеюсь, это поможет.
источник
источник
sudo
все равно,at
не полезно или не нужно.sudo sh -c 'echo test >/tmp/test.out'
делает то же самое намного эффективнее и элегантнее (но все же страдает недостатком, заключающимся в том, что вы, вероятно, запускаете вещи, дляroot
которых эта привилегия не нужна; обычно вы должны избегать привилегированных команд, когда можете).