これはあなたの質問に対する最も直接的な答えです:あなたは実際には問題を抱えていません。Fabric run()とsudo()がどのように機能するかを誤解しています。
あなたの「回避策」は回避策ではなく、問題に対する100%有効な答えです。
簡単なルールのセットは次のとおりです。1)プロンプトが表示されない場合は、「run()」を使用します。2)プロンプトが表示される場合は、「sudo()」を使用します。(これは、問題の実行可能ファイルがBashまたはSudoでない場合でも、プロンプトを必要とするすべてまたはほとんどのコマンドに当てはまるはずです)。
これと同じ答えが、「sudo」でコマンドを実行しようとしている人々にも当てはまります。一部のシステムでsudoersに現在のユーザーのパスワードなしの設定がある場合でも、run()の代わりにsudo()を使用すると、プロンプトが表示されます(ファブリックコードにすでにENVパスワードまたはキーが含まれている場合を除く)。
ところで、Fabricの作者は#IRCで私の質問に答えました-あなたの質問と非常によく似ています-。ナイスガイ、彼のファブリックとパラミコの仕事に固執するためのオープンソースの陰のヒーローの一人。
...私のテスト環境では、sudoへの完全なパスワードなしのアクセス権を持つユーザー名が常に1つあります。入力sudo echo hello
してもプロンプトは表示されません。さらに、そのsudoユーザーは「!requiretty」で構成されているため、すべてのコマンドをSSH経由で実行できます(ホスト間のSSHホッピングなど)。つまり、「run()」を使用して「sudosomething」を実行できますが、これはプロンプトなしで実行される別のコマンドです。セキュリティに関する限り、本番ホストをロックダウンするのは誰かの仕事ですが、テストホストはロックダウンしません。(あなたが物事をテストすることを余儀なくされており、自動化できない場合、それは大きな問題です)。