5

ファブリックを使用して、いくつかのサーバーで行っている管理作業を自動化しようとしています。大まかな流れは次のとおりです。

  1. ローカル ユーザーとの SSH
  2. run: sudo su -root になります (ローカル ユーザーのパスワードを再度入力します)
  3. ルートとして作業を行います:)

残念ながら、使用run('sudo su -')するとスクリプトの実行がブロックされ、ユーザー入力が可能になります。入力するexitCtrl+Dスクリプトを再開すると、ルート権限がありません。

Fabric でのユーザーの切り替えで同様の問題を見たことがありますが、次の行を含むファイルをsudo su -変更することが許可されていないため、制限されています。/etc/sudoers

localuser ALL = /usr/bin/su -

回避策を見つけようとして生地のソースを参照しましたが、成功しませんでした。

4

3 に答える 3

4

あなたと同じ問題に直面しました(sudo su - user管理者のみが許可し、許可されてsudo -u user -c cmdいません)。これが私の実用的な解決策fabricです:

from ilogue.fexpect import expect, expecting, run 

def sudosu(user, cmd):
    cmd += ' ;exit'
    prompts = []
    prompts += expect('bash', cmd)
    prompts += expect('assword:', env.password)

    with expecting(prompts):
        run('sudo su - ' + user)

def host_type():
    sudosu('root', 'uname -s')
于 2014-03-18T14:56:23.470 に答える
2

あなたの問題にはいくつかの解決策があります。まず、 を使用してコマンドを実行しますsudo。そのsudo代わりにファブリックメソッドを使用できます(sudo ref)。runruns a shell command on a remote host, with superuser privileges

たとえば、これらのコマンドは次を使用して実行されますsudo

sudo("~/install_script.py")
sudo("mkdir /var/www/new_docroot", user="www-data")
sudo("ls /home/jdoe", user=1001)
result = sudo("ls /tmp/")

sudoもう 1 つのアイデアは、一連のコマンド (編集する必要がある) をラップすることです。これを行うには、Fabric コンテキスト マネージャー ( ref ) を使用できます。特に、prefixまたはを使用できますsettings

例えば:

with settings(user='root'):
    run('do something')
    run('do another thing')

ルートパスワードを一度尋ねられ、ルートとしてコマンドを実行します。パスワードを保存するように設定を微調整できます。

于 2013-02-27T14:41:17.700 に答える