他のユーザーで対話型コマンドを実行する方法

他のユーザーで対話型コマンドを実行する方法

bashスクリプトを作成しようとしています。

  • 別のユーザーにコンテキストを切り替える(この場合はルート)
  • 一連のコマンドの実行私。ユーザーを作成し(発信者に対話的にユーザー名を求めるメッセージを表示します)両方。このユーザーのパスワードを設定してください
  • 戻り値を取得
  • その後、操作を続けて値を返します。

これまで << EOF入力(絵。 1)、関数(図2)、別のスクリプトをインポートまたは実行します(画像3)。しかし、まだ望む結果が得られていません。

sudo su - << 'EOF'
# do stuff...
EOF

絵。 1

function myfunc()
{
    local  myresult='some value'
    echo "$myresult"
}

図2

sudo su - -c bash <(curl -fksSL https://<my-script-location>.sh)

画像3

答え1

sudo su - << 'EOF'
# do stuff...
EOF

これはうまくいきますが、1つの制限があります。スクリプトは標準入力を介してシェルに渡されるため、作成したいユーザー名を読み取るなど、他の目的には標準入力を使用できません。

標準入力を保存する簡単な方法は、シェルコマンドを引数として渡すことです。

これはsudo su重複していることに注意してください。sudo指定されたコマンドをrootとして実行することがsu唯一の目的です。ログインシェルをrootとして実行する(ここではおそらく不要です)、rootとしてシェルを実行するには代わりに使用しますsudo -isudo su -sudo sh

sudo sh -c '
  # do stuff...
'

これにより、シェルコードスニペットで一重引用符を使用することが厄介になります。'\''一重引用符で囲まれたテキストの中に一重引用符を入れることができます。ここでドキュメント構造を維持するにはいくつかの方法があります。最も直接的な方法はhereドキュメントをアップロードすることです。他の記述子について。ただし、これを行うにはclosefrom_overridesudo設定でオプションを有効にする必要があり、デフォルトではそうではありません。sudostdin、stdout、stderr を除くすべてのファイル記述子はクローズされます。

sudo -C 3 sh -c '. /dev/fd/3' 3<<'EOF'
# do stuff...
EOF

このオプションが有効になっていないシステムにコードを移植するには、heredocからスクリプトを読み取り、それをシェルに引数として渡すことができます。

script=$(cat <<'EOF'
# do stuff...
EOF
)
sudo sh -c "$script"

あるいは、sudoedスクリプトを端末から読み取ることができるようにするには、標準入力としてスクリプト本文を渡すこともできます。このアプローチの1つの制限は、フルスクリプト入力のリダイレクトを許可しないことです。

sudo sh <<'EOF'
exec </dev/tty
# do stuff...
EOF

答え2

呼び出し側のユーザーが次のものをsudo割り当てることができるとしますtty

Defaults someuser:requiretty

ansには、必要なコマンドをrootとして実行する権限が与えられています。

Cmnd_Alias STUFF = /usr/bin/passwd, /usr/sbin/useradd
someuser ALL = STUFF

呼び出しを含むスクリプトsudoは対話型です。ユーザー名を場所パラメータとして渡すことができます。

sudo useradd $1
sudo passwd $1

通常どおり使用して返品状況を確認してください$?

答え3

su -c '. /dev/fd/4' 4<<\SCRIPT
    ...automated stuff here...
    ....then for interactive...
    exec </dev/tty
SCRIPT

すべきこと。ニーズに合わせてカスタマイズしてください。ただし、コンテキストが切り替わって$?操作が完了すると、シェルの戻り状態になります。

関連情報