2016-08-21 3 views
0

Я хочу написать текст из stdin в файл, принадлежащий root.Как использовать перенаправление вывода с помощью sudo?

Я делаю это программно через SSH-соединение - по существу из сценария - поэтому использование текстового редактора не может быть и речи. Терминала нет. Процесс полностью автоматизирован.

Учитывая, что [а] корень высота может быть получена с помощью sudo, и [б] файлы могут быть записаны с помощью cat с перенаправлением, я предполагал следующее будет работать:

ssh [email protected] sudo cat >the-file 

К сожалению, перенаправление применяется к sudo, а не к cat. Как я могу применить перенаправление к cat в этом примере?

+0

На самом деле, вы можете использовать текстовый редактор, даже через соединение SSH, редакторы, такие как Vim или нано должны работать нормально. Попытайтесь лучше объяснить свой случай с SSH-соединением. Вы уже регистрировались при попытке перенаправления? – paulequilibrio

+0

Ваша команда sudo не отображается правильно. Это должен быть 'sudo -u user -h host cat> the-file'. Это работает на моей системе. «Я делаю это через SSH-соединение, поэтому использование текстового редактора не может быть и речи». Этот вывод не так само собой разумеется, как вы это делаете. Редакторы, такие как 'vim',' nano' и даже 'emacs -nw', отлично работают в терминале. – kaylum

+0

@ John1024 Да, я мог бы использовать тройник, но я бы скорее исправить проблему перенаправления напрямую. –

ответ

2

Нормальная модель, чтобы сделать это:

ssh [email protected] 'cat | sudo tee the-file' 

tee перенаправляет вывод в файл и может работать с sudo.

Если вы хотите имитировать >>, где файл прилагается, используйте sudo tee -a.

Вам также нужно обязательно указать свою команду, как указано выше, так что труба не интерпретируется локальной оболочкой.

Редактировать

tee команда is part of POSIX, так что вы можете рассчитывать на его существование.

Перенаправление Стандартная ошибка, а также:

ssh [email protected] 'some_command 2>&1 | sudo tee output-file' 
+0

Так перенаправление * не может * использоваться в команде 'sudo'? Например, если 'tee' (и я полагаю,' dd') не существует в системе, я бы был boned? Или, если бы я захотел переадресовать stderr, я тоже был бы boned? –

+0

См. Мое редактирование :) Да, я имею в виду, что вы, вероятно, можете использовать 'ssh 'sudo sh -c" cat> the-file "'', но вы быстро попадете в «два множества проблем с цитированием», а я 'uns unsure, если перенаправление будет работать правильно через 'sh -c' над ssh :) – Will

+1

Вы можете использовать перенаправление с любой командой, которая вам нравится, но перенаправление происходит до запуска команды. (На самом деле, ваш вопрос неверен, перенаправление применяется ко всей командной строке 'ssh', а не' sudo'.) Вы можете сделать что-то вроде 'sudo sh -c 'cat> output-file'', чтобы получить привилегированное перенаправление , но 'sudo tee' намного проще. С 'sudo' вы всегда должны стремиться ограничить привилегированную операцию самой простой возможной командой. – tripleee

Смежные вопросы