予期しない動作をしている単純なスクリプトがあります。
path='/usr/local/bin/new_script'
content='#!/bin/bash\nls'
sudo echo -e "$content" > "$path"
エラーが発生します:
bash: /usr/local/bin/new_script: Permission denied
私は何を間違っていますか?
予期しない動作をしている単純なスクリプトがあります。
path='/usr/local/bin/new_script'
content='#!/bin/bash\nls'
sudo echo -e "$content" > "$path"
エラーが発生します:
bash: /usr/local/bin/new_script: Permission denied
私は何を間違っていますか?
ファイル/usr/ local / bin/new_scriptまたはディレクトリ/usr/ local/binへの書き込みアクセス権がありません
sudoを使用してechoコマンドを実行しても、echoはstdoutが指すファイルに書き込むだけなので、役に立ちません。問題は、リダイレクトしようとしているファイルがシェルによって開かれ、通常のユーザーとして実行されていることです。
解決策は、ファイルを開いて書き込むプロセスがrootとして実行されることを確認することです。例:
echo -e "$content" | sudo dd of="$file"
これにより、「dd」がrootとして実行され、シェルの代わりに書き込み用にファイルが開かれます。
次の方法でリダイレクトできます。
sudo sh -c "echo -e '$content' > $path"
リダイレクトは、rootとしてではなく、現在のユーザーによって処理されます。したがって、現在のユーザーが$ pathへの書き込み権限を持っていない限り、リダイレクトは失敗する可能性があります。
teeでこの制限を回避できます。例えば:
# echo as current user; tee as root
echo -e "$content" | sudo tee "$path"
に書き込む権限がない可能性があります/usr/local/bin/
。sudoを使用していますが、ファイルリダイレクト(>)は、sudoされたsudo
コマンド(echo)ではなく、の出力に適用されています。したがって、リダイレクトの特権はエスカレートされていません。