Some commands require a PTY to work correctly with exec(). Examples follow:
echo $ssh->exec('passwd');
Stalls. If you use a callback function or setTimeout() you'll see that it's outputting (current) UNIX password:
and waiting for input that can't ever come.
$ssh->enablePTY(); $ssh->exec('passwd'); echo $ssh->read('password:'); $ssh->write("badpw\n"); $ssh->setTimeout(3); echo $ssh->read('password unchanged');
Runs as one might expect. The three second delay is implemented by Linux to protect against brute force attacks (per "man pam_unix").
read() / write():echo $ssh->read('username@username:~$'); $ssh->write("passwd\n"); echo $ssh->read('password:'); $ssh->write("badpw\n"); $ssh->setTimeout(3); echo $ssh->read('password unchanged');
Pretty much the same output as exec() with PTY.
echo $ssh->exec('top');
Outputs TERM environment variable not set.
$ssh->enablePTY(); $ssh->exec('top'); $ssh->setTimeout(5); $ansi->appendString($ssh->read()); echo $ansi->getScreen();
See Interactive Shell: ANSI Codes for the output.
read() / write():$ansi->appendString($ssh->read('username@username:~$')); $ssh->write("top\n"); $ssh->setTimeout(5); $ansi->appendString($ssh->read()); echo $ansi->getScreen();
Pretty much the same output as exec() with PTY.