web-dev-qa-db-ja.com

ファブリックからSudoパスワードの入力を求められないようにできますか?

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

_Sudo -S -p <Sudo_Prompt> /bin/bash -l -c "<command>"
_

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

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

48
mipadi

_Shell=False_をSudoに渡してみてください。そうすれば、/ 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))
_
32
Sam Dolan

次を使用できます。

fabric.api import env
# [...]
env.password = 'yourpassword'
13

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

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

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

これと同じ答えは、「Sudo」の下でコマンドを実行しようとしている人にも当てはまります。 sudoersが一部のシステムで現在のユーザーのパスワードなしの設定を持っている場合でも、run()の代わりにSudo()を使用すると、プロンプトが強制されます(FabricコードにENVパスワードまたはキーが既に含まれていない場合)。

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

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

13

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

user ALL=NOPASSWD: some_command

userはSudoユーザーで、some_commandはファブリックで実行するコマンドです。次に、ファブリックスクリプトでShell = Falseを指定してSudoを実行します。

Sudo('some_command', Shell=False)

これは私のために働く

6

/etc/sudoersファイルに、追加できます

user ALL=NOPASSWD: /bin/bash

...ここで、userはFabricユーザー名です。

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

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

2
CanSpice

ここではLinux noobですが、グラファイトファブリックをEC2 AMIにインストールしようとしたときにこの質問を見つけました。ファブリックは、ルートパスワードの入力を求め続けました。

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

fab -i key.pem graphite_install -H root@servername
1
fiat

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

from fabric import env
env.hosts = ['user1@Host1:port1', '[email protected]']
env.passwords = {'user1@Host1:port1': 'password1', '[email protected]': 'password2'}

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

1
Dave Halter

私は最近この同じ問題に直面し、Crossfit_and_Beerの answer が紛らわしいことがわかりました。

これを実現するためのサポートされている方法は、env.Sudo_prefixthis github commit (from this PR )で文書化

私の使用例:

env.Sudo_prefix = 'Sudo '
0
lingfish