lovelyplace
私のアプリケーションを次にデプロイする必要があります。構造スクリプト。残念ながら、サーバーの設定が間違っていますが、私ができることは何もありません。引き続きサーバーを維持する必要があります。
非rootユーザーを使用して一般的なタスクを実行できますalice
。名前を で指定します。それでは他のユーザーがいるので、その人に電話してみましょうbob
。bob
root権限があります。サーバーを準備した管理者が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としてコンテンツを実行しますbob
。sudo 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がサブシェルと対話するための本当に良いモジュールだと思います。