CONSPY(1)

πŸ’– CONSPY(1) β€” the virtual console spy tool, bestie edition πŸ’–

okay so <rainbow>conspy</rainbow> is a <pink>virtual console spy tool</pink> and honestly? it's giving secret agent energy. πŸ•΅οΈβ€β™€οΈβœ¨


🌸 NAME 🌸

conspy β€” virtual console spy tool πŸ’…


✨ SYNOPSIS ✨

conspy [ options ] [ console ]

πŸ¦‹ DESCRIPTION πŸ¦‹

So like. Conspy lets you, the user, straight up <hotpink>take control of a Linux virtual console</hotpink>. You can see what's displayed on the console, and your keystrokes get sent to it. It's a whole remote-control situation but for your own machine. iconic behavior fr fr. πŸ‘‘

To exit from conspy, <bold>press the escape key three times in quick succession</bold>. not two. not... a leisurely three over five seconds. three, quick, back to back, like you mean it. πŸ’€


πŸ‘‘ COMMAND LINE πŸ‘‘

  • -g COLSxROWS, --geometry COLSxROWS β€” specify the console size. lowkey conspy can almost always correctly guess the size, so this is only useful when it's out here complaining that it can't. πŸ™ˆ
  • -V, --version β€” print the program's version and dip. bye! ✌️
  • -v, --viewonly β€” don't send keystrokes to the virtual console. you're just watching. pure spectator mode, no touchy. πŸ‘€
  • console β€” if you supply it, console has to be a number in the range 1 .. 63, which maps to the virtual console device /dev/tty1 .. /dev/tty63. if you don't supply it, the currently active virtual console gets opened and tracked. it just follows the vibe wherever it goes. πŸŽ€

😭 LIMITATIONS 😭

okay bestie, here's the part where we keep it real:

  • Conspy will not pass keystrokes to a virtual console whose keyboard is configured to send scan codes. X configures its keyboard like this. so yeah. πŸ™ƒ
  • If the terminal doesn't have at least <bold>64 colours</bold>, no colour will be displayed. tragic. monochrome moment.
  • Conspy ignores the mouse. πŸ­βœ‹
  • Conspy may display some non-ASCII characters incorrectly. it's doing its best. πŸ₯Ί

The kernel reports the console geometry and cursor position using bytes, which limits both to <bold>255 maximum</bold>. Conspy reconstructs the true display size from the truncated header by factoring the buffer length, but if that's ambiguous you must supply --geometry. the cursor position will still be placed incorrectly if it's beyond line 255 or column 255. so, like, be aware. ⚠️

Conspy depends on terminfo and curses working correctly for your terminal, and sometimes they just... don't. Konsole is/was one example of where they don't. typing <kbd>Ctrl</kbd>+<kbd>L</kbd> will redraw the screen, which usually fixes the mess created. it also sends a control-L to the virtual console, of course. obviously. the chaos travels both ways. πŸ’€


πŸ” PERMISSIONS πŸ”

Reading a virtual console requires read access to the corresponding /dev/vcsaX device, which on most distributions is granted via the tty group.

Injecting keystrokes uses the TIOCSTI ioctl, which since Linux 6.2 requires the CAP_SYS_ADMIN capability (controlled by the dev.tty.legacy_tiocsti sysctl, off by default). In practice this means conspy must be run as root, or be granted the capability with e.g.

setcap cap_sys_admin+ep /usr/bin/conspy

Use --viewonly to spy on a console without needing this privilege. so if you just wanna peek and not touch, that's the move. 🫢

bestie note: if you see permission errors, this is why. it's not you, it's the kernel being extra. πŸ’…

πŸ“ FILES πŸ“

  • /dev/ttyX, /dev/vc/X β€” the characters typed are sent to this device. the latter is for devfs. it is only used if the former does not exist. (devfs said "pick me" and it got picked, conditionally.) 🌈
  • /dev/vcsaX, /dev/vcc/aX β€” the display of the virtual console is read from here. the latter is for devfs. it is only used if the former does not exist. same deal, same conditional energy. ✨

πŸ’œ AUTHOR πŸ’œ

Russell Stuart, <russell-conspy@stuart.id.au>. 🫑


k that's the whole page, hope you slayed πŸ’… this was Version 1.17, dated May 2026, and that's the teaaaa πŸŽ€βœ¨ mwah, go spy on a console responsibly bestie πŸ¦‹

πŸ“¦ where this page comes from