| Index: third_party/pexpect/doc/commonissues.rst
|
| diff --git a/third_party/pexpect/doc/commonissues.rst b/third_party/pexpect/doc/commonissues.rst
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d3aa9d043ce48ab31e279695232190d908797adf
|
| --- /dev/null
|
| +++ b/third_party/pexpect/doc/commonissues.rst
|
| @@ -0,0 +1,101 @@
|
| +Common problems
|
| +===============
|
| +
|
| +Threads
|
| +-------
|
| +
|
| +On Linux (RH 8) you cannot spawn a child from a different thread and pass the
|
| +handle back to a worker thread. The child is successfully spawned but you can't
|
| +interact with it. The only way to make it work is to spawn and interact with the
|
| +child all in the same thread. [Adam Kerrison]
|
| +
|
| +Timing issue with send() and sendline()
|
| +---------------------------------------
|
| +
|
| +This problem has been addressed and should not affect most users.
|
| +
|
| +It is sometimes possible to read an echo of the string sent with
|
| +:meth:`~pexpect.spawn.send` and :meth:`~pexpect.spawn.sendline`. If you call
|
| +:meth:`~pexpect.spawn.send` and then immediately call :meth:`~pexpect.spawn.readline`,
|
| +you may get part of your output echoed back. You may read back what you just
|
| +wrote even if the child application does not explicitly echo it. Timing is
|
| +critical. This could be a security issue when talking to an application that
|
| +asks for a password; otherwise, this does not seem like a big deal. But why do
|
| +TTYs do this?
|
| +
|
| +People usually report this when they are trying to control SSH or some other
|
| +login. For example, if your code looks something like this::
|
| +
|
| + child.expect ('[pP]assword:')
|
| + child.sendline (my_password)
|
| +
|
| +
|
| +1. SSH prints "password:" prompt to the user.
|
| +2. SSH turns off echo on the TTY device.
|
| +3. SSH waits for user to enter a password.
|
| +
|
| +When scripting with Pexpect what can happen is that Pexpect will respond to the
|
| +"password:" prompt before SSH has had time to turn off TTY echo. In other words,
|
| +Pexpect sends the password between steps 1. and 2., so the password gets echoed
|
| +back to the TTY. I would call this an SSH bug.
|
| +
|
| +Pexpect now automatically adds a short delay before sending data to a child
|
| +process. This more closely mimics what happens in the usual human-to-app
|
| +interaction. The delay can be tuned with the ``delaybeforesend`` attribute of the
|
| +spawn class. In general, this fixes the problem for everyone and so this should
|
| +not be an issue for most users. For some applications you might with to turn it
|
| +off::
|
| +
|
| + child = pexpect.spawn ("ssh user@example.com")
|
| + child.delaybeforesend = 0
|
| +
|
| +Truncated output just before child exits
|
| +----------------------------------------
|
| +
|
| +So far I have seen this only on older versions of Apple's MacOS X. If the child
|
| +application quits it may not flush its output buffer. This means that your
|
| +Pexpect application will receive an EOF even though it should have received a
|
| +little more data before the child died. This is not generally a problem when
|
| +talking to interactive child applications. One example where it is a problem is
|
| +when trying to read output from a program like *ls*. You may receive most of the
|
| +directory listing, but the last few lines will get lost before you receive an EOF.
|
| +The reason for this is that *ls* runs; completes its task; and then exits. The
|
| +buffer is not flushed before exit so the last few lines are lost. The following
|
| +example demonstrates the problem::
|
| +
|
| + child = pexpect.spawn('ls -l')
|
| + child.expect(pexpect.EOF)
|
| + print child.before
|
| +
|
| +Controlling SSH on Solaris
|
| +--------------------------
|
| +
|
| +Pexpect does not yet work perfectly on Solaris. One common problem is that SSH
|
| +sometimes will not allow TTY password authentication. For example, you may
|
| +expect SSH to ask you for a password using code like this::
|
| +
|
| + child = pexpect.spawn('ssh user@example.com')
|
| + child.expect('password')
|
| + child.sendline('mypassword')
|
| +
|
| +You may see the following error come back from a spawned child SSH::
|
| +
|
| + Permission denied (publickey,keyboard-interactive).
|
| +
|
| +This means that SSH thinks it can't access the TTY to ask you for your password.
|
| +The only solution I have found is to use public key authentication with SSH.
|
| +This bypasses the need for a password. I'm not happy with this solution. The
|
| +problem is due to poor support for Solaris Pseudo TTYs in the Python Standard
|
| +Library.
|
| +
|
| +child does not receive full input, emits BEL
|
| +--------------------------------------------
|
| +
|
| +You may notice when running for example cat(1) or base64(1), when sending a
|
| +very long input line, that it is not fully received, and the BEL ('\a') may
|
| +be found in output.
|
| +
|
| +By default the child terminal matches the parent, which is often in "canonical
|
| +mode processing". You may wish to disable this mode. The exact limit of a line
|
| +varies by operating system, and details of disabling canonical mode may be
|
| +found in the docstring of :meth:`~pexpect.spawn.send`.
|
|
|