私は何かのような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
編集2Sudo ./myscript
を使用して完全なスクリプトを実行した場合、希望どおりに動作しますが、それをしない方がいいです...別の方法はありますか?
アプローチが機能しない理由は、<
"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
を使用してスクリプト全体を実行します。
/ rootフォルダーはルート専用です。システムだけがそこでファイルを操作できると思います。 「su」で試すことができますが、同じ結果が得られると思います。
第二に、ルート特権で通常のプログラムを実行することは推奨されません。
コマンドラインでSudoを使用する場合、パスワードを指定してrootになります。スクリプトはこれを行うことができません。端末の誰かが変更を行っていることを保証するセキュリティ対策です。また、一部のアクションとフォルダーは、ルートシステムプロセスでのみ使用できます。