0

サーバーでubuntuを使用しています。

2人のユーザーがいます。user1user2にします。

各ユーザーには、必要に応じてアクセス許可が設定された独自のプロジェクトフォルダーがあります。ただし、user1は、他のユーザーのプロジェクトフォルダーにあるPythonスクリプトを実行する必要があります。これに使用subprocess.Popenします。Pythonファイルにはアクセス許可が必要なので、そのスクリプトを呼び出すのに問題はありません。ただし、ログファイル(user2のアクセス許可があります)は、許可拒否エラーを引き起こします(使用する必要のあるユーザーではなく、他のユーザーに属しているため)。

だから私はユーザーを変更しようとしました

Popen("exit", shell=True, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE) #exit from current user, and be root again
Popen(["sudo", "user2"], shell=True, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE)
Popen("/usr/bin/python /some/file/directory/somefile.py param1 param2 param3", shell=True, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE)

しかし、2番目Popenは失敗します

su:ターミナルから実行する必要があります

Pythonシェル内でユーザーを変更する方法はありますか?

PS:いくつかの理由により、ログファイルに関するユーザー権限を変更できません。他のユーザーに切り替える方法を見つける必要があります...

編集:私は物事を明確にするためにいくつかの説明をする必要があります...

2つの異なるdjangoプロジェクトを実行しています。各プロジェクトにはユーザーがあり、各プロジェクトのコードとログが保存される独自のユーザーフォルダーがあります。

ここで、場合によっては、project1からprojet2にデータを転送する必要があります。私にとって最も簡単な方法は、パラメーターを受け入れ、2番目のプロジェクトで関連するジョブ[データ挿入]を実行するPythonスクリプトを作成することです。

したがって、project1内でいくつかの特定の関数が呼び出された場合、project2プロジェクトフォルダーにあるpyスクリプトを呼び出して、2番目のプロジェクトでデータ更新を実行できるようにします。

しかし、これPopenはproject1内で呼び出すため、現在のユーザーはuser1です。しかし、私のスクリプト(project2にあります)には、アクセス許可のために私を拒否したいくつかのログファイルがあります...

だから、どういうわけか、私はuser1からuser2に切り替える必要があります。そうすれば、パーミッションの問題が発生せず、Pythonファイルを呼び出すことができます。または、これを行う別の方法を見つけてください。

4

1 に答える 1

1

一般に、root権限を持っていないか、2番目のユーザーのログイン詳細を知らない限り、別のユーザーになりすます方法はありません。これは仕様によるものであり、Pythonの量がそれを回避することはありません。

問題を解決するPython-eyの方法:

  • 権限がある場合はos.setuid(x)、、(xは数値のユーザーID)を使用して、有効なユーザーIDを変更できます。ただし、これにはスクリプトをrootとして実行する必要があります。osモジュールのドキュメントをご覧ください。

  • 許可があればsu -c <command>、sudoの代わりに試すこともできます。su -cstdinにパスワードを入力する必要があります(pexpectライブラリを使用できます)

問題を解決するUnix-eyの方法:

  • スクリプトにグループ実行可能ファイルのアクセス許可を設定し、両方のユーザーを同じグループに入れます。
  • スクリプトにsetuidビットを追加して、user1がuser2として効果的に実行できるようにします。

    $ chmod g+s script
    

    これにより、グループメンバーはuser2としてスクリプトを実行できます。(「すべて」についても同じことができますが、それはおそらく良い考えではありません...)

[編集]:修正された質問

答えは、あなたがあまりにも無差別であるということです。PopenプロジェクトAとプロジェクトBは、おそらく、互いのスクリプトを介して互いのファイルを台無しにすることによって相互作用するべきではありません。代わりに、クリーンな解決策は、プロジェクトAに必要な機能を提供するWebインターフェイスを用意し、プロジェクトBから呼び出すことです。そうすれば、将来Aを別のホストに移動したい場合でも、問題はありません。 。

主張する場合は、代わりにsudoをシェル内で実行することで(許可がある場合)sudoをだますことができる場合があります。たとえば、次のようなスクリプトがあります。

#!/bin/sh
sudo my/problematic/script.sh

そして、それを+ xでchmodし、Pythonから実行します。これにより、端末の外部でsudoを実行できないという問題を回避できます。

于 2012-03-28T12:16:57.390 に答える