summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorToshio Kuratomi <a.badger@gmail.com>2017-03-29 09:34:33 -0700
committerToshio Kuratomi <a.badger@gmail.com>2017-03-29 12:11:57 -0700
commit4a9c5d9574038b80d199daafc9d1273f8a659831 (patch)
tree6a935cedf5c914b3d1c823575e982d36065430e0
parentc528d8b17d9e19ca4c8128f6fee1f955f4c5b4c2 (diff)
downloadansible-4a9c5d9574038b80d199daafc9d1273f8a659831.tar.gz
Split on newlines when searching for become prompt
The fix for leading junk in sudo output: fee6e29 causes problems with ssh + sudo. On the initial connection using ControlPersist, the output that we scan for the prompt contains both the command we're sending to configure the prompt and the prompt itself. The code in fee6e29 ends up sending the password when it sees the line configuring the prompt which is too early. Switch to a version that splits on lines and then checks whether the first or last line starts with the prompt to decide if it's time to send the password. Fixes #23054 References #20858 (cherry picked from commit 6f77498700a989c6b42f4f4d050d98df1de74f9e)
-rw-r--r--lib/ansible/plugins/connection/__init__.py9
1 files changed, 5 insertions, 4 deletions
diff --git a/lib/ansible/plugins/connection/__init__.py b/lib/ansible/plugins/connection/__init__.py
index 9a606f679b..82a30f11a7 100644
--- a/lib/ansible/plugins/connection/__init__.py
+++ b/lib/ansible/plugins/connection/__init__.py
@@ -255,10 +255,11 @@ class ConnectionBase(with_metaclass(ABCMeta, object)):
if self._play_context.prompt is None:
return False
elif isinstance(self._play_context.prompt, string_types):
- b_prompt = to_bytes(self._play_context.prompt)
- return b_prompt in b_output
- else:
- return self._play_context.prompt(b_output)
+ b_prompt = to_bytes(self._play_context.prompt).strip()
+ b_lines = b_output.splitlines(True)
+ if not b_lines:
+ return False
+ return b_lines[-1].strip().endswith(b_prompt) or b_lines[0].strip().endswith(b_prompt)
def check_incorrect_password(self, b_output):
b_incorrect_password = to_bytes(gettext.dgettext(self._play_context.become_method, C.BECOME_ERROR_STRINGS[self._play_context.become_method]))