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
pull/23087/head
Toshio Kuratomi 8 years ago
parent 4eba248a8e
commit 6f77498700

@ -253,10 +253,11 @@ class ConnectionBase(with_metaclass(ABCMeta, object)):
if self._play_context.prompt is None: if self._play_context.prompt is None:
return False return False
elif isinstance(self._play_context.prompt, string_types): elif isinstance(self._play_context.prompt, string_types):
b_prompt = to_bytes(self._play_context.prompt) b_prompt = to_bytes(self._play_context.prompt).strip()
return b_prompt in b_output b_lines = b_output.splitlines(True)
else: if not b_lines:
return self._play_context.prompt(b_output) 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): 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])) b_incorrect_password = to_bytes(gettext.dgettext(self._play_context.become_method, C.BECOME_ERROR_STRINGS[self._play_context.become_method]))

Loading…
Cancel
Save