関数をBashの別のユーザーに渡しますか?


11

関数をあるユーザーから別のユーザーに渡す方法はありますか?

たとえば、ルートとして実行する小さなBashスクリプトがあります。

#!/bin/bash
user_func(){
  whoami
  exit
}
su vagrant -c 'user_func'

ただし、user_func関数はVagrantユーザーに対しては定義されておらず、ルートに対してのみ定義されているため、実行できません。

私の他のオプションは、複数の行を持つことです

su vagrant -c 'cmd1' 
su vagrant -c 'cmd2'
, etc 

または、複数のコマンドをex:で実行しますsu vagrant -c 'cmd1; cmd2; cmd3;'が、特にVagrantユーザーとして5つ以上のコマンドを実行しようとする場合は、余分なコマンドを使用しない方がよいでしょう。

同じスクリプト内から別のユーザーに関数を渡すことはできますか(たとえば、別のユーザーとしてディスク上にスクリプトを作成してから、その生成されたスクリプトを実行しない)。または私が見落としている別のオプションはありますか?

回答:


10

export最初にその関数定義が必要なようです:

#!/bin/bash
user_func (){
  whoami
  exit
}
export -f user_func
su vagrant -c 'user_func'

トリックを行う必要があります。

-f伝えexport、これは関数名ではなく、変数名であること。からの引用help export

その後に実行されるコマンドの環境に自動エクスポートするように各NAMEをマークします。....

オプション:

 -f   refer to shell functions

コメントでピーターフとステファンが指摘したように、これは2つのことを前提としています:

  1. あなたのことをsuコマンドは、ユーザーの環境を上書きしません
  2. それvagrantはログインシェルですbash。そうでない場合は、suStephaneが提供する代替コマンドラインを使用できます。

    su vagrant -c 'bash -c user_func'

これはまさに私が望んでいたことです。関数をエクスポートできることを知りませんでした。これは、サンプルスクリプトを編集した後で期待していたとおりに機能しました。ありがとう!
gdieckmann 2013

1
いいですがsu、環境をオーバーライドする場合は機能しません。
peterph 2013

1
ログインシェルがあればそれだけで動作することに注意してくださいvagrantですbash。そうでない場合は、su vagrant -c 'bash -c user_func'
ステファンChazelas

6

これは少しハックですが、渡されたsommand内の関数の定義を出力してsu、もちろんそれを使用できます。

$ function foo { do_some_stuff_here; }
$ su test -c "$(typeset -f foo); foo"

これはsu、シェルの初期化後に定義を置くため、何らかの理由でによって生成されたシェルの環境が上書きされる場合でも機能します。十分に互換性のある関数を作成すると、問題の2人のユーザーが異なるシェルを使用している場合でも機能します。


+1本当にきちんとしたトリック!ただ質問ですが、suシェルの環境は外部要因によって上書きされますか?つまり、この場合suはスクリプト内にあるため、コマンドラインを完全に制御できます。新しいシェルの環境をどのように上書きできますか?
ジョセフR.

たとえば、によって生成されたシェルはsu、環境の初期化を行う場合があります。また、suそれ自体が呼び出し元の環境の一部を取り除いてセキュリティを少し強化する場合があります(ただし、これは通常、のようなより強力な代替手段によって行われますsudo)。
peterph 2013

0

それはあなたが持っているスクリプトではなく、関数です。ただし、スクリプトが必要なようです。適切なスクリプトを作成して、必要に応じて/usr/local/bin、またはに入れてください。/home/vagrant/bin例:su vagrant -c '/home/vagrant/bin/myscript.sh'


これは、サンプルスクリプト内の関数です。私の望みは、この単一のスクリプト(ルートとして、およびVagrantユーザーとして実行されるコマンド)内に実行したいすべてのものを含めることであり、Rootユーザー用の個別のスクリプトとVagrantユーザー用の個別のスクリプトを用意する必要はありませんでした。
gdieckmann 2013

0

これを行うためのもう少し移植性の高い方法(bashに依存しない)は、スクリプトに自身を呼び出し、コンテキスト(uid)またはパラメーターに基づいて動作を変更させることです。この例は、superroot権限を必要とするスクリプトを示しており、rootでない場合はsuperを介して自分自身を呼び出すドキュメントに記載されています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.