HEREDOCを使ってsudoを実行できますか?

HEREDOCを使ってsudoを実行できますか?

編集:@Kusalanandaの回答以降に修正された例です。私のすべての状況はより複雑でした。複数のコマンドと変数定義が必要です)

suルートではなくパスワードを入力したくないため使用できません

同僚のスクリプトでsuコードを模倣しようとしました。

# script runs as root
su - oracle -- "export DATA=$val; cat <<CHK
test 
CHK"
Password:
test

以下は機能しません(エラー出力)。

$ export val=534
$ sudo -i -u oracle -- "export DATA=$val;cat <<CHK
test
CHK"
-ksh: export DATA=534;cat <<CHKtestCHK: not found
[127]$

これはどちらもありません(まったく出力なし)。

$ sudo -i -u oracle -- ksh -c "export DATA=$val;cat <<CHK
test
CHK"
$ 

sudoある程度は理解する平らな入るが、万水道これはパラメータでのみ言及され、スペースで区切られますが、ここではそうではありません。

答え1

実行するコマンドの一部としてこの文書をリダイレクトする必要はありませんsudo

sudo -u oracle env DATA="$val" cat <<END
this is
the here-document
END

このsudoユーティリティは、標準入力ストリームを実行するコマンドに渡します。このenvツールは、特定のユーティリティを実行する前に環境を変更します。上記のようにこれを使用すると、ほとんどの変数の環境が消去されてもsudo実行したいユーティリティで環境変数を設定することができます。sudosudo

コマンドが変数を設定して実行するよりも複雑な場合は、スクリプトで実行する必要がある作業を収集してからスクリプトを実行することをお勧めcatします。sudo

#!/bin/sh

export DATA="something"

cat <<END
this is
the here-document
END

この文字列はsomethingスクリプトのコマンドラインからも取得できます。あるいは、ステートメントを完全に省略してスクリプトを実行するときは、以前に示したように設定することもできますDATAenv

sudo env DATA="$var" ./myscript

関連情報