bashスクリプトでrootとしてSTDINを使用してコマンドを実行します(ただし、rootパスワードを手動で挿入する必要はありません)。

bashスクリプトでrootとしてSTDINを使用してコマンドを実行します(ただし、rootパスワードを手動で挿入する必要はありません)。

Bashスクリプトからrootとしてコマンドを実行したいと思います。

このコマンドはSTDINから読み取ることができる必要があります。

Bashスクリプトにはローカル変数としてrootパスワードがあり、手動で入力したくありません。

私が試したとき:

  1. 初期スクリプトをrootとして実行する方法を知っていますが(実際には使用しますが、より良い方法を探しています)、複雑なロジック、さまざまなユーザー、および環境変数には制限があります。

  2. sudo-NOPASSWDメソッドを知っていますが、セキュリティ上の理由で使用したくありません。

  3. 方法はわかっていますが、su -c毎回ルートパスワードを入力する必要があります。

su - -c "adduser new_user"
  1. 私はheredocメソッドについて知っていますが、私のSTDINをブロックします。
read -sp "Please, enter root password: " ROOT_PASSWD
echo
su - <<EOI
$ROOT_PASSWD
echo "<This password input is handled automatically based on previously asked password>"

# Do NOT asks user password and data as supposed to:
adduser new_user
EOI

答え1

あなたはこれを行うことができます、

echo $PASSWORD | su -c "tac <<_EOF
1
2
3
_EOF"

しかし、他の人が答えたように、これは安全ではないか、推奨されません。あなたのアプローチがうまくいかないのは、suが実行するコマンドにstdinを渡そうとしたときにsuがスクリプト全体を上書きするためです。また、ほとんどのadduserコマンドを使用すると、標準入力ではなくコマンドラインでパスワードを指定できるため、そうする必要があるかどうかわかりません。 suの-cオプションのみを使用すれば十分です。

答え2

ファイルにルートパスワードを保存することは、足に銃を撃つのと同じです。リスクが高すぎます。

最善の方法は、専用タスク用のスクリプトを書いて、setuidビット権限(例:chmod4755)このジョブ専用グループのグループ権限を使用してrootとして実行します。そのスクリプト習慣スクリプトの所有者であるルートを除くすべての人に書き込み権限を割り当てます。

次に、専用ユーザーIDを作成して専用スペース(たとえば、cron、sync、daemon、lp、mail、sysなどがあります。)。その後、必要に応じてそのユーザーにジョブを実行させます。このアプローチを使用すると、制限された操作を実行するための既知の権限を持つ構成機能になります。これが最もきれいな方法です。

sudoの全体的な目的は、事前定義されたプロセスを「バイパス」しようとしているため、スーパーユーザー権限を取得したいユーザーが実際的で正当であることを確認するために対話型認証を強制することです。簡単ではありません。

非アクティブ状態を表示するために使用しようとせずにsetuidが無効になっているようです。 それはコーシャではありません!

setuid機能を示す小さなスクリプトは次のとおりです。非アクティブ:

#!/bin/sh

BASE=`basename "$0" ".sh" `
TEST="${BASE}.testor"

touch "${TEST}"

実行中のスクリプトのスナップショット:

SetUIDジョブのスナップショット

関連情報