web-dev-qa-db-ja.com

sudoでも/ rootディレクトリを読み取れない

私は何かのようなbashスクリプトを持っています

while read -r name value
do
    ....something
done < "test"

このスクリプトを通常のユーザーとして実行しています。

ここで、このファイルを/rootホームディレクトリに保存し、そこから読み取りたいと思いました。
する

while read -r name value
do
    ....something
done < "/root/path/to/file"

もちろん、次のエラーが表示されます:./script: ine xy: /root/path/to/file: Permission Denied

試したより

while Sudo read -r name value
do
    ....something
done < "/root/path/to/file"

しかし、これは私に:Sudo: read: unknown command

Sudoを使用しているのに、/rootホームディレクトリのファイルを読み取れないのはなぜですか?

[〜#〜] edit [〜#〜]
もう少し試してみて、できないこともわかった

$> Sudo echo "test" /root/.test
[Sudo] Password for user:
-bash: /root/.test: Permission Denied 

編集2
Sudo ./myscriptを使用して完全なスクリプトを実行した場合、希望どおりに動作しますが、それをしない方がいいです...別の方法はありますか?

1
derHugo

なぜ機能しないのですか?

アプローチが機能しない理由は、< "stdin"を使用してファイルを読み込んでいるということです。これは、シェルがファイルの読み取りを担当し、通常のユーザーを使用して実行したため、ファイルを読み取る権利。 readを使用してSudoコマンドを実行しても、Sudoを使用して実行できないシェル組み込み機能であることは言うまでもありません。 cdなど.

動作させるにはどうすればよいですか?

あなたがすべき唯一のことは、どういうわけかファイルvi rootまたは必要な特権を持つユーザー/グループを読むことです。次のようにできます:

Sudo cat /root/txt | while read -r name value;
do
  some command
done

この場合、catで実行されるのはSudoのみです。

ただし、ベストプラクティスは、スクリプトを/usr/local/binに配置して、誰でもアクセスできるようにすることです。

また、何かを/root/exampleにリダイレクトする場合は、Sudo teeを使用する必要があります。

echo test | Sudo tee file

またはSudoを使用してスクリプト全体を実行します。

1
Ravexina

/ rootフォルダーはルート専用です。システムだけがそこでファイルを操作できると思います。 「su」で試すことができますが、同じ結果が得られると思います。

第二に、ルート特権で通常のプログラムを実行することは推奨されません。

コマンドラインでSudoを使用する場合、パスワードを指定してrootになります。スクリプトはこれを行うことができません。端末の誰かが変更を行っていることを保証するセキュリティ対策です。また、一部のアクションとフォルダーは、ルートシステムプロセスでのみ使用できます。

2
ravery