生地がsudoのパスワードを求めないようにするのを防ぐことはできますか?
質問
使ってます ファブリック リモートサーバーでコマンドを実行します。私がそのサーバーで接続するユーザーには、いくつかのSUDO特権があり、これらの特権を使用するためにパスワードを必要としません。サーバーにsshを入れるとき、私は実行できます sudo blah
コマンドは、パスワードを求めることなく実行されます。ファブリックを介して同じコマンドを実行しようとするとき sudo
関数、パスワードを求められます。これは、ファブリックが使用するときに次の方法でコマンドを構築するためです sudo
:
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)
の行503から FABRIC/OPERATIONS.py:
if (not env.use_shell) or (not shell):
real_command = "%s %s" % (sudo_prefix, _shell_escape(command))
他のブロックは次のようになります:
# 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'
これはあなたの質問に対する最も直接的な答えです:あなたは実際に問題を抱えていません。ファブリックがどのように動作するかを誤解しています()とsudo()。
あなたの「回避策」は回避策ではなく、問題に対する100%有効な答えです。
ここにルールの単純なセットがあります。1)プロンプトが予想されない場合は「run()」を使用します。 2)プロンプトが期待される場合は、「sudo()」を使用します。 (これは、問題の実行可能がバッシュまたはsudoではない場合でも、プロンプトを必要とするすべてまたはほとんどのコマンドに当てはまるはずです)。
この同じ答えは、「sudo」の下でコマンドを実行しようとする人々にも当てはまります。 Sudoersが一部のシステムで現在のユーザーのパスワードレス構成を持っている場合でも、run()の代わりにsudo()を使用する場合、プロンプトが強制されます(ファブリックコードに既にENVパスワードまたはキーが含まれている場合を除く)。
ところで、ファブリックの著者は私の質問に答えました - あなたの質問に非常に似ています - #irc。ナイスガイは、彼の布地とパラミコの仕事に固執するためのオープンソースの名もなきヒーローの一人です。
...私のテスト環境では、SUDOへのパスワードのない完全なアクセスを備えた1つのユーザー名が常にあります。タイピング sudo echo hello
私に促されません。さらに、そのsudoユーザーは「!requiretty」で構成されているため、すべてのコマンドがssh(ホスト間のSSHホッピングなど)を介して実行できます。これは、「sudo何か」を実行するために「run()」を単に使用できることを意味しますが、プロンプトなしで実行される別のコマンドです。セキュリティに関する限り、テストホストではなく、制作ホストをロックダウンすることは誰かの仕事です。 (あなたが物事のテストを強制されている場合、そして自動化できない場合、それは大きな問題です)。
/etc /sudoersファイルの追加
user ALL=NOPASSWD: some_command
ユーザーはsudoユーザーであり、some_commandファブリックで実行したいコマンド、ファブリックスクリプトでsudo it shell = false:falseで実行します。
sudo('some_command', shell=False)
これは私のために働きます
あなたの中で /etc/sudoers
ファイル、追加できます
user ALL=NOPASSWD: /bin/bash
...どこ user
ファブリックのユーザー名です。
明らかに、ルートアクセスがある場合にのみこれを行うことができます。 /etc/sudoers
ルートによってのみ書き込み可能です。
また、明らかに、これはそれほど安全ではありません。 /bin/bash
本質的に何にもオープンしておくので、ルートアクセスがなく、sysadminにこれを行うように依頼する必要がある場合は、おそらくそうしません。
Linux noobはここにありますが、Graphite-fabricをEC2 AMIにインストールしようとしているときにこの質問を見つけました。ファブリックは、ルートパスワードのプロンプトを保持しました。
Evntual Trickは、SSH秘密キーファイルをファブリックに渡すことでした。
fab -i key.pem graphite_install -H root@servername
複数のマシンにパスワードを使用することもできます。
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
私は最近、この同じ問題に直面し、crossfit_and_beer'sを見つけました 答え 紛らわしい。
これを達成するためのサポートされている方法は、使用することです env.sudo_prefix
, 、によって文書化されています このgithubコミット (から このPR)
私の使用例:
env.sudo_prefix = 'sudo '