2016-08-21 2 views
0

stdinからrootが所有するファイルにテキストを書きたいと思っています。sudoで出力リダイレクトを使用するには?

私はこれをSSH接続(基本的にはスクリプトから)を介してプログラムで実行しています。そのため、テキストエディタを使用することは問題になりません。ターミナルはありません。プロセスは完全に自動化されています。

ssh [email protected] sudo cat >the-file 

残念なことに、リダイレクトがされています[A]ルートの標高はsudoを介して取得することができ、かつ[B]ファイルをリダイレクトしてcatを使用して書き込むことができ、私は次のように機能するであろうと想定することを考えると

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はい、私はteeを使うことができましたが、リダイレクトの問題を直接修正したいと思います。 –

答えて

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')がシステム上に存在しなかったとすれば、私は骨が折れるでしょう?または、標準エラー出力をリダイレクトしたい場合は、私も骨が折れるでしょうか? –

+0

私の編集を参照してください:)そうですね、おそらく 'ssh 'sudo sh -c" cat> the-file "''を使うことができますが、すぐに「2つのレベルのクォート」問題に遭遇します。 ssh経由で 'sh -c'でリダイレクションが正しく動作するかどうか不明です。 – Will

+1

あなたが好きなコマンドでリダイレクトを使うことはできますが、リダイレクトはコマンドが実行される前に行われます。 (あなたの質問は間違っています;リダイレクトは 'sudo'ではなく' ssh'コマンドライン全体に適用されます)特権のリダイレクトを得るには 'sudo sh -c 'cat> output-file'のようなものがありますしかし 'sudo tee'はずっと簡単です。 'sudo'では、特権操作を可能な限り単純なコマンドに制限するよう常に努力すべきです。 – tripleee

関連する問題