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")
を使用して問題を回避しましたが、より良い解決策があるかどうか疑問に思いました。この問題の回避策はありますか?
_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))
_
次を使用できます。
fabric.api import env
# [...]
env.password = 'yourpassword'
これはあなたの質問に対する最も直接的な答えです。実際に問題はありません。 Fabric run()とSudo()がどのように機能するかを誤解しています。
「回避策」は回避策ではなく、問題に対する100%有効な回答です。
ルールの簡単なセットを次に示します。1)プロンプトが表示されない場合は、「run()」を使用します。 2)プロンプトが表示される場合は、「Sudo()」を使用します。 (これは、問題の実行可能ファイルがBashまたはSudoでなくても、プロンプトを必要とするすべてまたはほとんどのコマンドに当てはまります)。
これと同じ答えは、「Sudo」の下でコマンドを実行しようとしている人にも当てはまります。 sudoersが一部のシステムで現在のユーザーのパスワードなしの設定を持っている場合でも、run()の代わりにSudo()を使用すると、プロンプトが強制されます(FabricコードにENVパスワードまたはキーが既に含まれていない場合)。
ところで、Fabricの作者が#IRCで私の質問に答えました-あなたの質問に非常に似ています。ナイスガイ、彼のファブリックとパラミコの仕事に固執するためのオープンソースの名のないヒーローの一人。
...私のテスト環境では、パスワードなしでSudoに完全にアクセスできるユーザー名が常に1つあります。 Sudo echo hello
と入力してもプロンプトは表示されません。さらに、そのSudoユーザーは「!requiretty」で構成されているため、すべてのコマンドはSSHを介して実行できます(ホスト間のSSHホッピングなど)。これは、単に「run()」を使用して「Sudo something」を実行できることを意味しますが、プロンプトなしで実行される別のコマンドにすぎません。セキュリティに関する限り、テストホストではなく運用ホストをロックダウンするのは誰かの仕事です。 (自動化できないものをテストすることを余儀なくされている場合、それは大きな問題です)。
/ etc/sudoersファイルに以下を追加します
user ALL=NOPASSWD: some_command
userはSudoユーザーで、some_commandはファブリックで実行するコマンドです。次に、ファブリックスクリプトでShell = Falseを指定してSudoを実行します。
Sudo('some_command', Shell=False)
これは私のために働く
/etc/sudoers
ファイルに、追加できます
user ALL=NOPASSWD: /bin/bash
...ここで、user
はFabricユーザー名です。
/etc/sudoers
はrootによってのみ書き込み可能であるため、明らかに、これはrootアクセスがある場合にのみ実行できます。
また、明らかに、これはひどく安全ではありません。/bin/bash
を実行できるため、基本的に何でも開いてしまうため、rootアクセス権がなく、システム管理者に依頼する必要がある場合は、しません。
ここではLinux noobですが、グラファイトファブリックをEC2 AMIにインストールしようとしたときにこの質問を見つけました。ファブリックは、ルートパスワードの入力を求め続けました。
たびたびのトリックは、ssh秘密鍵ファイルをファブリックに渡すことでした。
fab -i key.pem graphite_install -H root@servername
複数のマシンにパスワードを使用することもできます。
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
私は最近この同じ問題に直面し、Crossfit_and_Beerの answer が紛らわしいことがわかりました。
これを実現するためのサポートされている方法は、env.Sudo_prefix
、 this github commit (from this PR )で文書化
私の使用例:
env.Sudo_prefix = 'Sudo '