Skip to content

Instantly share code, notes, and snippets.

@ethack
Last active April 16, 2024 09:14
Show Gist options
  • Save ethack/110f7f46272447828352768e6cd1c4cb to your computer and use it in GitHub Desktop.
Save ethack/110f7f46272447828352768e6cd1c4cb to your computer and use it in GitHub Desktop.
Scripts that simulate typing the clipboard contents. Useful when pasting is not allowed.
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
#NoTrayIcon ; Hide the tray icon
^+v::Send {Raw}%Clipboard%
#!/bin/bash
xclip -selection clipboard -out | tr \\n \\r | xdotool selectwindow windowfocus type --clearmodifiers --delay 25 --window %@ --file -

It "types" the contents of the clipboard.

Why can't you just paste the contents you ask? Sometimes pasting just doesn't work.

  • One example is in system password fields on OSX.
  • Sometimes you're working in a VM and the clipboard isn't shared.
  • Other times you're working via Remote Desktop and again, the clipboard doesn't work in password boxes such as the system login prompts.
  • Connected via RDP and clipboard sharing is disabled and so is mounting of local drives. If the system doesn't have internet access there's no easy way to get things like payloads or Powershell scripts onto it... until now.

Windows

The Windows version is written in AutoHotKey and easily compiles to an executable. It's a single line script that maps Ctrl-Shift-V to type the clipboard.

^+v::Send {Raw}%Clipboard%

Linux

The following should work on Linux, provided you have xdotool and xclip installed. This version lets you select the window you want to send the keystrokes to.

xclip -selection clipboard -out | tr \\n \\r | xdotool selectwindow windowfocus type --clearmodifiers --delay 25 --window %@ --file -

Explanation of the flags used:

  • xclip -selection clipboard gets the contents of the clipboard.
  • -out writes the text to stdout.
  • tr \\n \\r replaces newlines with carriage returns to ensure they don't get missed in some applications.
  • selectwindow allows you to pick a window to send text to. This means you don't have to have the window active when you run the command.
  • windowfocus focuses the selected window. Most apps I tried would ignore keystroke events if they weren't in focus.
  • --clearmodifiers makes sure that no modifier keys are pressed before typing.
  • --delay 25 was the best balance between speed and not missing keystrokes in the applications I was using. This shouldn't be noticable for short text, but makes a difference with longer text.
  • --window $@ means that keystrokes will only be sent to that window. If you focus a different window the typed keystrokes won't suddenly be sent to your new window.
  • --file - reads from stdin.

The following is a version that just "pastes" immediately to the active window.

xclip -selection clipboard -out | tr \\n \\r | xdotool type --clearmodifiers --delay 25 --file -

I saved this to a script and then mapped the script to a hotkey using Gnome's custom keyboard shortcuts.

OSX

The Mac version is writtern in AppleScript.

tell application "System Events" to keystroke the clipboard as text

The equivalent one-liner from the command line would be:

osascript -e 'tell application "System Events" to keystroke the clipboard as text'

To bind this to a keyboard shortcut you have several options. Sticking with builtin OSX utilities you can follow this guide.

Otherwise, you can use a third party program that lets you set custom hotkeys such as: BetterTouchTool, Keyboard Maestro, or Hammerspoon

Credits:

  • @Indigo744 for the suggestion to use {Raw} in the Windows version
  • @L3vi47h4N for the Linux version
  • @brabster for the --clearmodifiers suggestion in the Linux version
@tatarize
Copy link

OSX is a bit more locked down letting one script modify the actions of another program or whatever.

If without the right permissions:

  1. Click on the Apple menu in the top left corner of the screen and select "System Preferences".
  2. Click on "Security & Privacy".
  3. Select the "Privacy" tab.
  4. Scroll down to "Accessibility" in the left-hand column and click on it.
  5. Click the lock icon in the bottom left corner of the window to make changes.
  6. Enter your administrator password when prompted.
  7. Check the box next to the application you want to allow to control your computer using System Events (in this case, it would be your AppleScript editor or the "Script Editor" application).
  8. If the application you want to allow doesn't appear in the list, click the "+" button at the bottom of the window and select it from the Applications folder.
  9. Once you've made your selection, close the window and the changes should take effect immediately.
    Note that if you're using macOS Catalina or later, you may need to grant full disk access instead of just accessibility access, depending on the specific use case.

Not sure if that's the issue but I was told this was the issue when I asked about my version and mac script. Only the most ancient things seem to allow this without additional permissions.

@mrandreastoth
Copy link

Not a script but a really simple solution under Windows...

https://apps.microsoft.com/detail/9P5R4JK7R8H5?hl=en-us&gl=US

@mrandreastoth
Copy link

The following doesn't play ball with version 2.x of AutoHotKey...

I would suggest you to use

^+v::Send {Raw}%Clipboard%

Otherwise some expression will be interpreted... Like {Enter} to Enter, ^c to CTRL+C... See https://autohotkey.com/docs/commands/Send.htm

@peanutcracker1
Copy link

Is there any way to have this script only take over the ctrl+shift+v for certain window names? I only want it to do this behavior in certain programs. I'm on Windows by the way.

@brz
Copy link

brz commented Apr 11, 2024

The following doesn't play ball with version 2.x of AutoHotKey...

I would suggest you to use

^+v::Send {Raw}%Clipboard%

Otherwise some expression will be interpreted... Like {Enter} to Enter, ^c to CTRL+C... See https://autohotkey.com/docs/commands/Send.htm

The following will work with AHK 2.x:

#Requires AutoHotkey v2.0

^+v::
{
    SendText A_Clipboard
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment