スクリプトで「sudo su - user」を模倣する方法は?

スクリプトで「sudo su - user」を模倣する方法は?

lovelyplace私のアプリケーションを次にデプロイする必要があります。構造スクリプト。残念ながら、サーバーの設定が間違っていますが、私ができることは何もありません。引き続きサーバーを維持する必要があります。

非rootユーザーを使用して一般的なタスクを実行できますalice。名前を で指定します。それでは他のユーザーがいるので、その人に電話してみましょうbobbobroot権限があります。サーバーを準備した管理者がrootとしてのみ動作できるところにすべてをインストールしておいたので、bob私がするほぼすべての事に必ず必要です。

alice私が持っているのはアカウントパスワードだけです。私にはパスワードはありませんが、パスワードを入力して何かをすれば彼の力を使うことbobができると聞きました。sudo su - bob実際、シェルではこれを行うことができます(パスワードプロンプトはありません!)、ログインするとすべてのことbobができます。ただし、これはスクリプトで非対話型で実行する必要があります。それはまるでsudo su - bob && whoami

bobしかし、私は次のような力を得る他の方法を考えることはできません。

たとえば、sudo su -c whoami bob結果は[sudo] password for alice:次のようになります。Sorry, user alice is not allowed to execute '/bin/bash' as bob on lovelyplace.

私は多くの組み合わせなどを試しましたが、su結果sudoは常に同じです。パスワードプロンプト、その後拒否。

何かを調べなければなりませんプログラム的にIdentityとしてサーバーにログインaliceした後、Identityとしてコンテンツを実行しますbobsudo whoami印刷するのと同様の非対話型ライナーが必要ですbob。そうしないと、スクリプトを介してアプリケーションをデプロイできません。

sudo su - bobスクリプトでこの奇妙な動作を模倣する方法に関する提案はありますか?

修正する: bobルートと同じ権限がありません。彼はsudoerなどを読むことができないので、より高い権限を持っていますが、alice明らかにルート設定を調整する権限はあまりありません。

答え1

実行したいコマンドをコマンドの標準入力sudo su - bob(したがってコマンドが生成するシェル)に渡すことができる必要があります。

sudo su - bob <<ENDCOMMANDS
echo "Running as:"
whoami
echo "done now...
ENDCOMMANDS

答え2

あなたのサーバーで特権的なカンフーを実行することは非常に興味深いようです。試すことができる2つの方法がありますが、AliceとBobが行うことができるものとしない可能性があるYMMVのみを推測できます。

なぜアリスで実行されるスクリプトでなければならないのですか?一部自動アクセスだから?さて、cronデーモンがある場合は、bashスクリプトを定期的に実行するcronジョブをbobに提供できます。 aliceがbashスクリプトに書き込めば、su(do)なしでbobでスクリプトを実行する方法を見つけましたか?桟橋。しかし、セキュリティはやや弱くなります。

私が試したことがないもう1つのアプローチは、バックグラウンドシェルパスに移動してstdinとoutをパイプにバインドすることです。標準入力パイプに送信できる必要があり、sudo su - bob\nバックグラウンドシェルにコマンドを実行させる必要があります。バックグラウンドシェルに送信される各後続のコマンドは、bobとして実行する必要があります。おおよそのスケッチは次のとおりです。

mkdir -p /tmp/backshell
mkfifo /tmp/backshell/stdin
mkfifo /tmp/backshell/stdout
mkfifo /tmp/backshell/stderr

bash -l >/tmp/backshell/stdout 2>/tmp/backshell/stderr </tmp/backshell/stdin &

cat /tmp/backshell/stdout &
cat /tmp/backshell/stderr >&2 &

echo "sudo su - bob" >> /tmp/backshell/stdin
echo "whoami" >> /tmp/backshell/stdin

しかし、最初の後、echo標準入力パイプが閉じているため、バックシェルも閉じるという欠点があります。したがって、標準入力パイプが閉じないようにする方法を見つけるか、それを実装するためにより複雑なものを使用する必要があります。私はPythonがサブシェルと対話するための本当に良いモジュールだと思います。

関連情報