Term::TtyWrite - remote control a terminal via the TIOCSTI ioctl


As root.

  use Term::TtyWrite;

  my $tty = Term::TtyWrite->new("/dev/ttyp1");    # or whatever

  $tty->write("echo hi\n");
  $tty->write_delay("echo hi\n", 250);


Remote control a terminal via the TIOCSTI ioctl(2). This typically requires that the code be run as root, or on Linux that the appropriate capability has been granted.

This module will throw an exception if anything goes awry; use eval or Syntax::Keyword::Try to catch these, if necessary.


new device-path

Constructor; returns an object that the write method may be used on. The new method requires that a path to a device be supplied. These will vary by operating system, and can be listed for a given terminal with the tty(1) command.

write string

Writes the given string to the terminal device specified in the constructor new.

write_delay string, delayms

As write but with a delay of the given number of milliseconds after each character written. The maximum delay possible is around 4294 seconds on account of the usleep(3) call being limited to UINT_MAX; more control is possible by instead wrapping appropriate sleep code around single-character calls to write:

  for my $c (split //, $input_string) {


Reporting Bugs

Please report any bugs or feature requests to bug-term-ttywrite at, or through the web interface at

Patches might best be applied towards:

Known Issues

Untested portability given the use of particular ioctl()s that perlport warns about. The security concerns of running as root. Lack of tests on account of being tricky to test what with the needing root and injecting characters into the terminal thing.

OpenBSD has removed the TIOCSTI ioctl due to security concerns; this module will only work on older releases of OpenBSD.


An implementation in C:

uinput on Linux can fake keyboard input.

If possible, instead wrap the terminal with Expect and control it with that.


thrig - Jeremy Mates (cpan:JMATES) <jmates at>


Copyright (C) 2016,2018 by Jeremy Mates

This program is distributed under the (Revised) BSD License: