Fabric: 「sudosu-」呼び出しを実装するにはどうすればよいですか?

作成日 2013年10月29日  ·  9コメント  ·  ソース: fabric/fabric

「sudosu--user_name」コマンドを模倣して、必要なコマンドを実行する方法はありますか?

runsudoを試しましたが、残念ながらそれを行う方法はありません。 助けてください

最も参考になるコメント

@polusok@ kusnier私は同様の制限で作業しています。 この方法でコマンドを渡すことができます。

run('echo "whoami" | sudo su --username')

全てのコメント9件

'-'はあなたがやろうとしていることにおいて重要ですか? (例:ログインを呼び出す)または、現在のユーザーとルート以外の別のユーザーとしてコマンドを実行しようとしていますか?

ログインの影響が重要でない場合は、次のようにすることができます...

sudo("mkdir /var/www/new_docroot", user="www-data")

また

   with settings(sudo_user='mysql'):
            sudo("whoami") # prints 'mysql'

または、ログインが重要な場合(ハッキーな方法)、これを行うことができます...

   sudo("su - usernaeme -c 'command to be run'")

はい-私にとって重要です。 実装する必要があります

  • クレデンシャルを使用してサーバーにログインします
  • 特定の権限と構成された環境を持つ別のユーザーとしてシェルログインで
  • コマンドを実行する

私は自分のアカウントのパスワードしか持っておらず、ステップ2でそれらのユーザーのパスワードを持っていないため、を介して接続する必要があることに注意してください

sudo su - user_name

残念ながら、許可を得て禁止されているため使用できません

sudo("su - usernaeme -c 'command to be run'")
Sorry, user user_name is not allowed to execute '/usr/bin/su - another_user -c pwd' as root on server.

他に何か提案はありますか?

@polusok :回避策はありますか? 私も同じ問題を抱えてる。 sudo su - jbossを使用してjbossユーザーになることしかできません。

@polusok@ kusnier私は同様の制限で作業しています。 この方法でコマンドを渡すことができます。

run('echo "whoami" | sudo su --username')

npalrecha、これは機能しているように見えますが、各コマンドでパスワードの入力を求められます。 sudo su --userだけで、後続のすべてのコマンドをそのユーザーとして実行する方法は本当にありませんか?

同じ問題が発生しました... /etc/sudoersファイルを変更できる場合は、おそらくそれが最も簡単な解決策です。 あなたの行はおそらくusername host = ALLと表示されますが、 username host = (ALL) ALLと表示されるはずです。

これができない人のための私の回避策です。
これらのソリューションでsudo(command, user="otheruser")を実行しても機能しないことに注意してください。

class Sudosu:
    def __init__(self, user):
        self.user = user

    def __enter__(self):
        self.old_sudo_prefix = env.sudo_prefix
        self.old_sudo_user, env.sudo_user = env.sudo_user, self.user
        env.sudo_prefix = "sudo -S -p '%(sudo_prompt)s' su - %(sudo_user)s -c"

    def __exit__(self, a, b, c):
        env.sudo_prefix = self.old_sudo_prefix
        env.sudo_user = self.old_sudo_user

そのように使用してください...

<strong i="17">@task</strong>
def test():
    with Sudosu(user=username):
        sudo("whoami")

または、デコレータとして...

def sudosu(user):                                                                        
    def wrap(f):                                                                         
        def inner(*args, **kwargs):                                                      
            old_sudo_prefix = env.sudo_prefix                                            
            old_sudo_user, env.sudo_user = env.sudo_user, user                           
            env.sudo_prefix = "sudo -S -p '%(sudo_prompt)s' su - %(sudo_user)s -c"       

            f(*args, **kwargs)                                                           

            env.sudo_prefix = old_sudo_prefix                                            
            env.sudo_user = old_sudo_user                                                
        inner.__name__ = f.__name__                                                      
        return inner                                                                     
    return wrap                                                                          

そのように使用してください...

<strong i="24">@task</strong>
@sudosu("username")
def whoami():
    sudo("whoami")

また...

sudo = sudosu("username")(sudo)

<strong i="28">@task</strong>
def whoami():  
    sudo("whoami")

どちらの方法でも。 私の好みは文脈としてです。

もちろん、 env.sudo_prefixを設定することもできますが、通常のsudoを実行する場合は、リセットする必要があります。

じゅちゅう、期待は高かったのですが、うまくいきませんでした。 基本的に、ファブリックだけで発生したのと同じエラーが発生します。 私はRedHatEnterprise Linux Serverリリース5.4(Tikanga)を使用しています。 Npalrechaのソリューションは機能しますが、もちろんエレガントではありません。

エラー:
申し訳ありませんが、ユーザーxxxxは'/ bin / su --yyyy-c-uの実行を許可されていません
myserver.com.comのrootとしてyyyy/bin / bash -l -cwhoami'。

実行:sudo -S -p'sudoパスワード:' su --yyyy -c -u "yyyy" / bin / bash -l -c "whoami"

まだ-u yyyyをsudoに渡そうとしているようです。 あなたがsudo()の電話をかけているとき、あなたはまだuserをkwargとして渡していると私は信じています。

ただし、通常はsudo su - yyyyが許可されているため、sudoで特定の引数を使用してsuを実行することは許可されていないように見えるため、エラーメッセージは興味深いものです。

FWIW、議論は私には意味をなさないようでしたが、私は何がおかしいのか理解しました。
須藤はコマンドsu - yyyy -c -u "yyyy" /bin/bash -l -c "whoami"を実行しようとしたようです。 その後、Suは-u "achuser" /bin/bash -l -c "whoami"を実行しようとしているように見えますが、-cが複数回渡されたと見なし、最後の1つだけを取得するため、 whoamiのみを実行しています。 私はおそらくこれが起こらないようにしようと思います。

これは、ファブリックに関する実際の問題よりも多くのメーリングリストの飼料です-そのように閉じます。

このページは役に立ちましたか?
0 / 5 - 0 評価