2012-03-28 15 views
0

私のサーバーでubuntuを使用しています。Pythonシェル内のユーザーを変更する

私は二人のユーザーを持って、彼らはUSER1とuser2の

各ユーザーが自分のニーズのために設定されたアクセス権を持つ独自のプロジェクトフォルダを持つことができます。しかし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のプロジェクトを持って

...私は物事を明確にするためにいくつかのexplenaitonを行う必要があります。私は他のユーザーに切り替える方法を見つける必要がある...

EDIT。各プロジェクトにはユーザがあり、それぞれのプロジェクトコードとログが保存される独自のユーザフォルダがあります。

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

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

しかし、これはproject1内のPopenを呼び出すため、currntユーザーはuser1です。しかし、私のスクリプト(プロジェクト2で)は、アクセス許可のために私を拒否するいくつかのログファイルを持っています...

だから、どういうわけか、私はアクセス権の問題がないので、私はuser1からuser2に切り替える必要があります。 pythonファイル。または、これを行うための別の方法を見つけることができます。

+0

Popenは、pythonプロセスのサブプロセスで指定されたコマンドを実行します。私はそれがあなたの最初の誤解だと思う。 –

答えて

1

一般に、第2のユーザーのログインの詳細を知っているroot権限を持たずに別のユーザーとしてマスカレードする方法はありません。これは設計によるものであり、Pythonの量はそれを回避するものではありません。問題を解決するための

のPython-EYの方法:あなたが権限を持っている場合は

  • は、あなたの実効ユーザIDを変更する(xは数字のユーザーIDである場合)、os.setuid(x)を使用することができます。しかし、これはあなたのスクリプトをrootとして実行する必要があります。 os module documentationをご覧ください。

  • あなたが許可を得ている場合は、sudoの代わりにsu -c <command>を試すこともできます。スクリプトのグループの実行権限を設定し

    • su -cは(あなたがpexpectライブラリを使用できるため)STDIN上のパスワードを提供するために、問題を解決するための

    のUnix-EYの方法をあなたが必要となります両方のユーザーが同じグループに所属している必要があります。

    $ chmod g+s script 
    

    これは、グループのメンバーがuser2のようスクリプトを実行できるようになります:user1がuser2のよう効果的にそれを実行できるように

  • は、スクリプトにsetuidビットを追加します。 (...同じことが「すべて」のために行うことができるが、それはおそらく良いアイデアではないでしょう)

[EDIT]:改訂質問

答えは、あなたがしているということですあまりにも乱雑です。プロジェクトAとプロジェクトBは、おそらく互いのスクリプトをPopenを介してお互いのファイルにぶつけ合うことによって対話すべきではありません。代わりに、きれいな解決策は、あなたが必要とする機能をプロジェクトBから呼び出す、プロジェクトA上のWebインターフェイスを持つことです。その方法は、将来別のホストでAを移動したい場合には問題ありません。

あなたが主張しているのであれば、sudo(もしあなたがパーミッションを持っているなら)をシェルの中で実行することによってそれを欺くことができるかもしれません。例えば、スクリプトがあります。

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

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

+1

私は、適切なアクセス許可が両方のユーザの間で付与されている場合、それをプログラム的に行う便利な方法は、authorized_keysファイルに他のユーザのssh公開鍵を持ち、ssh経由でもう一方のスクリプトを呼び出すことです。 – jsbueno

+0

** user1 **も** user2 **も許可していません。だから私は根本的に最初にする必要があります... – FallenAngel

+0

@jsbueno実際に悪い考えではありません。我々はこれを仕事でかなり使います。 – brice

関連する問題