50

Fabricを使用してリモートサーバーでコマンドを実行しています。そのサーバーで接続するユーザーにはいくつかのsudo特権があり、これらの特権を使用するためにパスワードは必要ありません。サーバーにSSHで接続するsudo blahと、パスワードを要求せずに実行でき、コマンドが実行されます。Fabricのsudo機能を使用して同じコマンドを実行しようとすると、パスワードの入力を求められます。これは、Fabricが次の方法でコマンドを作成するためですsudo

sudo -S -p <sudo_prompt> /bin/bash -l -c "<command>"

/bin/bash明らかに、私のユーザーにはパスワードなしで実行する権限がありません。

run("sudo blah")の代わりにを使用して問題を回避しましたsudo("blah")が、より良い解決策があるかどうか疑問に思いました。この問題の回避策はありますか?

4

8 に答える 8

32

shell=Falsesudoに渡してみてください。そうすれば、/ bin/bashはsudoコマンドに追加されません。 sudo('some_command', shell=False)

fabric / operations.pyの503行目から:

if (not env.use_shell) or (not shell):
    real_command = "%s %s" % (sudo_prefix, _shell_escape(command))

elseブロックは次のようになります。

                                             # V-- here's where /bin/bash is added
real_command = '%s %s "%s"' % (sudo_prefix, env.shell,
    _shell_escape(cwd + command))
于 2010-09-17T17:07:45.850 に答える
13

次を使用できます。

from fabric.api import env
# [...]
env.password = 'yourpassword'
于 2013-05-13T15:06:32.990 に答える
13

これはあなたの質問に対する最も直接的な答えです:あなたは実際には問題を抱えていません。Fabric run()とsudo()がどのように機能するかを誤解しています。

あなたの「回避策」は回避策ではなく、問題に対する100%有効な答えです。

簡単なルールのセットは次のとおりです。1)プロンプトが表示されない場合は、「ru​​n()」を使用します。2)プロンプトが表示される場合は、「sudo()」を使用します。(これは、問題の実行可能ファイルがBashまたはSudoでない場合でも、プロンプトを必要とするすべてまたはほとんどのコマンドに当てはまるはずです)。

これと同じ答えが、「sudo」でコマンドを実行しようとしている人々にも当てはまります。一部のシステムでsudoersに現在のユーザーのパスワードなしの設定がある場合でも、run()の代わりにsudo()を使用すると、プロンプトが表示されます(ファブリックコードにすでにENVパスワードまたはキーが含まれている場合を除く)。

ところで、Fabricの作者は#IRCで私の質問に答えました-あなたの質問と非常によく似ています-。ナイスガイ、彼のファブリックとパラミコの仕事に固執するためのオープンソースの陰のヒーローの一人。

...私のテスト環境では、sudoへの完全なパスワードなしのアクセス権を持つユーザー名が常に1つあります。入力sudo echo helloしてもプロンプトは表示されません。さらに、そのsudoユーザーは「!requiretty」で構成されているため、すべてのコマンドをSSH経由で実行できます(ホスト間のSSHホッピングなど)。つまり、「run()」を使用して「sudosomething」を実行できますが、これはプロンプトなしで実行される別のコマンドです。セキュリティに関する限り、本番ホストをロックダウンするのは誰かの仕事ですが、テストホストはロックダウンしません。(あなたが物事をテストすることを余儀なくされており、自動化できない場合、それは大きな問題です)。

于 2013-11-19T19:39:27.747 に答える
5

/ etc/sudoersファイルに追加します

user ALL=NOPASSWD: some_command

ここで、userはsudoユーザーであり、some_commandはファブリックで実行するコマンドです。次に、ファブリックスクリプトでshell=Falseを使用してsudoを実行します。

sudo('some_command', shell=False)

これは私のために働く

于 2011-10-04T18:20:02.430 に答える
1

あなたの/etc/sudoersファイルに、あなたは追加することができます

user ALL=NOPASSWD: /bin/bash

...userファブリックのユーザー名はどこにありますか。

/etc/sudoers明らかに、 rootによってのみ書き込み可能であるため、rootアクセス権がある場合にのみこれを実行できます。

また、明らかに、これはそれほど安全ではありません。実行できると/bin/bash、基本的に何でも利用できるようになるため、rootアクセス権がなく、システム管理者にこれを実行するように依頼する必要がある場合は、おそらくそうではありません。

于 2010-09-17T17:05:25.223 に答える
1

Linux noobはここにありますが、EC2AMIにgraphite-fabricをインストールしようとしたときにこの質問を見つけました。ファブリックはrootパスワードの入力を求め続けました。

当然のトリックは、ssh秘密鍵ファイルをファブリックに渡すことでした。

fab -i key.pem graphite_install -H root@servername
于 2012-08-27T04:24:00.147 に答える
1

複数のマシンにパスワードを使用することもできます。

from fabric import env
env.hosts = ['user1@host1:port1', 'user2@host2.port2']
env.passwords = {'user1@host1:port1': 'password1', 'user2@host2.port2': 'password2'}

この回答を参照してください:https ://stackoverflow.com/a/5568219/552671

于 2013-09-28T12:40:43.287 に答える
0

私は最近これと同じ問題に直面し、Crossfit_and_Beerの答えが混乱していることに気づきました。

これを実現するためのサポートされている方法は、このgithub commitこのPRから)env.sudo_prefixで文書化されているように、を使用することです。

私の使用例:

env.sudo_prefix = 'sudo '
于 2016-10-29T06:52:21.727 に答える