web-dev-qa-db-ja.com

lsの出力をファイルにリダイレクトすると、bash return permission denied error

現在シェルコマンドを勉強しています。演習の1つは、さまざまなディレクトリとサブディレクトリを持つ構造を作成することです。

私はls -laR > helloを書いたが、helloという名前のテキストファイルを作成することになっていた。ただし、最初にSudoと入力しても、次のメッセージbash: hello: permission deniedが表示されます。

このコマンドは別のLinuxディストリビューションで機能しました。また、数分前にファイルを作成するディレクトリでls -laを使用しましたが、次のようになりました。

drwxr-xr-x 2 root root 4096 Nov 26 10:56 .
drwxr-xr-x 5 root root 4096 Nov 26 10:56 ..

最初のトライアドによると、私には書き込み権限がありますか?

2
sUnTECH789

ルートはhelloファイルを作成するディレクトリの所有者であり、同じグループのユーザーと他のユーザーにはそのディレクトリへの書き込み権限がないため、次の場合にbash: hello: permission deniedエラーが発生します。 ls -laR > helloを実行します。

さらに、その前にSudoを使用して同じコマンドを実行すると、まったく同じエラーが発生します。これは、出力リダイレクト(>演算子)がシェルによって行われるであり、lsではなく、したがってSudoは効果がないためです。 Sudols -laRのみに影響します。これを防ぐには、rootとしてログインする必要があります。

Sudo -i

次に、リダイレクトを使用できます。

ls -laR > hello

それ以外の場合は、ルート権限でサブシェルでbashコマンドを実行できます。

Sudo bash -c "ls -laR > hello"

最後に、>演算子でリダイレクトを使用する代わりに、teeコマンドを使用する別のオプションがあります。

ls -laR | Sudo tee hello

この場合、Sudoコマンドにlsを使用する必要はありません。rootおよび他のすべてのユーザーと同じグループのユーザーは、そのディレクトリで読み取りおよび実行の許可を持っているためです。

10
Radu Rădeanu

次のように、helloファイルを書き込み可能なディレクトリに配置します。

ls -laR > /tmp/hello

または、所有していないディレクトリにファイルを本当に作成したい場合は、次を実行します。

Sudo sh -c "ls -laR > hello"
2
jlliagre