私は第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:書き込み可能なファイルにリダイレクトする
現在の作業ディレクトリは/
。デフォルトでは、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
tee
はSudo
ではなく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
行の最後まで。