un-bufferred un-echoed stdio input

I am using the Angstrom 3.8.13 release that came with my BBB, with either the serial gadget interface or SSH. I have tried lots of “known” methods to read single keypress values from my console but I still am seeing local echoes of the characters until I press the key. I suspect both of these interfaces are buffering before the stream even gets to stdin, so fcntrl(0, F_SETFL, flags | O_NONBLOCK ); has no effect on a subsequent read(0, &keyPress, 1);

Does anybody know of a way to get a single keypress value back from a non-blocking call to getchar(), read(), (or whatever?) when your console is through the serial or SSH interface? Is there an ioctl() function I don’t know about?