Перенаправить вывод от имени другого пользователя

Мне нужно sudo как другое, используемое для выполнения определенной команды. Я пытаюсь использовать strace с ним и перенаправляю вывод в файл для дальнейшего анализа. Сложность заключается в том, что как пользователь sudo'ed у меня нет разрешений на запись в место, где я хочу сохранить свой файл. (И без sudo'ing у меня нет разрешения на выполнение этой команды для начала) .

Итак, как я могу выполнить свою команду как пользователь A и перенаправить ее вывод как пользователь B?


person Pavel    schedule 02.07.2012    source источник


Ответы (4)


Попробуйте:

sudo sh -c "command > output.txt"

Таким образом, вы сможете запускать любую команду и писать везде.

Если вам действительно нужно, по какой-то непонятной мне причине, выполнить команду от имени пользователя A и написать от имени пользователя B, вы можете сделать следующее:

sudo -u A command | sudo -u B tee /somewhere > /dev/null

Где A и B - нужный вам пользователь. Часть > /dev/null нужна только в том случае, если вы не хотите, чтобы вывод команды также перенаправлялся на стандартный вывод.

person Zagorax    schedule 02.07.2012
comment
Что ты делаешь с этими лишними звонками в sh? Все работает отлично, если вы просто скомбинируете sudo и tee - person filmor; 03.07.2012
comment
Ложь. sudo -u nobody ls | sudo -u root tee > /test и я получаю bash: /test: Permission denied. На самом деле я не могу объяснить почему, но в моей системе мне нужно вызвать sh (или bash). Если у кого-то есть объяснение, приветствую. - person Zagorax; 03.07.2012
comment
Это потому, что вы неправильно используете tee :). Пожалуйста, прочтите справочную страницу. Вы предоставляете файл для записи в качестве / аргумента /. В вашем примере трубопровод выполняется вашим собственным пользователем (поскольку > интерпретируется из оболочки вызывающего абонента), в то время как при правильном использовании tee вызывающий элемент этой части имеет значение (в данном случае это будет root ...) - person filmor; 03.07.2012
comment
Ой ну спасибо. Ты прав. Обновив свой ответ и проголосовав за ваш, стоит проголосовать за него. :) - person Zagorax; 03.07.2012

Вы можете использовать tee для этого. Программа читает stdin и записывает ввод в один или несколько файлов, а также в стандартный вывод:

sudo funny_command | sudo tee output_file > /dev/null

/ РЕДАКТИРОВАТЬ: Хотя вы уже приняли другой (на мой взгляд, неполноценный) ответ, я все равно завершу его:

Приведенные выше варианты использования могут быть выполнены следующим образом

sudo command | sudo tee output.txt > /dev/null
sudo -u A command | sudo -u B tee output.txt > /dev/null

Конечно, вам не нужно использовать перенаправление на /dev/null.

person filmor    schedule 02.07.2012
comment
Возможно, это не имеет отношения к ответу, но мне просто нужно было выполнить это: echo the text content | sudo -u разработчик tee output.txt - person Daniel Katz; 16.01.2020

Другой вариант, позволяющий избежать передачи материала обратно, а затем в /dev/zero, -

sudo command | sudo dd of=output.txt
person Joachim Breitner    schedule 26.04.2013

Возможно, я неправильно понял исходный вопрос.

Если вы хотите захватить весь вывод sudo strace foo, тогда проще всего сначала запустить script.

Если вы хотите захватить stderr из sudo strace foo, вы можете попробовать sudo strace foo 2> >(tee logfile).

Если вы хотите записать только результат strace, а не foo, вы можете попробовать sudo strace -o /dev/fd/3 foo 3> >(tee logfile).

Если вы не можете использовать 3> >, я думаю, вы все равно можете сделать это с перенаправлением fd.

person Neil    schedule 26.04.2013