Latest commit

History

26 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

dumb

dumb is a simple tool for emulating a dumb terminal in Linux by stripping out valid control sequences.

What is a dumb terminal?

A smart terminal is a command-line interface that supports rich features such as formatting, color text, and cursor repositioning. All modern command-lines use terminal emulators which are smart. By contrast, a dumb terminal is only able to print simple ASCII characters, nothing else. Smart terminals work by adding non-printable control characters and escape sequences which are embedded within the output to control those extra features.

dumb strips off all of the valid control characters and escape sequences it finds, producing simple output fit for a dumb terminal.

Wait a minute, can't I just use a quick (perl|python|sed) one-liner to do this?

Probably, but I've never seen anyone get it right. When considering a regex one-liner for this particular task, keep in mind:

  • It's probably more complex than most people will want to remember.
  • It probably won't match everything.
  • It probably will match some stuff that it shouldn't.
  • It will be slower than this tool when handling large inputs.

Holy hell, why did you write this in Lex?!

It seemed like it would be fun. Also it's faster, and Lex lends itself to this sort of problem quite well.

Ok, but why did you need to write this at all?

I needed a forensic tool that would strip off known valid control sequences, but leave behind non-valid binary garbage for further analysis. I didn't find any tools that could do that, so I wrote this one.

(Secretly, I'm hoping to turn my nickname of "that dumb Linux guy" into something positive.)

Usage

dumb reads input on stdin and prints the stripped output to stdout. It has no switches and takes no arguments.

Examples

Here is a simple example:

(Sorry, but I've been unable to convince Github's flavor of Markdown to properly display color text.)

empty@monkey:/usr/games$ ls -l --color
total 24
-rwxr-xr-x 1 root root 22240 Sep 30 2009 fortune
lrwxrwxrwx 1 root root 25 Mar 6 17:36 nethack -> /etc/alternatives/nethack
lrwxrwxrwx 1 root root 39 Mar 6 17:36 nethack-console -> ../lib/games/nethack/nethack-console.sh
empty@monkey:/usr/games$ ls -l --color | dumb total 24
-rwxr-xr-x 1 root root 22240 Sep 30 2009 fortune
lrwxrwxrwx 1 root root 25 Mar 6 17:36 nethack -> /etc/alternatives/nethack
lrwxrwxrwx 1 root root 39 Mar 6 17:36 nethack-console -> ../lib/games/nethack/nethack-console.sh

Here, we demonstrate the character stripping by piping the output through xxd:

empty@monkey:/usr/games$ ls -l --color | xxd
0000000: 746f 7461 6c20 3234 0a2d 7277 7872 2d78 total 24.-rwxr-x
0000010: 722d 7820 3120 726f 6f74 2072 6f6f 7420 r-x 1 root root 0000020: 3232 3234 3020 5365 7020 3330 2020 3230 22240 Sep 30 20
0000030: 3039 201b 5b30 6d1b 5b30 313b 3332 6d66 09 .[0m.[01;32mf
0000040: 6f72 7475 6e65 1b5b 306d 0a6c 7277 7872 ortune.[0m.lrwxr
0000050: 7778 7277 7820 3120 726f 6f74 2072 6f6f wxrwx 1 root roo
0000060: 7420 2020 2032 3520 4d61 7220 2036 2031 t 25 Mar 6 1
0000070: 373a 3336 201b 5b30 313b 3336 6d6e 6574 7:36 .[01;36mnet
0000080: 6861 636b 1b5b 306d 202d 3e20 1b5b 3031 hack.[0m -> .[01
0000090: 3b33 326d 2f65 7463 2f61 6c74 6572 6e61 ;32m/etc/alterna
00000a0: 7469 7665 732f 6e65 7468 6163 6b1b 5b30 tives/nethack.[0
00000b0: 6d0a 6c72 7778 7277 7872 7778 2031 2072 m.lrwxrwxrwx 1 r
00000c0: 6f6f 7420 726f 6f74 2020 2020 3339 204d oot root 39 M
00000d0: 6172 2020 3620 3137 3a33 3620 1b5b 3031 ar 6 17:36 .[01
00000e0: 3b33 366d 6e65 7468 6163 6b2d 636f 6e73 ;36mnethack-cons
00000f0: 6f6c 651b 5b30 6d20 2d3e 201b 5b30 313b ole.[0m -> .[01;
0000100: 3332 6d2e 2e2f 6c69 622f 6761 6d65 732f 32m../lib/games/
0000110: 6e65 7468 6163 6b2f 6e65 7468 6163 6b2d nethack/nethack-
0000120: 636f 6e73 6f6c 652e 7368 1b5b 306d 0a console.sh.[0m.
empty@monkey:/usr/games$ ls -l --color | dumb | xxd
0000000: 746f 7461 6c20 3234 0a2d 7277 7872 2d78 total 24.-rwxr-x
0000010: 722d 7820 3120 726f 6f74 2072 6f6f 7420 r-x 1 root root 0000020: 3232 3234 3020 5365 7020 3330 2020 3230 22240 Sep 30 20
0000030: 3039 2066 6f72 7475 6e65 0a6c 7277 7872 09 fortune.lrwxr
0000040: 7778 7277 7820 3120 726f 6f74 2072 6f6f wxrwx 1 root roo
0000050: 7420 2020 2032 3520 4d61 7220 2036 2031 t 25 Mar 6 1
0000060: 373a 3336 206e 6574 6861 636b 202d 3e20 7:36 nethack -> 0000070: 2f65 7463 2f61 6c74 6572 6e61 7469 7665 /etc/alternative
0000080: 732f 6e65 7468 6163 6b0a 6c72 7778 7277 s/nethack.lrwxrw
0000090: 7872 7778 2031 2072 6f6f 7420 726f 6f74 xrwx 1 root root
00000a0: 2020 2020 3339 204d 6172 2020 3620 3137 39 Mar 6 17
00000b0: 3a33 3620 6e65 7468 6163 6b2d 636f 6e73 :36 nethack-cons
00000c0: 6f6c 6520 2d3e 202e 2e2f 6c69 622f 6761 ole -> ../lib/ga
00000d0: 6d65 732f 6e65 7468 6163 6b2f 6e65 7468 mes/nethack/neth
00000e0: 6163 6b2d 636f 6e73 6f6c 652e 7368 0a ack-console.sh.

Installation

git clone https://github.com/emptymonkey/dumb.git
cd dumb
make

About

A tool for stripping control characters and escape sequences from terminal output in Linux.

Resources

Stars

11 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

26 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

dumb

dumb is a simple tool for emulating a dumb terminal in Linux by stripping out valid control sequences.

What is a dumb terminal?

A smart terminal is a command-line interface that supports rich features such as formatting, color text, and cursor repositioning. All modern command-lines use terminal emulators which are smart. By contrast, a dumb terminal is only able to print simple ASCII characters, nothing else. Smart terminals work by adding non-printable control characters and escape sequences which are embedded within the output to control those extra features.

dumb strips off all of the valid control characters and escape sequences it finds, producing simple output fit for a dumb terminal.

Wait a minute, can't I just use a quick (perl|python|sed) one-liner to do this?

Probably, but I've never seen anyone get it right. When considering a regex one-liner for this particular task, keep in mind:

  • It's probably more complex than most people will want to remember.
  • It probably won't match everything.
  • It probably will match some stuff that it shouldn't.
  • It will be slower than this tool when handling large inputs.

Holy hell, why did you write this in Lex?!

It seemed like it would be fun. Also it's faster, and Lex lends itself to this sort of problem quite well.

Ok, but why did you need to write this at all?

I needed a forensic tool that would strip off known valid control sequences, but leave behind non-valid binary garbage for further analysis. I didn't find any tools that could do that, so I wrote this one.

(Secretly, I'm hoping to turn my nickname of "that dumb Linux guy" into something positive.)

Usage

dumb reads input on stdin and prints the stripped output to stdout. It has no switches and takes no arguments.

Examples

Here is a simple example:

(Sorry, but I've been unable to convince Github's flavor of Markdown to properly display color text.)

empty@monkey:/usr/games$ ls -l --color
total 24
-rwxr-xr-x 1 root root 22240 Sep 30 2009 fortune
lrwxrwxrwx 1 root root 25 Mar 6 17:36 nethack -> /etc/alternatives/nethack
lrwxrwxrwx 1 root root 39 Mar 6 17:36 nethack-console -> ../lib/games/nethack/nethack-console.sh
empty@monkey:/usr/games$ ls -l --color | dumb total 24
-rwxr-xr-x 1 root root 22240 Sep 30 2009 fortune
lrwxrwxrwx 1 root root 25 Mar 6 17:36 nethack -> /etc/alternatives/nethack
lrwxrwxrwx 1 root root 39 Mar 6 17:36 nethack-console -> ../lib/games/nethack/nethack-console.sh

Here, we demonstrate the character stripping by piping the output through xxd:

empty@monkey:/usr/games$ ls -l --color | xxd
0000000: 746f 7461 6c20 3234 0a2d 7277 7872 2d78 total 24.-rwxr-x
0000010: 722d 7820 3120 726f 6f74 2072 6f6f 7420 r-x 1 root root 0000020: 3232 3234 3020 5365 7020 3330 2020 3230 22240 Sep 30 20
0000030: 3039 201b 5b30 6d1b 5b30 313b 3332 6d66 09 .[0m.[01;32mf
0000040: 6f72 7475 6e65 1b5b 306d 0a6c 7277 7872 ortune.[0m.lrwxr
0000050: 7778 7277 7820 3120 726f 6f74 2072 6f6f wxrwx 1 root roo
0000060: 7420 2020 2032 3520 4d61 7220 2036 2031 t 25 Mar 6 1
0000070: 373a 3336 201b 5b30 313b 3336 6d6e 6574 7:36 .[01;36mnet
0000080: 6861 636b 1b5b 306d 202d 3e20 1b5b 3031 hack.[0m -> .[01
0000090: 3b33 326d 2f65 7463 2f61 6c74 6572 6e61 ;32m/etc/alterna
00000a0: 7469 7665 732f 6e65 7468 6163 6b1b 5b30 tives/nethack.[0
00000b0: 6d0a 6c72 7778 7277 7872 7778 2031 2072 m.lrwxrwxrwx 1 r
00000c0: 6f6f 7420 726f 6f74 2020 2020 3339 204d oot root 39 M
00000d0: 6172 2020 3620 3137 3a33 3620 1b5b 3031 ar 6 17:36 .[01
00000e0: 3b33 366d 6e65 7468 6163 6b2d 636f 6e73 ;36mnethack-cons
00000f0: 6f6c 651b 5b30 6d20 2d3e 201b 5b30 313b ole.[0m -> .[01;
0000100: 3332 6d2e 2e2f 6c69 622f 6761 6d65 732f 32m../lib/games/
0000110: 6e65 7468 6163 6b2f 6e65 7468 6163 6b2d nethack/nethack-
0000120: 636f 6e73 6f6c 652e 7368 1b5b 306d 0a console.sh.[0m.
empty@monkey:/usr/games$ ls -l --color | dumb | xxd
0000000: 746f 7461 6c20 3234 0a2d 7277 7872 2d78 total 24.-rwxr-x
0000010: 722d 7820 3120 726f 6f74 2072 6f6f 7420 r-x 1 root root 0000020: 3232 3234 3020 5365 7020 3330 2020 3230 22240 Sep 30 20
0000030: 3039 2066 6f72 7475 6e65 0a6c 7277 7872 09 fortune.lrwxr
0000040: 7778 7277 7820 3120 726f 6f74 2072 6f6f wxrwx 1 root roo
0000050: 7420 2020 2032 3520 4d61 7220 2036 2031 t 25 Mar 6 1
0000060: 373a 3336 206e 6574 6861 636b 202d 3e20 7:36 nethack -> 0000070: 2f65 7463 2f61 6c74 6572 6e61 7469 7665 /etc/alternative
0000080: 732f 6e65 7468 6163 6b0a 6c72 7778 7277 s/nethack.lrwxrw
0000090: 7872 7778 2031 2072 6f6f 7420 726f 6f74 xrwx 1 root root
00000a0: 2020 2020 3339 204d 6172 2020 3620 3137 39 Mar 6 17
00000b0: 3a33 3620 6e65 7468 6163 6b2d 636f 6e73 :36 nethack-cons
00000c0: 6f6c 6520 2d3e 202e 2e2f 6c69 622f 6761 ole -> ../lib/ga
00000d0: 6d65 732f 6e65 7468 6163 6b2f 6e65 7468 mes/nethack/neth
00000e0: 6163 6b2d 636f 6e73 6f6c 652e 7368 0a ack-console.sh.

Installation

git clone https://github.com/emptymonkey/dumb.git
cd dumb
make

About

A tool for stripping control characters and escape sequences from terminal output in Linux.

Resources

Stars

11 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

26 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

dumb

dumb is a simple tool for emulating a dumb terminal in Linux by stripping out valid control sequences.

What is a dumb terminal?

A smart terminal is a command-line interface that supports rich features such as formatting, color text, and cursor repositioning. All modern command-lines use terminal emulators which are smart. By contrast, a dumb terminal is only able to print simple ASCII characters, nothing else. Smart terminals work by adding non-printable control characters and escape sequences which are embedded within the output to control those extra features.

dumb strips off all of the valid control characters and escape sequences it finds, producing simple output fit for a dumb terminal.

Wait a minute, can't I just use a quick (perl|python|sed) one-liner to do this?

Probably, but I've never seen anyone get it right. When considering a regex one-liner for this particular task, keep in mind:

  • It's probably more complex than most people will want to remember.
  • It probably won't match everything.
  • It probably will match some stuff that it shouldn't.
  • It will be slower than this tool when handling large inputs.

Holy hell, why did you write this in Lex?!

It seemed like it would be fun. Also it's faster, and Lex lends itself to this sort of problem quite well.

Ok, but why did you need to write this at all?

I needed a forensic tool that would strip off known valid control sequences, but leave behind non-valid binary garbage for further analysis. I didn't find any tools that could do that, so I wrote this one.

(Secretly, I'm hoping to turn my nickname of "that dumb Linux guy" into something positive.)

Usage

dumb reads input on stdin and prints the stripped output to stdout. It has no switches and takes no arguments.

Examples

Here is a simple example:

(Sorry, but I've been unable to convince Github's flavor of Markdown to properly display color text.)

empty@monkey:/usr/games$ ls -l --color
total 24
-rwxr-xr-x 1 root root 22240 Sep 30 2009 fortune
lrwxrwxrwx 1 root root 25 Mar 6 17:36 nethack -> /etc/alternatives/nethack
lrwxrwxrwx 1 root root 39 Mar 6 17:36 nethack-console -> ../lib/games/nethack/nethack-console.sh
empty@monkey:/usr/games$ ls -l --color | dumb total 24
-rwxr-xr-x 1 root root 22240 Sep 30 2009 fortune
lrwxrwxrwx 1 root root 25 Mar 6 17:36 nethack -> /etc/alternatives/nethack
lrwxrwxrwx 1 root root 39 Mar 6 17:36 nethack-console -> ../lib/games/nethack/nethack-console.sh

Here, we demonstrate the character stripping by piping the output through xxd:

empty@monkey:/usr/games$ ls -l --color | xxd
0000000: 746f 7461 6c20 3234 0a2d 7277 7872 2d78 total 24.-rwxr-x
0000010: 722d 7820 3120 726f 6f74 2072 6f6f 7420 r-x 1 root root 0000020: 3232 3234 3020 5365 7020 3330 2020 3230 22240 Sep 30 20
0000030: 3039 201b 5b30 6d1b 5b30 313b 3332 6d66 09 .[0m.[01;32mf
0000040: 6f72 7475 6e65 1b5b 306d 0a6c 7277 7872 ortune.[0m.lrwxr
0000050: 7778 7277 7820 3120 726f 6f74 2072 6f6f wxrwx 1 root roo
0000060: 7420 2020 2032 3520 4d61 7220 2036 2031 t 25 Mar 6 1
0000070: 373a 3336 201b 5b30 313b 3336 6d6e 6574 7:36 .[01;36mnet
0000080: 6861 636b 1b5b 306d 202d 3e20 1b5b 3031 hack.[0m -> .[01
0000090: 3b33 326d 2f65 7463 2f61 6c74 6572 6e61 ;32m/etc/alterna
00000a0: 7469 7665 732f 6e65 7468 6163 6b1b 5b30 tives/nethack.[0
00000b0: 6d0a 6c72 7778 7277 7872 7778 2031 2072 m.lrwxrwxrwx 1 r
00000c0: 6f6f 7420 726f 6f74 2020 2020 3339 204d oot root 39 M
00000d0: 6172 2020 3620 3137 3a33 3620 1b5b 3031 ar 6 17:36 .[01
00000e0: 3b33 366d 6e65 7468 6163 6b2d 636f 6e73 ;36mnethack-cons
00000f0: 6f6c 651b 5b30 6d20 2d3e 201b 5b30 313b ole.[0m -> .[01;
0000100: 3332 6d2e 2e2f 6c69 622f 6761 6d65 732f 32m../lib/games/
0000110: 6e65 7468 6163 6b2f 6e65 7468 6163 6b2d nethack/nethack-
0000120: 636f 6e73 6f6c 652e 7368 1b5b 306d 0a console.sh.[0m.
empty@monkey:/usr/games$ ls -l --color | dumb | xxd
0000000: 746f 7461 6c20 3234 0a2d 7277 7872 2d78 total 24.-rwxr-x
0000010: 722d 7820 3120 726f 6f74 2072 6f6f 7420 r-x 1 root root 0000020: 3232 3234 3020 5365 7020 3330 2020 3230 22240 Sep 30 20
0000030: 3039 2066 6f72 7475 6e65 0a6c 7277 7872 09 fortune.lrwxr
0000040: 7778 7277 7820 3120 726f 6f74 2072 6f6f wxrwx 1 root roo
0000050: 7420 2020 2032 3520 4d61 7220 2036 2031 t 25 Mar 6 1
0000060: 373a 3336 206e 6574 6861 636b 202d 3e20 7:36 nethack -> 0000070: 2f65 7463 2f61 6c74 6572 6e61 7469 7665 /etc/alternative
0000080: 732f 6e65 7468 6163 6b0a 6c72 7778 7277 s/nethack.lrwxrw
0000090: 7872 7778 2031 2072 6f6f 7420 726f 6f74 xrwx 1 root root
00000a0: 2020 2020 3339 204d 6172 2020 3620 3137 39 Mar 6 17
00000b0: 3a33 3620 6e65 7468 6163 6b2d 636f 6e73 :36 nethack-cons
00000c0: 6f6c 6520 2d3e 202e 2e2f 6c69 622f 6761 ole -> ../lib/ga
00000d0: 6d65 732f 6e65 7468 6163 6b2f 6e65 7468 mes/nethack/neth
00000e0: 6163 6b2d 636f 6e73 6f6c 652e 7368 0a ack-console.sh.

Installation

git clone https://github.com/emptymonkey/dumb.git
cd dumb
make

About

A tool for stripping control characters and escape sequences from terminal output in Linux.

Resources

Stars

11 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

26 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

dumb

dumb is a simple tool for emulating a dumb terminal in Linux by stripping out valid control sequences.

What is a dumb terminal?

A smart terminal is a command-line interface that supports rich features such as formatting, color text, and cursor repositioning. All modern command-lines use terminal emulators which are smart. By contrast, a dumb terminal is only able to print simple ASCII characters, nothing else. Smart terminals work by adding non-printable control characters and escape sequences which are embedded within the output to control those extra features.

dumb strips off all of the valid control characters and escape sequences it finds, producing simple output fit for a dumb terminal.

Wait a minute, can't I just use a quick (perl|python|sed) one-liner to do this?

Probably, but I've never seen anyone get it right. When considering a regex one-liner for this particular task, keep in mind:

  • It's probably more complex than most people will want to remember.
  • It probably won't match everything.
  • It probably will match some stuff that it shouldn't.
  • It will be slower than this tool when handling large inputs.

Holy hell, why did you write this in Lex?!

It seemed like it would be fun. Also it's faster, and Lex lends itself to this sort of problem quite well.

Ok, but why did you need to write this at all?

I needed a forensic tool that would strip off known valid control sequences, but leave behind non-valid binary garbage for further analysis. I didn't find any tools that could do that, so I wrote this one.

(Secretly, I'm hoping to turn my nickname of "that dumb Linux guy" into something positive.)

Usage

dumb reads input on stdin and prints the stripped output to stdout. It has no switches and takes no arguments.

Examples

Here is a simple example:

(Sorry, but I've been unable to convince Github's flavor of Markdown to properly display color text.)

empty@monkey:/usr/games$ ls -l --color
total 24
-rwxr-xr-x 1 root root 22240 Sep 30 2009 fortune
lrwxrwxrwx 1 root root 25 Mar 6 17:36 nethack -> /etc/alternatives/nethack
lrwxrwxrwx 1 root root 39 Mar 6 17:36 nethack-console -> ../lib/games/nethack/nethack-console.sh
empty@monkey:/usr/games$ ls -l --color | dumb total 24
-rwxr-xr-x 1 root root 22240 Sep 30 2009 fortune
lrwxrwxrwx 1 root root 25 Mar 6 17:36 nethack -> /etc/alternatives/nethack
lrwxrwxrwx 1 root root 39 Mar 6 17:36 nethack-console -> ../lib/games/nethack/nethack-console.sh

Here, we demonstrate the character stripping by piping the output through xxd:

empty@monkey:/usr/games$ ls -l --color | xxd
0000000: 746f 7461 6c20 3234 0a2d 7277 7872 2d78 total 24.-rwxr-x
0000010: 722d 7820 3120 726f 6f74 2072 6f6f 7420 r-x 1 root root 0000020: 3232 3234 3020 5365 7020 3330 2020 3230 22240 Sep 30 20
0000030: 3039 201b 5b30 6d1b 5b30 313b 3332 6d66 09 .[0m.[01;32mf
0000040: 6f72 7475 6e65 1b5b 306d 0a6c 7277 7872 ortune.[0m.lrwxr
0000050: 7778 7277 7820 3120 726f 6f74 2072 6f6f wxrwx 1 root roo
0000060: 7420 2020 2032 3520 4d61 7220 2036 2031 t 25 Mar 6 1
0000070: 373a 3336 201b 5b30 313b 3336 6d6e 6574 7:36 .[01;36mnet
0000080: 6861 636b 1b5b 306d 202d 3e20 1b5b 3031 hack.[0m -> .[01
0000090: 3b33 326d 2f65 7463 2f61 6c74 6572 6e61 ;32m/etc/alterna
00000a0: 7469 7665 732f 6e65 7468 6163 6b1b 5b30 tives/nethack.[0
00000b0: 6d0a 6c72 7778 7277 7872 7778 2031 2072 m.lrwxrwxrwx 1 r
00000c0: 6f6f 7420 726f 6f74 2020 2020 3339 204d oot root 39 M
00000d0: 6172 2020 3620 3137 3a33 3620 1b5b 3031 ar 6 17:36 .[01
00000e0: 3b33 366d 6e65 7468 6163 6b2d 636f 6e73 ;36mnethack-cons
00000f0: 6f6c 651b 5b30 6d20 2d3e 201b 5b30 313b ole.[0m -> .[01;
0000100: 3332 6d2e 2e2f 6c69 622f 6761 6d65 732f 32m../lib/games/
0000110: 6e65 7468 6163 6b2f 6e65 7468 6163 6b2d nethack/nethack-
0000120: 636f 6e73 6f6c 652e 7368 1b5b 306d 0a console.sh.[0m.
empty@monkey:/usr/games$ ls -l --color | dumb | xxd
0000000: 746f 7461 6c20 3234 0a2d 7277 7872 2d78 total 24.-rwxr-x
0000010: 722d 7820 3120 726f 6f74 2072 6f6f 7420 r-x 1 root root 0000020: 3232 3234 3020 5365 7020 3330 2020 3230 22240 Sep 30 20
0000030: 3039 2066 6f72 7475 6e65 0a6c 7277 7872 09 fortune.lrwxr
0000040: 7778 7277 7820 3120 726f 6f74 2072 6f6f wxrwx 1 root roo
0000050: 7420 2020 2032 3520 4d61 7220 2036 2031 t 25 Mar 6 1
0000060: 373a 3336 206e 6574 6861 636b 202d 3e20 7:36 nethack -> 0000070: 2f65 7463 2f61 6c74 6572 6e61 7469 7665 /etc/alternative
0000080: 732f 6e65 7468 6163 6b0a 6c72 7778 7277 s/nethack.lrwxrw
0000090: 7872 7778 2031 2072 6f6f 7420 726f 6f74 xrwx 1 root root
00000a0: 2020 2020 3339 204d 6172 2020 3620 3137 39 Mar 6 17
00000b0: 3a33 3620 6e65 7468 6163 6b2d 636f 6e73 :36 nethack-cons
00000c0: 6f6c 6520 2d3e 202e 2e2f 6c69 622f 6761 ole -> ../lib/ga
00000d0: 6d65 732f 6e65 7468 6163 6b2f 6e65 7468 mes/nethack/neth
00000e0: 6163 6b2d 636f 6e73 6f6c 652e 7368 0a ack-console.sh.

Installation

git clone https://github.com/emptymonkey/dumb.git
cd dumb
make

About

A tool for stripping control characters and escape sequences from terminal output in Linux.

Resources

Stars

11 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

26 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

dumb

dumb is a simple tool for emulating a dumb terminal in Linux by stripping out valid control sequences.

What is a dumb terminal?

A smart terminal is a command-line interface that supports rich features such as formatting, color text, and cursor repositioning. All modern command-lines use terminal emulators which are smart. By contrast, a dumb terminal is only able to print simple ASCII characters, nothing else. Smart terminals work by adding non-printable control characters and escape sequences which are embedded within the output to control those extra features.

dumb strips off all of the valid control characters and escape sequences it finds, producing simple output fit for a dumb terminal.

Wait a minute, can't I just use a quick (perl|python|sed) one-liner to do this?

Probably, but I've never seen anyone get it right. When considering a regex one-liner for this particular task, keep in mind:

  • It's probably more complex than most people will want to remember.
  • It probably won't match everything.
  • It probably will match some stuff that it shouldn't.
  • It will be slower than this tool when handling large inputs.

Holy hell, why did you write this in Lex?!

It seemed like it would be fun. Also it's faster, and Lex lends itself to this sort of problem quite well.

Ok, but why did you need to write this at all?

I needed a forensic tool that would strip off known valid control sequences, but leave behind non-valid binary garbage for further analysis. I didn't find any tools that could do that, so I wrote this one.

(Secretly, I'm hoping to turn my nickname of "that dumb Linux guy" into something positive.)

Usage

dumb reads input on stdin and prints the stripped output to stdout. It has no switches and takes no arguments.

Examples

Here is a simple example:

(Sorry, but I've been unable to convince Github's flavor of Markdown to properly display color text.)

empty@monkey:/usr/games$ ls -l --color
total 24
-rwxr-xr-x 1 root root 22240 Sep 30 2009 fortune
lrwxrwxrwx 1 root root 25 Mar 6 17:36 nethack -> /etc/alternatives/nethack
lrwxrwxrwx 1 root root 39 Mar 6 17:36 nethack-console -> ../lib/games/nethack/nethack-console.sh
empty@monkey:/usr/games$ ls -l --color | dumb total 24
-rwxr-xr-x 1 root root 22240 Sep 30 2009 fortune
lrwxrwxrwx 1 root root 25 Mar 6 17:36 nethack -> /etc/alternatives/nethack
lrwxrwxrwx 1 root root 39 Mar 6 17:36 nethack-console -> ../lib/games/nethack/nethack-console.sh

Here, we demonstrate the character stripping by piping the output through xxd:

empty@monkey:/usr/games$ ls -l --color | xxd
0000000: 746f 7461 6c20 3234 0a2d 7277 7872 2d78 total 24.-rwxr-x
0000010: 722d 7820 3120 726f 6f74 2072 6f6f 7420 r-x 1 root root 0000020: 3232 3234 3020 5365 7020 3330 2020 3230 22240 Sep 30 20
0000030: 3039 201b 5b30 6d1b 5b30 313b 3332 6d66 09 .[0m.[01;32mf
0000040: 6f72 7475 6e65 1b5b 306d 0a6c 7277 7872 ortune.[0m.lrwxr
0000050: 7778 7277 7820 3120 726f 6f74 2072 6f6f wxrwx 1 root roo
0000060: 7420 2020 2032 3520 4d61 7220 2036 2031 t 25 Mar 6 1
0000070: 373a 3336 201b 5b30 313b 3336 6d6e 6574 7:36 .[01;36mnet
0000080: 6861 636b 1b5b 306d 202d 3e20 1b5b 3031 hack.[0m -> .[01
0000090: 3b33 326d 2f65 7463 2f61 6c74 6572 6e61 ;32m/etc/alterna
00000a0: 7469 7665 732f 6e65 7468 6163 6b1b 5b30 tives/nethack.[0
00000b0: 6d0a 6c72 7778 7277 7872 7778 2031 2072 m.lrwxrwxrwx 1 r
00000c0: 6f6f 7420 726f 6f74 2020 2020 3339 204d oot root 39 M
00000d0: 6172 2020 3620 3137 3a33 3620 1b5b 3031 ar 6 17:36 .[01
00000e0: 3b33 366d 6e65 7468 6163 6b2d 636f 6e73 ;36mnethack-cons
00000f0: 6f6c 651b 5b30 6d20 2d3e 201b 5b30 313b ole.[0m -> .[01;
0000100: 3332 6d2e 2e2f 6c69 622f 6761 6d65 732f 32m../lib/games/
0000110: 6e65 7468 6163 6b2f 6e65 7468 6163 6b2d nethack/nethack-
0000120: 636f 6e73 6f6c 652e 7368 1b5b 306d 0a console.sh.[0m.
empty@monkey:/usr/games$ ls -l --color | dumb | xxd
0000000: 746f 7461 6c20 3234 0a2d 7277 7872 2d78 total 24.-rwxr-x
0000010: 722d 7820 3120 726f 6f74 2072 6f6f 7420 r-x 1 root root 0000020: 3232 3234 3020 5365 7020 3330 2020 3230 22240 Sep 30 20
0000030: 3039 2066 6f72 7475 6e65 0a6c 7277 7872 09 fortune.lrwxr
0000040: 7778 7277 7820 3120 726f 6f74 2072 6f6f wxrwx 1 root roo
0000050: 7420 2020 2032 3520 4d61 7220 2036 2031 t 25 Mar 6 1
0000060: 373a 3336 206e 6574 6861 636b 202d 3e20 7:36 nethack -> 0000070: 2f65 7463 2f61 6c74 6572 6e61 7469 7665 /etc/alternative
0000080: 732f 6e65 7468 6163 6b0a 6c72 7778 7277 s/nethack.lrwxrw
0000090: 7872 7778 2031 2072 6f6f 7420 726f 6f74 xrwx 1 root root
00000a0: 2020 2020 3339 204d 6172 2020 3620 3137 39 Mar 6 17
00000b0: 3a33 3620 6e65 7468 6163 6b2d 636f 6e73 :36 nethack-cons
00000c0: 6f6c 6520 2d3e 202e 2e2f 6c69 622f 6761 ole -> ../lib/ga
00000d0: 6d65 732f 6e65 7468 6163 6b2f 6e65 7468 mes/nethack/neth
00000e0: 6163 6b2d 636f 6e73 6f6c 652e 7368 0a ack-console.sh.

Installation

git clone https://github.com/emptymonkey/dumb.git
cd dumb
make

About

A tool for stripping control characters and escape sequences from terminal output in Linux.

Resources

Stars

11 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

26 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

dumb

dumb is a simple tool for emulating a dumb terminal in Linux by stripping out valid control sequences.

What is a dumb terminal?

A smart terminal is a command-line interface that supports rich features such as formatting, color text, and cursor repositioning. All modern command-lines use terminal emulators which are smart. By contrast, a dumb terminal is only able to print simple ASCII characters, nothing else. Smart terminals work by adding non-printable control characters and escape sequences which are embedded within the output to control those extra features.

dumb strips off all of the valid control characters and escape sequences it finds, producing simple output fit for a dumb terminal.

Wait a minute, can't I just use a quick (perl|python|sed) one-liner to do this?

Probably, but I've never seen anyone get it right. When considering a regex one-liner for this particular task, keep in mind:

  • It's probably more complex than most people will want to remember.
  • It probably won't match everything.
  • It probably will match some stuff that it shouldn't.
  • It will be slower than this tool when handling large inputs.

Holy hell, why did you write this in Lex?!

It seemed like it would be fun. Also it's faster, and Lex lends itself to this sort of problem quite well.

Ok, but why did you need to write this at all?

I needed a forensic tool that would strip off known valid control sequences, but leave behind non-valid binary garbage for further analysis. I didn't find any tools that could do that, so I wrote this one.

(Secretly, I'm hoping to turn my nickname of "that dumb Linux guy" into something positive.)

Usage

dumb reads input on stdin and prints the stripped output to stdout. It has no switches and takes no arguments.

Examples

Here is a simple example:

(Sorry, but I've been unable to convince Github's flavor of Markdown to properly display color text.)

empty@monkey:/usr/games$ ls -l --color
total 24
-rwxr-xr-x 1 root root 22240 Sep 30 2009 fortune
lrwxrwxrwx 1 root root 25 Mar 6 17:36 nethack -> /etc/alternatives/nethack
lrwxrwxrwx 1 root root 39 Mar 6 17:36 nethack-console -> ../lib/games/nethack/nethack-console.sh
empty@monkey:/usr/games$ ls -l --color | dumb total 24
-rwxr-xr-x 1 root root 22240 Sep 30 2009 fortune
lrwxrwxrwx 1 root root 25 Mar 6 17:36 nethack -> /etc/alternatives/nethack
lrwxrwxrwx 1 root root 39 Mar 6 17:36 nethack-console -> ../lib/games/nethack/nethack-console.sh

Here, we demonstrate the character stripping by piping the output through xxd:

empty@monkey:/usr/games$ ls -l --color | xxd
0000000: 746f 7461 6c20 3234 0a2d 7277 7872 2d78 total 24.-rwxr-x
0000010: 722d 7820 3120 726f 6f74 2072 6f6f 7420 r-x 1 root root 0000020: 3232 3234 3020 5365 7020 3330 2020 3230 22240 Sep 30 20
0000030: 3039 201b 5b30 6d1b 5b30 313b 3332 6d66 09 .[0m.[01;32mf
0000040: 6f72 7475 6e65 1b5b 306d 0a6c 7277 7872 ortune.[0m.lrwxr
0000050: 7778 7277 7820 3120 726f 6f74 2072 6f6f wxrwx 1 root roo
0000060: 7420 2020 2032 3520 4d61 7220 2036 2031 t 25 Mar 6 1
0000070: 373a 3336 201b 5b30 313b 3336 6d6e 6574 7:36 .[01;36mnet
0000080: 6861 636b 1b5b 306d 202d 3e20 1b5b 3031 hack.[0m -> .[01
0000090: 3b33 326d 2f65 7463 2f61 6c74 6572 6e61 ;32m/etc/alterna
00000a0: 7469 7665 732f 6e65 7468 6163 6b1b 5b30 tives/nethack.[0
00000b0: 6d0a 6c72 7778 7277 7872 7778 2031 2072 m.lrwxrwxrwx 1 r
00000c0: 6f6f 7420 726f 6f74 2020 2020 3339 204d oot root 39 M
00000d0: 6172 2020 3620 3137 3a33 3620 1b5b 3031 ar 6 17:36 .[01
00000e0: 3b33 366d 6e65 7468 6163 6b2d 636f 6e73 ;36mnethack-cons
00000f0: 6f6c 651b 5b30 6d20 2d3e 201b 5b30 313b ole.[0m -> .[01;
0000100: 3332 6d2e 2e2f 6c69 622f 6761 6d65 732f 32m../lib/games/
0000110: 6e65 7468 6163 6b2f 6e65 7468 6163 6b2d nethack/nethack-
0000120: 636f 6e73 6f6c 652e 7368 1b5b 306d 0a console.sh.[0m.
empty@monkey:/usr/games$ ls -l --color | dumb | xxd
0000000: 746f 7461 6c20 3234 0a2d 7277 7872 2d78 total 24.-rwxr-x
0000010: 722d 7820 3120 726f 6f74 2072 6f6f 7420 r-x 1 root root 0000020: 3232 3234 3020 5365 7020 3330 2020 3230 22240 Sep 30 20
0000030: 3039 2066 6f72 7475 6e65 0a6c 7277 7872 09 fortune.lrwxr
0000040: 7778 7277 7820 3120 726f 6f74 2072 6f6f wxrwx 1 root roo
0000050: 7420 2020 2032 3520 4d61 7220 2036 2031 t 25 Mar 6 1
0000060: 373a 3336 206e 6574 6861 636b 202d 3e20 7:36 nethack -> 0000070: 2f65 7463 2f61 6c74 6572 6e61 7469 7665 /etc/alternative
0000080: 732f 6e65 7468 6163 6b0a 6c72 7778 7277 s/nethack.lrwxrw
0000090: 7872 7778 2031 2072 6f6f 7420 726f 6f74 xrwx 1 root root
00000a0: 2020 2020 3339 204d 6172 2020 3620 3137 39 Mar 6 17
00000b0: 3a33 3620 6e65 7468 6163 6b2d 636f 6e73 :36 nethack-cons
00000c0: 6f6c 6520 2d3e 202e 2e2f 6c69 622f 6761 ole -> ../lib/ga
00000d0: 6d65 732f 6e65 7468 6163 6b2f 6e65 7468 mes/nethack/neth
00000e0: 6163 6b2d 636f 6e73 6f6c 652e 7368 0a ack-console.sh.

Installation

git clone https://github.com/emptymonkey/dumb.git
cd dumb
make

About

A tool for stripping control characters and escape sequences from terminal output in Linux.

Resources

Stars

11 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

26 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

dumb

dumb is a simple tool for emulating a dumb terminal in Linux by stripping out valid control sequences.

What is a dumb terminal?

A smart terminal is a command-line interface that supports rich features such as formatting, color text, and cursor repositioning. All modern command-lines use terminal emulators which are smart. By contrast, a dumb terminal is only able to print simple ASCII characters, nothing else. Smart terminals work by adding non-printable control characters and escape sequences which are embedded within the output to control those extra features.

dumb strips off all of the valid control characters and escape sequences it finds, producing simple output fit for a dumb terminal.

Wait a minute, can't I just use a quick (perl|python|sed) one-liner to do this?

Probably, but I've never seen anyone get it right. When considering a regex one-liner for this particular task, keep in mind:

  • It's probably more complex than most people will want to remember.
  • It probably won't match everything.
  • It probably will match some stuff that it shouldn't.
  • It will be slower than this tool when handling large inputs.

Holy hell, why did you write this in Lex?!

It seemed like it would be fun. Also it's faster, and Lex lends itself to this sort of problem quite well.

Ok, but why did you need to write this at all?

I needed a forensic tool that would strip off known valid control sequences, but leave behind non-valid binary garbage for further analysis. I didn't find any tools that could do that, so I wrote this one.

(Secretly, I'm hoping to turn my nickname of "that dumb Linux guy" into something positive.)

Usage

dumb reads input on stdin and prints the stripped output to stdout. It has no switches and takes no arguments.

Examples

Here is a simple example:

(Sorry, but I've been unable to convince Github's flavor of Markdown to properly display color text.)

empty@monkey:/usr/games$ ls -l --color
total 24
-rwxr-xr-x 1 root root 22240 Sep 30 2009 fortune
lrwxrwxrwx 1 root root 25 Mar 6 17:36 nethack -> /etc/alternatives/nethack
lrwxrwxrwx 1 root root 39 Mar 6 17:36 nethack-console -> ../lib/games/nethack/nethack-console.sh
empty@monkey:/usr/games$ ls -l --color | dumb total 24
-rwxr-xr-x 1 root root 22240 Sep 30 2009 fortune
lrwxrwxrwx 1 root root 25 Mar 6 17:36 nethack -> /etc/alternatives/nethack
lrwxrwxrwx 1 root root 39 Mar 6 17:36 nethack-console -> ../lib/games/nethack/nethack-console.sh

Here, we demonstrate the character stripping by piping the output through xxd:

empty@monkey:/usr/games$ ls -l --color | xxd
0000000: 746f 7461 6c20 3234 0a2d 7277 7872 2d78 total 24.-rwxr-x
0000010: 722d 7820 3120 726f 6f74 2072 6f6f 7420 r-x 1 root root 0000020: 3232 3234 3020 5365 7020 3330 2020 3230 22240 Sep 30 20
0000030: 3039 201b 5b30 6d1b 5b30 313b 3332 6d66 09 .[0m.[01;32mf
0000040: 6f72 7475 6e65 1b5b 306d 0a6c 7277 7872 ortune.[0m.lrwxr
0000050: 7778 7277 7820 3120 726f 6f74 2072 6f6f wxrwx 1 root roo
0000060: 7420 2020 2032 3520 4d61 7220 2036 2031 t 25 Mar 6 1
0000070: 373a 3336 201b 5b30 313b 3336 6d6e 6574 7:36 .[01;36mnet
0000080: 6861 636b 1b5b 306d 202d 3e20 1b5b 3031 hack.[0m -> .[01
0000090: 3b33 326d 2f65 7463 2f61 6c74 6572 6e61 ;32m/etc/alterna
00000a0: 7469 7665 732f 6e65 7468 6163 6b1b 5b30 tives/nethack.[0
00000b0: 6d0a 6c72 7778 7277 7872 7778 2031 2072 m.lrwxrwxrwx 1 r
00000c0: 6f6f 7420 726f 6f74 2020 2020 3339 204d oot root 39 M
00000d0: 6172 2020 3620 3137 3a33 3620 1b5b 3031 ar 6 17:36 .[01
00000e0: 3b33 366d 6e65 7468 6163 6b2d 636f 6e73 ;36mnethack-cons
00000f0: 6f6c 651b 5b30 6d20 2d3e 201b 5b30 313b ole.[0m -> .[01;
0000100: 3332 6d2e 2e2f 6c69 622f 6761 6d65 732f 32m../lib/games/
0000110: 6e65 7468 6163 6b2f 6e65 7468 6163 6b2d nethack/nethack-
0000120: 636f 6e73 6f6c 652e 7368 1b5b 306d 0a console.sh.[0m.
empty@monkey:/usr/games$ ls -l --color | dumb | xxd
0000000: 746f 7461 6c20 3234 0a2d 7277 7872 2d78 total 24.-rwxr-x
0000010: 722d 7820 3120 726f 6f74 2072 6f6f 7420 r-x 1 root root 0000020: 3232 3234 3020 5365 7020 3330 2020 3230 22240 Sep 30 20
0000030: 3039 2066 6f72 7475 6e65 0a6c 7277 7872 09 fortune.lrwxr
0000040: 7778 7277 7820 3120 726f 6f74 2072 6f6f wxrwx 1 root roo
0000050: 7420 2020 2032 3520 4d61 7220 2036 2031 t 25 Mar 6 1
0000060: 373a 3336 206e 6574 6861 636b 202d 3e20 7:36 nethack -> 0000070: 2f65 7463 2f61 6c74 6572 6e61 7469 7665 /etc/alternative
0000080: 732f 6e65 7468 6163 6b0a 6c72 7778 7277 s/nethack.lrwxrw
0000090: 7872 7778 2031 2072 6f6f 7420 726f 6f74 xrwx 1 root root
00000a0: 2020 2020 3339 204d 6172 2020 3620 3137 39 Mar 6 17
00000b0: 3a33 3620 6e65 7468 6163 6b2d 636f 6e73 :36 nethack-cons
00000c0: 6f6c 6520 2d3e 202e 2e2f 6c69 622f 6761 ole -> ../lib/ga
00000d0: 6d65 732f 6e65 7468 6163 6b2f 6e65 7468 mes/nethack/neth
00000e0: 6163 6b2d 636f 6e73 6f6c 652e 7368 0a ack-console.sh.

Installation

git clone https://github.com/emptymonkey/dumb.git
cd dumb
make

About

A tool for stripping control characters and escape sequences from terminal output in Linux.

Resources

Stars

11 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

26 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

dumb

dumb is a simple tool for emulating a dumb terminal in Linux by stripping out valid control sequences.

What is a dumb terminal?

A smart terminal is a command-line interface that supports rich features such as formatting, color text, and cursor repositioning. All modern command-lines use terminal emulators which are smart. By contrast, a dumb terminal is only able to print simple ASCII characters, nothing else. Smart terminals work by adding non-printable control characters and escape sequences which are embedded within the output to control those extra features.

dumb strips off all of the valid control characters and escape sequences it finds, producing simple output fit for a dumb terminal.

Wait a minute, can't I just use a quick (perl|python|sed) one-liner to do this?

Probably, but I've never seen anyone get it right. When considering a regex one-liner for this particular task, keep in mind:

  • It's probably more complex than most people will want to remember.
  • It probably won't match everything.
  • It probably will match some stuff that it shouldn't.
  • It will be slower than this tool when handling large inputs.

Holy hell, why did you write this in Lex?!

It seemed like it would be fun. Also it's faster, and Lex lends itself to this sort of problem quite well.

Ok, but why did you need to write this at all?

I needed a forensic tool that would strip off known valid control sequences, but leave behind non-valid binary garbage for further analysis. I didn't find any tools that could do that, so I wrote this one.

(Secretly, I'm hoping to turn my nickname of "that dumb Linux guy" into something positive.)

Usage

dumb reads input on stdin and prints the stripped output to stdout. It has no switches and takes no arguments.

Examples

Here is a simple example:

(Sorry, but I've been unable to convince Github's flavor of Markdown to properly display color text.)

empty@monkey:/usr/games$ ls -l --color
total 24
-rwxr-xr-x 1 root root 22240 Sep 30 2009 fortune
lrwxrwxrwx 1 root root 25 Mar 6 17:36 nethack -> /etc/alternatives/nethack
lrwxrwxrwx 1 root root 39 Mar 6 17:36 nethack-console -> ../lib/games/nethack/nethack-console.sh
empty@monkey:/usr/games$ ls -l --color | dumb total 24
-rwxr-xr-x 1 root root 22240 Sep 30 2009 fortune
lrwxrwxrwx 1 root root 25 Mar 6 17:36 nethack -> /etc/alternatives/nethack
lrwxrwxrwx 1 root root 39 Mar 6 17:36 nethack-console -> ../lib/games/nethack/nethack-console.sh

Here, we demonstrate the character stripping by piping the output through xxd:

empty@monkey:/usr/games$ ls -l --color | xxd
0000000: 746f 7461 6c20 3234 0a2d 7277 7872 2d78 total 24.-rwxr-x
0000010: 722d 7820 3120 726f 6f74 2072 6f6f 7420 r-x 1 root root 0000020: 3232 3234 3020 5365 7020 3330 2020 3230 22240 Sep 30 20
0000030: 3039 201b 5b30 6d1b 5b30 313b 3332 6d66 09 .[0m.[01;32mf
0000040: 6f72 7475 6e65 1b5b 306d 0a6c 7277 7872 ortune.[0m.lrwxr
0000050: 7778 7277 7820 3120 726f 6f74 2072 6f6f wxrwx 1 root roo
0000060: 7420 2020 2032 3520 4d61 7220 2036 2031 t 25 Mar 6 1
0000070: 373a 3336 201b 5b30 313b 3336 6d6e 6574 7:36 .[01;36mnet
0000080: 6861 636b 1b5b 306d 202d 3e20 1b5b 3031 hack.[0m -> .[01
0000090: 3b33 326d 2f65 7463 2f61 6c74 6572 6e61 ;32m/etc/alterna
00000a0: 7469 7665 732f 6e65 7468 6163 6b1b 5b30 tives/nethack.[0
00000b0: 6d0a 6c72 7778 7277 7872 7778 2031 2072 m.lrwxrwxrwx 1 r
00000c0: 6f6f 7420 726f 6f74 2020 2020 3339 204d oot root 39 M
00000d0: 6172 2020 3620 3137 3a33 3620 1b5b 3031 ar 6 17:36 .[01
00000e0: 3b33 366d 6e65 7468 6163 6b2d 636f 6e73 ;36mnethack-cons
00000f0: 6f6c 651b 5b30 6d20 2d3e 201b 5b30 313b ole.[0m -> .[01;
0000100: 3332 6d2e 2e2f 6c69 622f 6761 6d65 732f 32m../lib/games/
0000110: 6e65 7468 6163 6b2f 6e65 7468 6163 6b2d nethack/nethack-
0000120: 636f 6e73 6f6c 652e 7368 1b5b 306d 0a console.sh.[0m.
empty@monkey:/usr/games$ ls -l --color | dumb | xxd
0000000: 746f 7461 6c20 3234 0a2d 7277 7872 2d78 total 24.-rwxr-x
0000010: 722d 7820 3120 726f 6f74 2072 6f6f 7420 r-x 1 root root 0000020: 3232 3234 3020 5365 7020 3330 2020 3230 22240 Sep 30 20
0000030: 3039 2066 6f72 7475 6e65 0a6c 7277 7872 09 fortune.lrwxr
0000040: 7778 7277 7820 3120 726f 6f74 2072 6f6f wxrwx 1 root roo
0000050: 7420 2020 2032 3520 4d61 7220 2036 2031 t 25 Mar 6 1
0000060: 373a 3336 206e 6574 6861 636b 202d 3e20 7:36 nethack -> 0000070: 2f65 7463 2f61 6c74 6572 6e61 7469 7665 /etc/alternative
0000080: 732f 6e65 7468 6163 6b0a 6c72 7778 7277 s/nethack.lrwxrw
0000090: 7872 7778 2031 2072 6f6f 7420 726f 6f74 xrwx 1 root root
00000a0: 2020 2020 3339 204d 6172 2020 3620 3137 39 Mar 6 17
00000b0: 3a33 3620 6e65 7468 6163 6b2d 636f 6e73 :36 nethack-cons
00000c0: 6f6c 6520 2d3e 202e 2e2f 6c69 622f 6761 ole -> ../lib/ga
00000d0: 6d65 732f 6e65 7468 6163 6b2f 6e65 7468 mes/nethack/neth
00000e0: 6163 6b2d 636f 6e73 6f6c 652e 7368 0a ack-console.sh.

Installation

git clone https://github.com/emptymonkey/dumb.git
cd dumb
make

About

A tool for stripping control characters and escape sequences from terminal output in Linux.

Resources

Stars

11 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors