web-dev-qa-db-ja.com

標準出力をリダイレクトできません

私は第6章の例に沿ってフォローしていますリダイレクト of The Linux Command Line(2012)。 lsコマンドの標準出力をテキストファイルにリダイレクトしようとしています。許可拒否エラーが引き続き表示されます。 Ubuntu 13.04を使用しています。下記参照:

ta2tyrants@Vaio:/$ ls -l /usr/bin >> ls-output.txt
bash: ls-output.txt: Permission denied

ルートアクセスを使用してこのコマンドを実行しようとすると、同じエラーが発生しました。

ta2tyrants@Vaio:/$ Sudo ls -l /usr/bin >> ls-output.txt
bash: ls-output.txt: Permission denied

私は何を間違えていますか?これを回避する方法はありますか?

1
ta2yrants

解決策1:書き込み可能なファイルにリダイレクトする

現在の作業ディレクトリは/。デフォルトでは、rootのみが変更できます。タイプcd ~を使用してホームフォルダーに変更するか、cdの後にディレクトリへのパスを続けてcan書き込み、再度実行します。

解決策2:shの下のSudoでリダイレクト

シェルのリダイレクトはプログラムに渡されません。これは、Sudoの下でプログラムを実行した場合でも、リダイレクト(>>)は引き続きあなたのアカウントで実行されます。これが起こることです:

  Sudo         ls -l /usr/bin         >>/ls-output.txt
-------------------------------------------------------
|     execute external program      | redirect stdout |       what your Shell sees
| Sudo | command to execute as root |                            what Sudo sees

リダイレクトをSudoしたい場合は、ルートとしてシェルを実行する必要があります。あなたはこれを行うことができます:

     Sudo         sh   -c '      ls -l /usr/bin           >>/ls-output.txt   '
-------------------------------------------------------------------------------
|      execute external program (pass the single-quoted string verbatim)      | your Shell
|    Sudo       |                command to execute as root                   |    Sudo
                | sh | -c | execute external program |    redirect stdout     | root Shell

このように、リダイレクトはshの下で行われるSudo呼び出しの一部です。

解決策3:teeの下のSudoでリダイレクト

Oli♦推奨 のように、コマンドをteeにパイプすることもできます。

       ls -l /usr/bin          |     Sudo        tee /ls-output.txt
-------------------------------------------------------------------------
| execute external program | pipe |      execute external program       | your Shell
                                  |  Sudo  | command to execute as root |    Sudo

teeSudoではなくlsの下で実行されることに注意してください。これは、teeがルート特権を必要とするためです(/ls-output.txt)、およびlsは含まれません。出力didを生成するプログラムにルート特権が必要な場合、両方ともSudoする必要があります。

   Sudo        ls -l /root              |    Sudo        tee /ls-output.txt
--------------------------------------------------------------------------------
|     execute external program      | pipe |     execute external program      | your Shell
| Sudo | command to execute as root |                                             Sudo #1
                                           | Sudo | command to execute as root |  Sudo #2

また、画面に出力を表示したくない場合は、>/dev/null行の最後まで。

4