{"id":15686397,"url":"https://github.com/somajitdey/gibberish","last_synced_at":"2025-10-05T18:32:45.600Z","repository":{"id":163920158,"uuid":"349650704","full_name":"SomajitDey/gibberish","owner":"SomajitDey","description":"Git and Bash Based Encrypted Remote Interactive Shell (GiBBERISh). For when you cannot use SSH.","archived":false,"fork":false,"pushed_at":"2021-04-23T07:50:05.000Z","size":2027,"stargazers_count":12,"open_issues_count":0,"forks_count":3,"subscribers_count":1,"default_branch":"stable","last_synced_at":"2025-02-26T03:41:23.233Z","etag":null,"topics":["bash","bash-scripting","client-server","end-to-end-encryption","file-transfer","git","interactive-shell","remote-access","remote-diagnostic","remote-shell","ssh","teamviewer","vpn"],"latest_commit_sha":null,"homepage":"https://somajitdey.github.io/gibberish/","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/SomajitDey.png","metadata":{"files":{"readme":"README.html","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-03-20T06:53:05.000Z","updated_at":"2024-04-21T04:41:16.000Z","dependencies_parsed_at":null,"dependency_job_id":"72be59c2-cbb6-4cbc-85f5-51f217e17fb2","html_url":"https://github.com/SomajitDey/gibberish","commit_stats":null,"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SomajitDey%2Fgibberish","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SomajitDey%2Fgibberish/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SomajitDey%2Fgibberish/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SomajitDey%2Fgibberish/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SomajitDey","download_url":"https://codeload.github.com/SomajitDey/gibberish/tar.gz/refs/heads/stable","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243007193,"owners_count":20220783,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bash","bash-scripting","client-server","end-to-end-encryption","file-transfer","git","interactive-shell","remote-access","remote-diagnostic","remote-shell","ssh","teamviewer","vpn"],"created_at":"2024-10-03T17:39:29.015Z","updated_at":"2025-10-05T18:32:45.479Z","avatar_url":"https://github.com/SomajitDey.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!doctype html\u003e\n\u003chtml\u003e\n\u003chead\u003e\n\u003cmeta charset='UTF-8'\u003e\u003cmeta name='viewport' content='width=device-width initial-scale=1'\u003e\n\u003ctitle\u003eREADME\u003c/title\u003e\u003clink href='https://fonts.loli.net/css?family=PT+Serif:400,400italic,700,700italic\u0026subset=latin,cyrillic-ext,cyrillic,latin-ext' rel='stylesheet' type='text/css' /\u003e\u003cstyle type='text/css'\u003ehtml {overflow-x: initial !important;}:root { --bg-color:#ffffff; --text-color:#333333; --select-text-bg-color:#B5D6FC; --select-text-font-color:auto; --monospace:\"Lucida Console\",Consolas,\"Courier\",monospace; --title-bar-height:20px; }\n.mac-os-11 { --title-bar-height:28px; }\nhtml { font-size: 14px; background-color: var(--bg-color); color: var(--text-color); font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; }\nbody { margin: 0px; padding: 0px; height: auto; bottom: 0px; top: 0px; left: 0px; right: 0px; font-size: 1rem; line-height: 1.42857; overflow-x: hidden; background: inherit; tab-size: 4; }\niframe { margin: auto; }\na.url { word-break: break-all; }\na:active, a:hover { outline: 0px; }\n.in-text-selection, ::selection { text-shadow: none; background: var(--select-text-bg-color); color: var(--select-text-font-color); }\n#write { margin: 0px auto; height: auto; width: inherit; word-break: normal; overflow-wrap: break-word; position: relative; white-space: normal; overflow-x: visible; padding-top: 36px; }\n#write.first-line-indent p { text-indent: 2em; }\n#write.first-line-indent li p, #write.first-line-indent p * { text-indent: 0px; }\n#write.first-line-indent li { margin-left: 2em; }\n.for-image #write { padding-left: 8px; padding-right: 8px; }\nbody.typora-export { padding-left: 30px; padding-right: 30px; }\n.typora-export .footnote-line, .typora-export li, .typora-export p { white-space: pre-wrap; }\n.typora-export .task-list-item input { pointer-events: none; }\n@media screen and (max-width: 500px) {\n  body.typora-export { padding-left: 0px; padding-right: 0px; }\n  #write { padding-left: 20px; padding-right: 20px; }\n  .CodeMirror-sizer { margin-left: 0px !important; }\n  .CodeMirror-gutters { display: none !important; }\n}\n#write li \u003e figure:last-child { margin-bottom: 0.5rem; }\n#write ol, #write ul { position: relative; }\nimg { max-width: 100%; vertical-align: middle; image-orientation: from-image; }\nbutton, input, select, textarea { color: inherit; font: inherit; }\ninput[type=\"checkbox\"], input[type=\"radio\"] { line-height: normal; padding: 0px; }\n*, ::after, ::before { box-sizing: border-box; }\n#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p, #write pre { width: inherit; }\n#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p { position: relative; }\np { line-height: inherit; }\nh1, h2, h3, h4, h5, h6 { break-after: avoid-page; break-inside: avoid; orphans: 4; }\np { orphans: 4; }\nh1 { font-size: 2rem; }\nh2 { font-size: 1.8rem; }\nh3 { font-size: 1.6rem; }\nh4 { font-size: 1.4rem; }\nh5 { font-size: 1.2rem; }\nh6 { font-size: 1rem; }\n.md-math-block, .md-rawblock, h1, h2, h3, h4, h5, h6, p { margin-top: 1rem; margin-bottom: 1rem; }\n.hidden { display: none; }\n.md-blockmeta { color: rgb(204, 204, 204); font-weight: 700; font-style: italic; }\na { cursor: pointer; }\nsup.md-footnote { padding: 2px 4px; background-color: rgba(238, 238, 238, 0.7); color: rgb(85, 85, 85); border-radius: 4px; cursor: pointer; }\nsup.md-footnote a, sup.md-footnote a:hover { color: inherit; text-transform: inherit; text-decoration: inherit; }\n#write input[type=\"checkbox\"] { cursor: pointer; width: inherit; height: inherit; }\nfigure { overflow-x: auto; margin: 1.2em 0px; max-width: calc(100% + 16px); padding: 0px; }\nfigure \u003e table { margin: 0px; }\ntr { break-inside: avoid; break-after: auto; }\nthead { display: table-header-group; }\ntable { border-collapse: collapse; border-spacing: 0px; width: 100%; overflow: auto; break-inside: auto; text-align: left; }\ntable.md-table td { min-width: 32px; }\n.CodeMirror-gutters { border-right: 0px; background-color: inherit; }\n.CodeMirror-linenumber { user-select: none; }\n.CodeMirror { text-align: left; }\n.CodeMirror-placeholder { opacity: 0.3; }\n.CodeMirror pre { padding: 0px 4px; }\n.CodeMirror-lines { padding: 0px; }\ndiv.hr:focus { cursor: none; }\n#write pre { white-space: pre-wrap; }\n#write.fences-no-line-wrapping pre { white-space: pre; }\n#write pre.ty-contain-cm { white-space: normal; }\n.CodeMirror-gutters { margin-right: 4px; }\n.md-fences { font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; overflow: visible; white-space: pre; background: inherit; position: relative !important; }\n.md-diagram-panel { width: 100%; margin-top: 10px; text-align: center; padding-top: 0px; padding-bottom: 8px; overflow-x: auto; }\n#write .md-fences.mock-cm { white-space: pre-wrap; }\n.md-fences.md-fences-with-lineno { padding-left: 0px; }\n#write.fences-no-line-wrapping .md-fences.mock-cm { white-space: pre; overflow-x: auto; }\n.md-fences.mock-cm.md-fences-with-lineno { padding-left: 8px; }\n.CodeMirror-line, twitterwidget { break-inside: avoid; }\n.footnotes { opacity: 0.8; font-size: 0.9rem; margin-top: 1em; margin-bottom: 1em; }\n.footnotes + .footnotes { margin-top: 0px; }\n.md-reset { margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: top; background: 0px 0px; text-decoration: none; text-shadow: none; float: none; position: static; width: auto; height: auto; white-space: nowrap; cursor: inherit; -webkit-tap-highlight-color: transparent; line-height: normal; font-weight: 400; text-align: left; box-sizing: content-box; direction: ltr; }\nli div { padding-top: 0px; }\nblockquote { margin: 1rem 0px; }\nli .mathjax-block, li p { margin: 0.5rem 0px; }\nli blockquote { margin: 1rem 0px; }\nli { margin: 0px; position: relative; }\nblockquote \u003e :last-child { margin-bottom: 0px; }\nblockquote \u003e :first-child, li \u003e :first-child { margin-top: 0px; }\n.footnotes-area { color: rgb(136, 136, 136); margin-top: 0.714rem; padding-bottom: 0.143rem; white-space: normal; }\n#write .footnote-line { white-space: pre-wrap; }\n@media print {\n  body, html { border: 1px solid transparent; height: 99%; break-after: avoid; break-before: avoid; font-variant-ligatures: no-common-ligatures; }\n  #write { margin-top: 0px; padding-top: 0px; border-color: transparent !important; }\n  .typora-export * { -webkit-print-color-adjust: exact; }\n  .typora-export #write { break-after: avoid; }\n  .typora-export #write::after { height: 0px; }\n  .is-mac table { break-inside: avoid; }\n}\n.footnote-line { margin-top: 0.714em; font-size: 0.7em; }\na img, img a { cursor: pointer; }\npre.md-meta-block { font-size: 0.8rem; min-height: 0.8rem; white-space: pre-wrap; background: rgb(204, 204, 204); display: block; overflow-x: hidden; }\np \u003e .md-image:only-child:not(.md-img-error) img, p \u003e img:only-child { display: block; margin: auto; }\n#write.first-line-indent p \u003e .md-image:only-child:not(.md-img-error) img { left: -2em; position: relative; }\np \u003e .md-image:only-child { display: inline-block; width: 100%; }\n#write .MathJax_Display { margin: 0.8em 0px 0px; }\n.md-math-block { width: 100%; }\n.md-math-block:not(:empty)::after { display: none; }\n.MathJax_ref { fill: currentcolor; }\n[contenteditable=\"true\"]:active, [contenteditable=\"true\"]:focus, [contenteditable=\"false\"]:active, [contenteditable=\"false\"]:focus { outline: 0px; box-shadow: none; }\n.md-task-list-item { position: relative; list-style-type: none; }\n.task-list-item.md-task-list-item { padding-left: 0px; }\n.md-task-list-item \u003e input { position: absolute; top: 0px; left: 0px; margin-left: -1.2em; margin-top: calc(1em - 10px); border: none; }\n.math { font-size: 1rem; }\n.md-toc { min-height: 3.58rem; position: relative; font-size: 0.9rem; border-radius: 10px; }\n.md-toc-content { position: relative; margin-left: 0px; }\n.md-toc-content::after, .md-toc::after { display: none; }\n.md-toc-item { display: block; color: rgb(65, 131, 196); }\n.md-toc-item a { text-decoration: none; }\n.md-toc-inner:hover { text-decoration: underline; }\n.md-toc-inner { display: inline-block; cursor: pointer; }\n.md-toc-h1 .md-toc-inner { margin-left: 0px; font-weight: 700; }\n.md-toc-h2 .md-toc-inner { margin-left: 2em; }\n.md-toc-h3 .md-toc-inner { margin-left: 4em; }\n.md-toc-h4 .md-toc-inner { margin-left: 6em; }\n.md-toc-h5 .md-toc-inner { margin-left: 8em; }\n.md-toc-h6 .md-toc-inner { margin-left: 10em; }\n@media screen and (max-width: 48em) {\n  .md-toc-h3 .md-toc-inner { margin-left: 3.5em; }\n  .md-toc-h4 .md-toc-inner { margin-left: 5em; }\n  .md-toc-h5 .md-toc-inner { margin-left: 6.5em; }\n  .md-toc-h6 .md-toc-inner { margin-left: 8em; }\n}\na.md-toc-inner { font-size: inherit; font-style: inherit; font-weight: inherit; line-height: inherit; }\n.footnote-line a:not(.reversefootnote) { color: inherit; }\n.md-attr { display: none; }\n.md-fn-count::after { content: \".\"; }\ncode, pre, samp, tt { font-family: var(--monospace); }\nkbd { margin: 0px 0.1em; padding: 0.1em 0.6em; font-size: 0.8em; color: rgb(36, 39, 41); background: rgb(255, 255, 255); border: 1px solid rgb(173, 179, 185); border-radius: 3px; box-shadow: rgba(12, 13, 14, 0.2) 0px 1px 0px, rgb(255, 255, 255) 0px 0px 0px 2px inset; white-space: nowrap; vertical-align: middle; }\n.md-comment { color: rgb(162, 127, 3); opacity: 0.8; font-family: var(--monospace); }\ncode { text-align: left; vertical-align: initial; }\na.md-print-anchor { white-space: pre !important; border-width: initial !important; border-style: none !important; border-color: initial !important; display: inline-block !important; position: absolute !important; width: 1px !important; right: 0px !important; outline: 0px !important; background: 0px 0px !important; text-decoration: initial !important; text-shadow: initial !important; }\n.md-inline-math .MathJax_SVG .noError { display: none !important; }\n.html-for-mac .inline-math-svg .MathJax_SVG { vertical-align: 0.2px; }\n.md-math-block .MathJax_SVG_Display { text-align: center; margin: 0px; position: relative; text-indent: 0px; max-width: none; max-height: none; min-height: 0px; min-width: 100%; width: auto; overflow-y: hidden; display: block !important; }\n.MathJax_SVG_Display, .md-inline-math .MathJax_SVG_Display { width: auto; margin: inherit; display: inline-block !important; }\n.MathJax_SVG .MJX-monospace { font-family: var(--monospace); }\n.MathJax_SVG .MJX-sans-serif { font-family: sans-serif; }\n.MathJax_SVG { display: inline; font-style: normal; font-weight: 400; line-height: normal; zoom: 90%; text-indent: 0px; text-align: left; text-transform: none; letter-spacing: normal; word-spacing: normal; overflow-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; }\n.MathJax_SVG * { transition: none 0s ease 0s; }\n.MathJax_SVG_Display svg { vertical-align: middle !important; margin-bottom: 0px !important; margin-top: 0px !important; }\n.os-windows.monocolor-emoji .md-emoji { font-family: \"Segoe UI Symbol\", sans-serif; }\n.md-diagram-panel \u003e svg { max-width: 100%; }\n[lang=\"flow\"] svg, [lang=\"mermaid\"] svg { max-width: 100%; height: auto; }\n[lang=\"mermaid\"] .node text { font-size: 1rem; }\ntable tr th { border-bottom: 0px; }\nvideo { max-width: 100%; display: block; margin: 0px auto; }\niframe { max-width: 100%; width: 100%; border: none; }\n.highlight td, .highlight tr { border: 0px; }\nmark { background: rgb(255, 255, 0); color: rgb(0, 0, 0); }\n.md-html-inline .md-plain, .md-html-inline strong, mark .md-inline-math, mark strong { color: inherit; }\nmark .md-meta { color: rgb(0, 0, 0); opacity: 0.3 !important; }\n@media print {\n  .typora-export h1, .typora-export h2, .typora-export h3, .typora-export h4, .typora-export h5, .typora-export h6 { break-inside: avoid; }\n}\n.md-diagram-panel .messageText { stroke: none !important; }\n.md-diagram-panel .start-state { fill: var(--node-fill); }\n.md-diagram-panel .edgeLabel rect { opacity: 1 !important; }\n.md-require-zoom-fix foreignobject { font-size: var(--mermaid-font-zoom); }\n\n\n.CodeMirror { height: auto; }\n.CodeMirror.cm-s-inner { background: inherit; }\n.CodeMirror-scroll { overflow: auto hidden; z-index: 3; }\n.CodeMirror-gutter-filler, .CodeMirror-scrollbar-filler { background-color: rgb(255, 255, 255); }\n.CodeMirror-gutters { border-right: 1px solid rgb(221, 221, 221); background: inherit; white-space: nowrap; }\n.CodeMirror-linenumber { padding: 0px 3px 0px 5px; text-align: right; color: rgb(153, 153, 153); }\n.cm-s-inner .cm-keyword { color: rgb(119, 0, 136); }\n.cm-s-inner .cm-atom, .cm-s-inner.cm-atom { color: rgb(34, 17, 153); }\n.cm-s-inner .cm-number { color: rgb(17, 102, 68); }\n.cm-s-inner .cm-def { color: rgb(0, 0, 255); }\n.cm-s-inner .cm-variable { color: rgb(0, 0, 0); }\n.cm-s-inner .cm-variable-2 { color: rgb(0, 85, 170); }\n.cm-s-inner .cm-variable-3 { color: rgb(0, 136, 85); }\n.cm-s-inner .cm-string { color: rgb(170, 17, 17); }\n.cm-s-inner .cm-property { color: rgb(0, 0, 0); }\n.cm-s-inner .cm-operator { color: rgb(152, 26, 26); }\n.cm-s-inner .cm-comment, .cm-s-inner.cm-comment { color: rgb(170, 85, 0); }\n.cm-s-inner .cm-string-2 { color: rgb(255, 85, 0); }\n.cm-s-inner .cm-meta { color: rgb(85, 85, 85); }\n.cm-s-inner .cm-qualifier { color: rgb(85, 85, 85); }\n.cm-s-inner .cm-builtin { color: rgb(51, 0, 170); }\n.cm-s-inner .cm-bracket { color: rgb(153, 153, 119); }\n.cm-s-inner .cm-tag { color: rgb(17, 119, 0); }\n.cm-s-inner .cm-attribute { color: rgb(0, 0, 204); }\n.cm-s-inner .cm-header, .cm-s-inner.cm-header { color: rgb(0, 0, 255); }\n.cm-s-inner .cm-quote, .cm-s-inner.cm-quote { color: rgb(0, 153, 0); }\n.cm-s-inner .cm-hr, .cm-s-inner.cm-hr { color: rgb(153, 153, 153); }\n.cm-s-inner .cm-link, .cm-s-inner.cm-link { color: rgb(0, 0, 204); }\n.cm-negative { color: rgb(221, 68, 68); }\n.cm-positive { color: rgb(34, 153, 34); }\n.cm-header, .cm-strong { font-weight: 700; }\n.cm-del { text-decoration: line-through; }\n.cm-em { font-style: italic; }\n.cm-link { text-decoration: underline; }\n.cm-error { color: red; }\n.cm-invalidchar { color: red; }\n.cm-constant { color: rgb(38, 139, 210); }\n.cm-defined { color: rgb(181, 137, 0); }\ndiv.CodeMirror span.CodeMirror-matchingbracket { color: rgb(0, 255, 0); }\ndiv.CodeMirror span.CodeMirror-nonmatchingbracket { color: rgb(255, 34, 34); }\n.cm-s-inner .CodeMirror-activeline-background { background: inherit; }\n.CodeMirror { position: relative; overflow: hidden; }\n.CodeMirror-scroll { height: 100%; outline: 0px; position: relative; box-sizing: content-box; background: inherit; }\n.CodeMirror-sizer { position: relative; }\n.CodeMirror-gutter-filler, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-vscrollbar { position: absolute; z-index: 6; display: none; }\n.CodeMirror-vscrollbar { right: 0px; top: 0px; overflow: hidden; }\n.CodeMirror-hscrollbar { bottom: 0px; left: 0px; overflow: hidden; }\n.CodeMirror-scrollbar-filler { right: 0px; bottom: 0px; }\n.CodeMirror-gutter-filler { left: 0px; bottom: 0px; }\n.CodeMirror-gutters { position: absolute; left: 0px; top: 0px; padding-bottom: 30px; z-index: 3; }\n.CodeMirror-gutter { white-space: normal; height: 100%; box-sizing: content-box; padding-bottom: 30px; margin-bottom: -32px; display: inline-block; }\n.CodeMirror-gutter-wrapper { position: absolute; z-index: 4; background: 0px 0px !important; border: none !important; }\n.CodeMirror-gutter-background { position: absolute; top: 0px; bottom: 0px; z-index: 4; }\n.CodeMirror-gutter-elt { position: absolute; cursor: default; z-index: 4; }\n.CodeMirror-lines { cursor: text; }\n.CodeMirror pre { border-radius: 0px; border-width: 0px; background: 0px 0px; font-family: inherit; font-size: inherit; margin: 0px; white-space: pre; overflow-wrap: normal; color: inherit; z-index: 2; position: relative; overflow: visible; }\n.CodeMirror-wrap pre { overflow-wrap: break-word; white-space: pre-wrap; word-break: normal; }\n.CodeMirror-code pre { border-right: 30px solid transparent; width: fit-content; }\n.CodeMirror-wrap .CodeMirror-code pre { border-right: none; width: auto; }\n.CodeMirror-linebackground { position: absolute; left: 0px; right: 0px; top: 0px; bottom: 0px; z-index: 0; }\n.CodeMirror-linewidget { position: relative; z-index: 2; overflow: auto; }\n.CodeMirror-wrap .CodeMirror-scroll { overflow-x: hidden; }\n.CodeMirror-measure { position: absolute; width: 100%; height: 0px; overflow: hidden; visibility: hidden; }\n.CodeMirror-measure pre { position: static; }\n.CodeMirror div.CodeMirror-cursor { position: absolute; visibility: hidden; border-right: none; width: 0px; }\n.CodeMirror div.CodeMirror-cursor { visibility: hidden; }\n.CodeMirror-focused div.CodeMirror-cursor { visibility: inherit; }\n.cm-searching { background: rgba(255, 255, 0, 0.4); }\n@media print {\n  .CodeMirror div.CodeMirror-cursor { visibility: hidden; }\n}\n\n\n/* meyer reset -- http://meyerweb.com/eric/tools/css/reset/ , v2.0 | 20110126 | License: none (public domain) */\n\n@include-when-export url(https://fonts.loli.net/css?family=PT+Serif:400,400italic,700,700italic\u0026subset=latin,cyrillic-ext,cyrillic,latin-ext);\n\n/* =========== */\n\n/* pt-serif-regular - latin */\n/* pt-serif-italic - latin */\n/* pt-serif-700 - latin */\n/* pt-serif-700italic - latin */\n:root {\n\t--active-file-bg-color: #dadada;\n\t--active-file-bg-color: rgba(32, 43, 51, 0.63);\n\t--active-file-text-color: white;\n\t--bg-color: #f3f2ee;\n\t--text-color: #1f0909;\n\t--control-text-color: #444;\n\t--rawblock-edit-panel-bd: #e5e5e5;\n\n\t--select-text-bg-color: rgba(32, 43, 51, 0.63);\n  --select-text-font-color: white;\n}\n\npre {\n\t--select-text-bg-color: #36284e;\n\t--select-text-font-color: #fff;\n}\n\nhtml {\n\tfont-size: 16px;\n}\n\nhtml, body {\n\tbackground-color: #f3f2ee;\n\tfont-family: \"PT Serif\", 'Times New Roman', Times, serif;\n\tcolor: #1f0909;\n\tline-height: 1.5em;\n}\n\n/*#write {\n\toverflow-x: auto;\n    max-width: initial;\n\tpadding-left: calc(50% - 17em);\n    padding-right: calc(50% - 17em);\n}\n\n@media (max-width: 36em) {\n \t#write {\n \t\tpadding-left: 1em;\n    \tpadding-right: 1em;\n \t}\n}*/\n\n#write {\n\tmax-width: 40em;\n}\n\n@media only screen and (min-width: 1400px) {\n\t#write {\n\t\t\tmax-width: 914px;\n\t}\n}\n\nol li {\n\tlist-style-type: decimal;\n\tlist-style-position: outside;\n}\nul li {\n\tlist-style-type: disc;\n\tlist-style-position: outside;\n}\n\nol,\nul {\n\tlist-style: none;\n}\n\nblockquote,\nq {\n\tquotes: none;\n}\nblockquote:before,\nblockquote:after,\nq:before,\nq:after {\n\tcontent: '';\n\tcontent: none;\n}\ntable {\n\tborder-collapse: collapse;\n\tborder-spacing: 0;\n}\n/* styles */\n\n/* ====== */\n\n/* headings */\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n\tfont-weight: bold;\n}\nh1 {\n\tfont-size: 1.875em;\n\t/*30 / 16*/\n\tline-height: 1.6em;\n\t/* 48 / 30*/\n\tmargin-top: 2em;\n}\nh2,\nh3 {\n\tfont-size: 1.3125em;\n\t/*21 / 16*/\n\tline-height: 1.15;\n\t/*24 / 21*/\n\tmargin-top: 2.285714em;\n\t/*48 / 21*/\n\tmargin-bottom: 1.15em;\n\t/*24 / 21*/\n}\nh3 {\n\tfont-weight: normal;\n}\nh4 {\n\tfont-size: 1.125em;\n\t/*18 / 16*/\n\tmargin-top: 2.67em;\n\t/*48 / 18*/\n}\nh5,\nh6 {\n\tfont-size: 1em;\n\t/*16*/\n}\nh1 {\n\tborder-bottom: 1px solid;\n\tmargin-bottom: 1.875em;\n\tpadding-bottom: 0.8125em;\n}\n/* links */\n\na {\n\ttext-decoration: none;\n\tcolor: #065588;\n}\na:hover,\na:active {\n\ttext-decoration: underline;\n}\n/* block spacing */\n\np,\nblockquote,\n.md-fences {\n\tmargin-bottom: 1.5em;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n\tmargin-bottom: 1.5em;\n}\n/* blockquote */\n\nblockquote {\n\tfont-style: italic;\n\tborder-left: 5px solid;\n\tmargin-left: 2em;\n\tpadding-left: 1em;\n}\n/* lists */\n\nul,\nol {\n\tmargin: 0 0 1.5em 1.5em;\n}\n/* tables */\n.md-meta,.md-before, .md-after {\n\tcolor:#999;\n}\n\ntable {\n\tmargin-bottom: 1.5em;\n\t/*24 / 16*/\n\tfont-size: 1em;\n\t/* width: 100%; */\n}\nthead th,\ntfoot th {\n\tpadding: .25em .25em .25em .4em;\n\ttext-transform: uppercase;\n}\nth {\n\ttext-align: left;\n}\ntd {\n\tvertical-align: top;\n\tpadding: .25em .25em .25em .4em;\n}\n\ncode,\n.md-fences {\n\tbackground-color: #dadada;\n}\n\ncode {\n\tpadding-left: 2px;\n\tpadding-right: 2px;\n}\n\n.md-fences {\n\tmargin-left: 2em;\n\tmargin-bottom: 3em;\n\tpadding-left: 1ch;\n\tpadding-right: 1ch;\n}\n\npre,\ncode,\ntt {\n\tfont-size: .875em;\n\tline-height: 1.714285em;\n}\n/* some fixes */\n\nh1 {\n\tline-height: 1.3em;\n\tfont-weight: normal;\n\tmargin-bottom: 0.5em;\n}\n\np + ul,\np + ol{\n\tmargin-top: .5em;\n}\n\nh3 + ul,\nh4 + ul,\nh5 + ul,\nh6 + ul,\nh3 + ol,\nh4 + ol,\nh5 + ol,\nh6 + ol {\n\tmargin-top: .5em;\n}\n\nli \u003e ul,\nli \u003e ol {\n\tmargin-top: inherit;\n\tmargin-bottom: 0;\n}\n\nli ol\u003eli {\n\tlist-style-type: lower-alpha;\n}\n\nli li ol\u003eli{\n\tlist-style-type: lower-roman;\n}\n\nh2,\nh3 {\n\tmargin-bottom: .75em;\n}\nhr {\n\tborder-top: none;\n\tborder-right: none;\n\tborder-bottom: 1px solid;\n\tborder-left: none;\n}\nh1 {\n\tborder-color: #c5c5c5;\n}\nblockquote {\n\tborder-color: #bababa;\n\tcolor: #656565;\n}\n\nblockquote ul,\nblockquote ol {\n\tmargin-left:0;\n}\n\n.ty-table-edit {\n\tbackground-color: transparent;\n}\nthead {\n\tbackground-color: #dadada;\n}\ntr:nth-child(even) {\n\tbackground: #e8e7e7;\n}\nhr {\n\tborder-color: #c5c5c5;\n}\n.task-list{\n\tpadding-left: 1rem;\n}\n\n.md-task-list-item {\n\tpadding-left: 1.5rem;\n\tlist-style-type: none;\n}\n\n.md-task-list-item \u003e input:before {\n\tcontent: '\\221A';\n\tdisplay: inline-block;\n\twidth: 1.25rem;\n  \theight: 1.6rem;\n\tvertical-align: middle;\n\ttext-align: center;\n\tcolor: #ddd;\n\tbackground-color: #F3F2EE;\n}\n\n.md-task-list-item \u003e input:checked:before,\n.md-task-list-item \u003e input[checked]:before{\n\tcolor: inherit;\n}\n\n#write pre.md-meta-block {\n\tmin-height: 1.875rem;\n\tcolor: #555;\n\tborder: 0px;\n\tbackground: transparent;\n\tmargin-top: -4px;\n\tmargin-left: 1em;\n\tmargin-top: 1em;\n}\n\n.md-image\u003e.md-meta {\n\tcolor: #9B5146;\n}\n\n.md-image\u003e.md-meta{\n\tfont-family: Menlo, 'Ubuntu Mono', Consolas, 'Courier New', 'Microsoft Yahei', 'Hiragino Sans GB', 'WenQuanYi Micro Hei', serif;\n}\n\n\n#write\u003eh3.md-focus:before{\n\tleft: -1.5rem;\n\tcolor:#999;\n\tborder-color:#999;\n}\n#write\u003eh4.md-focus:before{\n\tleft: -1.5rem;\n\ttop: .25rem;\n\tcolor:#999;\n\tborder-color:#999;\n}\n#write\u003eh5.md-focus:before{\n\tleft: -1.5rem;\n\ttop: .0.3125rem;\n\tcolor:#999;\n\tborder-color:#999;\n}\n#write\u003eh6.md-focus:before{\n\tleft: -1.5rem;\n\ttop: 0.3125rem;\n\tcolor:#999;\n\tborder-color:#999;\n}\n\n.md-toc:focus .md-toc-content{\n\tmargin-top: 19px;\n}\n\n.md-toc-content:empty:before{\n\tcolor: #065588;\n}\n.md-toc-item {\n\tcolor: #065588;\n}\n#write div.md-toc-tooltip {\n\tbackground-color: #f3f2ee;\n}\n\n#typora-sidebar {\n\tbackground-color: #f3f2ee;\n\t-webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.375);\n  \tbox-shadow: 0 6px 12px rgba(0, 0, 0, 0.375);\n}\n\n.pin-outline #typora-sidebar {\n\tbackground: inherit;\n\tbox-shadow: none;\n\tborder-right: 1px dashed;\n}\n\n.pin-outline #typora-sidebar:hover .outline-title-wrapper {\n\tborder-left:1px dashed;\n}\n\n.outline-item:hover {\n  background-color: #dadada;\n  border-left: 28px solid #dadada;\n  border-right: 18px solid #dadada;\n}\n\n.typora-node .outline-item:hover {\n  \tborder-right: 28px solid #dadada;\n}\n\n.outline-expander:before {\n  content: \"\\f0da\";\n  font-family: FontAwesome;\n  font-size:14px;\n  top: 1px;\n}\n\n.outline-expander:hover:before,\n.outline-item-open\u003e.outline-item\u003e.outline-expander:before {\n  content: \"\\f0d7\";\n}\n\n.modal-content {\n\tbackground-color: #f3f2ee;\n}\n\n.auto-suggest-container ul li {\n\tlist-style-type: none;\n}\n\n/** UI for electron */\n\n.megamenu-menu,\n#top-titlebar, #top-titlebar *,\n.megamenu-content {\n\tbackground: #f3f2ee;\n\tcolor: #1f0909;\n}\n\n.megamenu-menu-header {\n\tborder-bottom: 1px dashed #202B33;\n}\n\n.megamenu-menu {\n\tbox-shadow: none;\n\tborder-right: 1px dashed;\n}\n\nheader, .context-menu, .megamenu-content, footer {\n\tfont-family: \"PT Serif\", 'Times New Roman', Times, serif;\n    color: #1f0909;\n}\n\n#megamenu-back-btn {\n\tcolor: #1f0909;\n\tborder-color: #1f0909;\n}\n\n.megamenu-menu-header #megamenu-menu-header-title:before {\n\tcolor: #1f0909;\n}\n\n.megamenu-menu-list li a:hover, .megamenu-menu-list li a.active {\n\tcolor: inherit;\n\tbackground-color: #e8e7df;\n}\n\n.long-btn:hover {\n\tbackground-color: #e8e7df;\n}\n\n#recent-file-panel tbody tr:nth-child(2n-1) {\n    background-color: transparent !important;\n}\n\n.megamenu-menu-panel tbody tr:hover td:nth-child(2) {\n    color: inherit;\n}\n\n.megamenu-menu-panel .btn {\n\tbackground-color: #D2D1D1;\n}\n\n.btn-default {\n\tbackground-color: transparent;\n}\n\n.typora-sourceview-on #toggle-sourceview-btn,\n.ty-show-word-count #footer-word-count {\n\tbackground: #c7c5c5;\n}\n\n#typora-quick-open {\n    background-color: inherit;\n}\n\n.md-diagram-panel {\n\tmargin-top: 8px;\n}\n\n.file-list-item-file-name {\n\tfont-weight: initial;\n}\n\n.file-list-item-summary {\n\topacity: 1;\n}\n\n.file-list-item {\n\tcolor: #777;\n}\n\n.file-list-item.active {\n\tbackground-color: inherit;\n\tcolor: black;\n}\n\n.ty-side-sort-btn.active {\n\tbackground-color: inherit;\n}\n\n.file-list-item.active .file-list-item-file-name  {\n\tfont-weight: bold;\n}\n\n.file-list-item{\n    opacity:1 !important;\n}\n\n.file-library-node.active\u003e.file-node-background{\n\tbackground-color: rgba(32, 43, 51, 0.63);\n\tbackground-color: var(--active-file-bg-color);\n}\n\n.file-tree-node.active\u003e.file-node-content{\n\tcolor: white;\n\tcolor: var(--active-file-text-color);\n}\n\n.md-task-list-item\u003einput {\n\tmargin-left: -1.7em;\n\tmargin-top: calc(1rem - 12px);\n}\n\ninput {\n\tborder: 1px solid #aaa;\n}\n\n.megamenu-menu-header #megamenu-menu-header-title,\n.megamenu-menu-header:hover, \n.megamenu-menu-header:focus {\n\tcolor: inherit;\n}\n\n.dropdown-menu .divider {\n\tborder-color: #e5e5e5;\n}\n\n/* https://github.com/typora/typora-issues/issues/2046 */\n.os-windows-7 strong,\n.os-windows-7 strong  {\n\tfont-weight: 760;\n}\n\n.ty-preferences .btn-default {\n\tbackground: transparent;\n}\n\n.ty-preferences .window-header {\n\tborder-bottom: 1px dashed #202B33;\n\tbox-shadow: none;\n}\n\n#sidebar-loading-template, #sidebar-loading-template.file-list-item {\n\tcolor: #777;\n}\n\n.searchpanel-search-option-btn.active {\n\tbackground: #777;\n\tcolor: white;\n}\n\n :root {--mermaid-font-zoom:1.5em ;} \n\u003c/style\u003e\n\u003c/head\u003e\n\u003cbody class='typora-export os-windows'\u003e\n\u003cdiv id='write'  class=''\u003e\u003cp\u003e\u003cimg src=\"https://img.shields.io/badge/TL;DR-Free and secure remote access with NAT \u0026amp; firewall traversal, using Git as backend-blue.svg\" referrerpolicy=\"no-referrer\" alt=\"Generic badge\"\u003e\u003cspan\u003e \u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003ca href='https://doi.org/10.5281/zenodo.4673010'\u003e\u003cimg src=\"https://zenodo.org/badge/DOI/10.5281/zenodo.4673010.svg\" referrerpolicy=\"no-referrer\" alt=\"DOI\"\u003e\u003c/a\u003e\u003cspan\u003e \u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003ca href='https://www.gnu.org/software/bash/'\u003e\u003cimg src=\"https://img.shields.io/badge/Made%20with-Bash-green.svg\" referrerpolicy=\"no-referrer\" alt=\"made-with-bash\"\u003e\u003c/a\u003e\u003cspan\u003e \u003c/span\u003e\u003ca href='https://www.gnu.org/licenses/gpl-3.0'\u003e\u003cimg src=\"https://img.shields.io/badge/License-GPLv3-blue.svg\" referrerpolicy=\"no-referrer\" alt=\"License: GPL v3\"\u003e\u003c/a\u003e\u003cspan\u003e \u003c/span\u003e\u003cimg src=\"https://img.shields.io/badge/Dependency-Git, Bash, cURL-blue.svg\" referrerpolicy=\"no-referrer\" alt=\"Generic badge\"\u003e\u003cspan\u003e \u003c/span\u003e\u003cimg src=\"https://img.shields.io/badge/Tested on-Ubuntu 12.04, 16.04, 20.04 and Debian 10-blue.svg\" referrerpolicy=\"no-referrer\" alt=\"Generic badge\"\u003e\u003cspan\u003e \u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003ca href='https://github.com/SomajitDey/gibberish'\u003e\u003cimg src=\"https://img.shields.io/badge/Repository-SomajitDey/gibberish-blue.svg\" referrerpolicy=\"no-referrer\" alt=\"Generic badge\"\u003e\u003c/a\u003e\u003cspan\u003e \u003c/span\u003e\u003ca href='https://GitHub.com/SomajitDey/gibberish/graphs/commit-activity'\u003e\u003cimg src=\"https://img.shields.io/badge/Maintained%3F-yes-green.svg\" referrerpolicy=\"no-referrer\" alt=\"Maintenance\"\u003e\u003c/a\u003e\u003cspan\u003e \u003c/span\u003e\u003ca href='https://www.researchgate.net/profile/Somajit-Dey'\u003e\u003cimg src=\"https://img.shields.io/badge/maintainer-Somajit Dey-blue\" referrerpolicy=\"no-referrer\" alt=\"Maintaner\"\u003e\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u0026nbsp;\u003c/p\u003e\u003ch1\u003e\u003ca name=\"what-is-gibberish\" class=\"md-header-anchor\"\u003e\u003c/a\u003e\u003cspan\u003eWhat is GiBBERISh\u003c/span\u003e\u003c/h1\u003e\u003cp\u003e\u003cstrong\u003e\u003cspan\u003eGiBBERISh\u003c/span\u003e\u003c/strong\u003e\u003cspan\u003e stands for \u003c/span\u003e\u003cstrong\u003e\u003cem\u003e\u003cspan\u003eGit and Bash Based Encrypted Remote Interactive Shell\u003c/span\u003e\u003c/em\u003e\u003c/strong\u003e\u003cspan\u003e. It is a \u003c/span\u003e\u003cem\u003e\u003cspan\u003efree\u003c/span\u003e\u003c/em\u003e\u003cspan\u003e, \u003c/span\u003e\u003cem\u003e\u003cspan\u003eeasy\u003c/span\u003e\u003c/em\u003e\u003cspan\u003e and \u003c/span\u003e\u003cem\u003e\u003cspan\u003eportable\u003c/span\u003e\u003c/em\u003e\u003cspan\u003e solution to \u003c/span\u003e\u003cem\u003e\u003cspan\u003esecurely\u003c/span\u003e\u003c/em\u003e\u003cspan\u003e access your \u003c/span\u003e\u003cem\u003e\u003cspan\u003eLinux\u003c/span\u003e\u003c/em\u003e\u003cspan\u003e computer from another \u003c/span\u003e\u003cem\u003e\u003cspan\u003eLinux\u003c/span\u003e\u003c/em\u003e\u003cspan\u003e box over the internet, when none of the machines has a public IP address. You can also transfer files to and fro the remote host, with end-to-end encryption.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eGiBBERISh consists of only a short \u003c/span\u003e\u003cem\u003e\u003cspan\u003eBash\u003c/span\u003e\u003c/em\u003e\u003cspan\u003e \u003c/span\u003e\u003cem\u003e\u003cspan\u003escript\u003c/span\u003e\u003c/em\u003e\u003cspan\u003e, to be run on both the hosts (viz. \u003c/span\u003e\u003cem\u003e\u003cspan\u003eclient\u003c/span\u003e\u003c/em\u003e\u003cspan\u003e and \u003c/span\u003e\u003cem\u003e\u003cspan\u003eserver\u003c/span\u003e\u003c/em\u003e\u003cspan\u003e), and an \u003c/span\u003e\u003cem\u003e\u003cspan\u003eonline\u003c/span\u003e\u003c/em\u003e\u003cspan\u003e \u003c/span\u003e\u003cem\u003e\u003cspan\u003eGit\u003c/span\u003e\u003c/em\u003e\u003cspan\u003e \u003c/span\u003e\u003cem\u003e\u003cspan\u003erepository\u003c/span\u003e\u003c/em\u003e\u003cspan\u003e owned and controlled by the user, such as a \u003c/span\u003e\u003cem\u003e\u003cspan\u003efree\u003c/span\u003e\u003c/em\u003e\u003cspan\u003e repository at any of \u003c/span\u003e\u003ca href='https://github.com/'\u003e\u003cspan\u003eGitHub\u003c/span\u003e\u003c/a\u003e\u003cspan\u003e, \u003c/span\u003e\u003ca href='https://gitlab.com/'\u003e\u003cspan\u003eGitLab\u003c/span\u003e\u003c/a\u003e\u003cspan\u003e, \u003c/span\u003e\u003ca href='https://bitbucket.org/'\u003e\u003cspan\u003eBitbucket\u003c/span\u003e\u003c/a\u003e\u003cspan\u003e, \u003c/span\u003e\u003ca href='https://sourceforge.net/'\u003e\u003cspan\u003eSourceForge\u003c/span\u003e\u003c/a\u003e\u003cspan\u003e etc.\u003c/span\u003e\u003c/p\u003e\u003ch1\u003e\u003ca name=\"why-gibberish\" class=\"md-header-anchor\"\u003e\u003c/a\u003e\u003cspan\u003eWhy GiBBERISh\u003c/span\u003e\u003c/h1\u003e\u003cp\u003e\u003cspan\u003eThe standard way to remote access a Linux computer is Secure Shell (SSH). But, in order to connect to the remote host over internet, it has to have a public IP address -- something most personal and work PCs do not have. You can, however, beat this in the following ways:\u003c/span\u003e\u003c/p\u003e\u003col start='' \u003e\u003cli\u003e\u003cspan\u003eSSH port forwarding at a server with public IP/URL (for some free services with a new URL per session see \u003c/span\u003e\u003ca href='https://gist.github.com/SomajitDey/a8ce8af891f753307019f52fd45ca200'\u003e\u003cspan\u003ethis\u003c/span\u003e\u003c/a\u003e\u003cspan\u003e and \u003c/span\u003e\u003ca href='https://gist.github.com/SomajitDey/efd8f449a349bcd918c120f37e67ac00'\u003e\u003cspan\u003ethis\u003c/span\u003e\u003c/a\u003e\u003cspan\u003e)\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003eVirtual Private Network or VPN\u003c/span\u003e\u003c/li\u003e\u003c/ol\u003e\u003cp\u003e\u003cspan\u003eIf you can afford any of the above, then GiBBERISh is not for you. However, if you are like me, who doesn\u0026#39;t want to pay for a VPN or port-forwarding service with static URL, you are probably out of luck with SSH. Also, some corporate firewalls block non-web traffic entirely, hence SSH is not even an option there.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eHowever, you can still manage fine with a freemium remote access app, such as TeamViewer or Anydesk. If you are happily using such Virtual Network Computing (VNC) tools, then too you won\u0026#39;t have any use for GiBBERISh. However, VNC apps have their \u003c/span\u003e\u003ca href='https://www.comparitech.com/vpn/what-is-a-vnc-and-how-does-it-differ-from-a-vpn/#:~:text=phones%2C%20these%20days.-,Cons%20of%20VNC,the%20color%20depth%20to%20use.'\u003e\u003cspan\u003econs\u003c/span\u003e\u003c/a\u003e\u003cspan\u003e. They consume a lot of bandwidth. If you want to access just the shell of your remote host, why would you need to import the entire screen! The remote computer also need to be online all the time. Another common problem is \u003c/span\u003e\u003ca href='https://www.tek-tools.com/itsm/teamviewer-alternatives'\u003e\u003cspan\u003eversion incompatibility\u003c/span\u003e\u003c/a\u003e\u003cspan\u003e. For TeamViewer, for example, every machine needs to have the same version of the app installed on it, or else it won’t work. In addition, being freemium, what they offer for free is limited and you never know how long they would keep offering those free services. To top it all of, you can do nothing but trust these service providers when they say that using their services is completely safe for \u003c/span\u003e\u003ca href='http://www.remoteaccess.org/what-is-a-vnc/#:~:text=Some%20Cons%20in%20Using%20a%20Virtual%20Network%20Computing%20Program\u0026amp;text=Security%20issues%20can%20quickly%20become,possibly%20compromise%20your%20entire%20network.'\u003e\u003cspan\u003eyour systems\u003c/span\u003e\u003c/a\u003e\u003cspan\u003e and \u003c/span\u003e\u003ca href='https://www.bbc.com/news/technology-36459015'\u003e\u003cspan\u003eyour data\u003c/span\u003e\u003c/a\u003e\u003cspan\u003e.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eAnyways, I needed a light-weight, portable, easy-to-install and completely free yet reliable platform to access my remote machine securely over the internet. I didn\u0026#39;t mind the latency, as long as my main purpose of submitting jobs to the remote host was served. Hence, my DIY solution - GiBBERISh.\u003c/span\u003e\u003c/p\u003e\u003ch1\u003e\u003ca name=\"how-it-works\" class=\"md-header-anchor\"\u003e\u003c/a\u003e\u003cspan\u003eHow it works\u003c/span\u003e\u003c/h1\u003e\u003cp\u003e\u003cem\u003e\u003cspan\u003eAn interactive shell is nothing but the user chatting with the operating system (OS), occasionally poking the OS with interrupts or job-control signals\u003c/span\u003e\u003c/em\u003e\u003cspan\u003e. For GiBBERISh, the user\u0026#39;s local machine is the \u003c/span\u003e\u003cstrong\u003e\u003cspan\u003eclient\u003c/span\u003e\u003c/strong\u003e\u003cspan\u003e, and the OS in the remote host is the \u003c/span\u003e\u003cstrong\u003e\u003cspan\u003eserver\u003c/span\u003e\u003c/strong\u003e\u003cspan\u003e. Correspondence between the two is managed by an automated \u003c/span\u003e\u003cem\u003e\u003cspan\u003eGit\u003c/span\u003e\u003c/em\u003e\u003cspan\u003e workflow.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cem\u003e\u003ca href='https://git-scm.com/book/en/v2'\u003e\u003cspan\u003eGit\u003c/span\u003e\u003c/a\u003e\u003c/em\u003e\u003cspan\u003e, if you don\u0026#39;t know about it already, is a widely-used, fast, lightweight, distributed version-control system or content-tracker. Because it is distributed, widely available, and easy to use, you can use it to synchronize two machines quite easily. If you \u003c/span\u003e\u003cem\u003e\u003cspan\u003epush commits\u003c/span\u003e\u003c/em\u003e\u003cspan\u003e (i.e. make some changes) to a Git \u003c/span\u003e\u003cem\u003e\u003cspan\u003erepository\u003c/span\u003e\u003c/em\u003e\u003cspan\u003e (i.e. a directory with \u003c/span\u003e\u003cem\u003e\u003cspan\u003ehistory\u003c/span\u003e\u003c/em\u003e\u003cspan\u003e) in one machine, you can synchronize or update its \u003c/span\u003e\u003cem\u003e\u003cspan\u003eclone\u003c/span\u003e\u003c/em\u003e\u003cspan\u003e in another machine simply by \u003c/span\u003e\u003cem\u003e\u003cspan\u003efetching\u003c/span\u003e\u003c/em\u003e\u003cspan\u003e those new commits from the former repository (called \u003c/span\u003e\u003cem\u003e\u003cspan\u003eupstream\u003c/span\u003e\u003c/em\u003e\u003cspan\u003e in Git-speak).\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eGit can connect two machines over the internet for push/fetch only if at least one of them has a public IP address or URL. However, one can have a free, if not private, online Git repository with a public URL hosted in any of the popular Git-servers, such as \u003c/span\u003e\u003ca href='https://github.com/'\u003e\u003cspan\u003eGitHub\u003c/span\u003e\u003c/a\u003e\u003cspan\u003e, \u003c/span\u003e\u003ca href='https://gitlab.com/'\u003e\u003cspan\u003eGitLab\u003c/span\u003e\u003c/a\u003e\u003cspan\u003e, \u003c/span\u003e\u003ca href='https://bitbucket.org/'\u003e\u003cspan\u003eBitbucket\u003c/span\u003e\u003c/a\u003e\u003cspan\u003e or \u003c/span\u003e\u003ca href='https://sourceforge.net/'\u003e\u003cspan\u003eSourceForge\u003c/span\u003e\u003c/a\u003e\u003cspan\u003e. Although anyone can view (and fetch) the contents of your online repository, you remain in control of who can make changes to your repository. This is because all push access is protected by your password or an access-token generated by you.\u003c/span\u003e\u003c/p\u003e\u003ch4\u003e\u003ca name=\"how-gibberish-connects-two-hosts-client-and-server-over-the-internet-without-any-of-them-having-a-public-ip-address\" class=\"md-header-anchor\"\u003e\u003c/a\u003e\u003cspan\u003eHow GiBBERISh connects two hosts (client and server) over the internet without any of them having a public IP address \u003c/span\u003e\u003c/h4\u003e\u003cp\u003e\u003cspan\u003eWhenever the user enters a command at client, the GiBBERISh script encrypts it with your Git credentials  using a state-of-the-art, yet free, cryptography service called GNU Privacy Guard (GPG). It then commits this encrypted text to the user\u0026#39;s local repository and pushes the same to the user\u0026#39;s upstream repository (say, at GitHub). Server\u0026#39;s script then fetches this commit from upstream, decrypts and pipes the user\u0026#39;s command to an interactive Bash. The output emitted by Bash is again encrypted, committed and pushed to GitHub, which the client fetches, decrypts and shows to the user. ( For an original implementation of a similar Git-based chat, see \u003c/span\u003e\u003ca href='https://github.com/ephigabay/GIC' target='_blank' class='url'\u003ehttps://github.com/ephigabay/GIC\u003c/a\u003e\u003cspan\u003e ).\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e\u003cspan\u003eNote\u003c/span\u003e\u003c/strong\u003e\u003cspan\u003e: Because only encrypted text goes to GitHub, the public cannot see what commands the user is running, or their outputs.\u003c/span\u003e\u003c/p\u003e\u003ch1\u003e\u003ca name=\"latency\" class=\"md-header-anchor\"\u003e\u003c/a\u003e\u003cspan\u003eLatency:\u003c/span\u003e\u003c/h1\u003e\u003cp\u003e\u003cspan\u003eBecause of the dependence on an online Git repository, the time between entering a command and getting its output back is not insignificant. This is because \u003c/span\u003e\u003ccode\u003egit-push\u003c/code\u003e\u003cspan\u003e is slow. From multiple measurements with upstream at GitHub, I found the latency varies between 6 to 9 seconds. However, using GitHub\u0026#39;s REST API, the \u003c/span\u003e\u003ccode\u003egit-push\u003c/code\u003e\u003cspan\u003e can be avoided and \u003c/span\u003e\u003ca href='https://gist.github.com/SomajitDey/3a438669bd00bdf3b80e4471c2c41a98'\u003e\u003cspan\u003eperformance improved\u003c/span\u003e\u003c/a\u003e\u003cspan\u003e. When using the API, the latency decreases to 3-4 seconds.\u003c/span\u003e\u003c/p\u003e\u003ch1\u003e\u003ca name=\"features\" class=\"md-header-anchor\"\u003e\u003c/a\u003e\u003cspan\u003eFeatures:\u003c/span\u003e\u003c/h1\u003e\u003col start='' \u003e\u003cli\u003e\u003cspan\u003eDoesn\u0026#39;t require a public IP address. Both machines can be behind multiple NATs.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003eDoesn\u0026#39;t care about firewalls and blocked ports.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003eSecure (everything public is encrypted with your password / access-token).\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003eInteractive. Unlike SSH, however, the raw user input is not streamed to server. The user can type, edit, erase as many times as necessary, with zero-lag, before pressing the \u003c/span\u003e\u003ccode\u003eEnter\u003c/code\u003e\u003cspan\u003e key.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003eSecure (encryption using AES256) file transfer from client to server and vice-versa.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003eEasy and fast switching between local and remote environments without interrupting the remote session in any way. See \u003c/span\u003e\u003cem\u003e\u003cspan\u003ebrb\u003c/span\u003e\u003c/em\u003e\u003cspan\u003e in the \u003c/span\u003e\u003cem\u003e\u003cspan\u003eKeywords\u003c/span\u003e\u003c/em\u003e\u003cspan\u003e section below.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003eRelays user\u0026#39;s keyboard-generated signals, such as Ctrl-c; Ctrl-z to server.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003eMonitorability and overrides: If you grant someone else access to your local machine, for remote diagnostics for example, you can see all the commands she is executing from your terminal. You can also override those executions with Ctrl-c, Ctrl-z, Ctrl-\\ etc., if necessary.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003eForever free. Given the popularity of Git in DevOps, freemium services such as GitHub are here to stay and they probably will continue hosting small public repositories for free for years to come. GiBBERISh is careful about keeping the repository size as small as possible. So, the size limit of the free-tier plans should never be an issue.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003eLightweight: CPU usage is minimal. Polling and busy-waits are avoided wherever possible in favor of event-driven triggers.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003eReliable: If any of your machines goes offline, it automatically gets connected once its internet connection is restored. No data is lost. Just make sure your remote host stays up even when there is power-outage.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003eHassle-free installation, portability and flexibility: GiBBERISh only runs Git, and some basic Unix commands, all from a short, simple, stupid (KISS) Bash script. Most current Linux distributions ship with Git and Bash both. Hence, GiBBERISh should run readily on those. No superuser or admin privilege is required to install or run GiBBERISh. You also hold the perpetual right to adapt the source-code to your needs.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003eEverything is under your control. You are free to modify the single Bash script that GiBBERISh runs from. You own and manage the upstream repository. If you are connecting to your work computer from your home machine or vice versa, you control both the machines. You also choose who can access your machine, should you ever be granting someone else remote access for purposes of diagnostics, instructions etc.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003eBecause Git and Bash are the only main ingredients, GiBBERISh (in an implementation that doesn\u0026#39;t use \u003c/span\u003e\u003ccode\u003eflock\u003c/code\u003e\u003cspan\u003e) maybe run easily on \u003c/span\u003e\u003ca href='https://gitforwindows.org/'\u003e\u003cspan\u003eGit-Bash\u003c/span\u003e\u003c/a\u003e\u003cspan\u003e from the Git for Windows package. However, that might be unnecessary, given that Windows 10 now ships with a subsystem for Linux (\u003c/span\u003e\u003ca href='https://docs.microsoft.com/en-us/windows/wsl/install-win10'\u003e\u003cspan\u003eWSL\u003c/span\u003e\u003c/a\u003e\u003cspan\u003e).\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003eStores command history for the session. Use the Up, Down arrow keys or Ctrl-p and Ctrl-n to access history as usual.\u003c/span\u003e\u003c/li\u003e\u003c/ol\u003e\u003ch1\u003e\u003ca name=\"how-to-install--run\" class=\"md-header-anchor\"\u003e\u003c/a\u003e\u003cspan\u003eHow to install / run\u003c/span\u003e\u003c/h1\u003e\u003cp\u003e\u003cspan\u003eFirst, \u003c/span\u003e\u003ca href='https://docs.github.com/en/github/getting-started-with-github/create-a-repo'\u003e\u003cspan\u003ecreate a dedicated repository\u003c/span\u003e\u003c/a\u003e\u003cspan\u003e at any free Git hosting service such as \u003c/span\u003e\u003ca href='https://github.com/' target='_blank' class='url'\u003ehttps://github.com/\u003c/a\u003e\u003cspan\u003e, \u003c/span\u003e\u003ca href='https://gitlab.com/' target='_blank' class='url'\u003ehttps://gitlab.com/\u003c/a\u003e\u003cspan\u003e, \u003c/span\u003e\u003ca href='https://bitbucket.org/' target='_blank' class='url'\u003ehttps://bitbucket.org/\u003c/a\u003e\u003cspan\u003e or \u003c/span\u003e\u003ca href='https://sourceforge.net/' target='_blank' class='url'\u003ehttps://sourceforge.net/\u003c/a\u003e\u003cspan\u003e. I recommend using GitHub, as GiBBERISh can speed itself up using their content API. The repository can be completely empty, i.e. without any commits. \u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e\u003cspan\u003eTip\u003c/span\u003e\u003c/strong\u003e\u003cspan\u003e: Also \u003c/span\u003e\u003ca href='https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token'\u003e\u003cspan\u003egenerate a personal access-token (PAT)\u003c/span\u003e\u003c/a\u003e\u003cspan\u003e with write-access to your repository. This makes GiBBERISh even more secure.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e\u003cspan\u003eTip:\u003c/span\u003e\u003c/strong\u003e\u003cspan\u003e If you have created the repository at GitHub, then install \u003c/span\u003e\u003ca href='https://stedolan.github.io/jq/download/'\u003e\u003ccode\u003ejq\u003c/code\u003e\u003c/a\u003e\u003cspan\u003e and \u003c/span\u003e\u003ccode\u003ebase64\u003c/code\u003e\u003cspan\u003e to experience the lowest latency (3-4s) with GiBBERISh. However, you can also run GiBBERISh without these, albeit with double latency.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eAt the Linux machine that you want to use as server, run the \u003c/span\u003e\u003cem\u003e\u003cspan\u003einstaller\u003c/span\u003e\u003c/em\u003e\u003cspan\u003e script (no superuser or admin privilege required): \u003c/span\u003e\u003c/p\u003e\u003cpre spellcheck=\"false\" class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"bash\"\u003e\u003cdiv class=\"CodeMirror cm-s-inner CodeMirror-wrap\" lang=\"bash\"\u003e\u003cdiv style=\"overflow: hidden; position: relative; width: 3px; height: 0px; top: 0px; left: 4px;\"\u003e\u003ctextarea autocorrect=\"off\" autocapitalize=\"off\" spellcheck=\"false\" tabindex=\"0\" style=\"position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;\"\u003e\u003c/textarea\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-scrollbar-filler\" cm-not-content=\"true\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-gutter-filler\" cm-not-content=\"true\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-scroll\" tabindex=\"-1\"\u003e\u003cdiv class=\"CodeMirror-sizer\" style=\"margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;\"\u003e\u003cdiv style=\"position: relative; top: 0px;\"\u003e\u003cdiv class=\"CodeMirror-lines\" role=\"presentation\"\u003e\u003cdiv role=\"presentation\" style=\"position: relative; outline: none;\"\u003e\u003cdiv class=\"CodeMirror-measure\"\u003e\u003cpre\u003e\u003cspan\u003exxxxxxxxxx\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-measure\"\u003e\u003c/div\u003e\u003cdiv style=\"position: relative; z-index: 1;\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-code\" role=\"presentation\"\u003e\u003cdiv class=\"CodeMirror-activeline\" style=\"position: relative;\"\u003e\u003cdiv class=\"CodeMirror-activeline-background CodeMirror-linebackground\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-gutter-background CodeMirror-activeline-gutter\" style=\"left: 0px; width: 0px;\"\u003e\u003c/div\u003e\u003cpre class=\" CodeMirror-line \" role=\"presentation\"\u003e\u003cspan role=\"presentation\" style=\"padding-right: 0.1px;\"\u003e./installer\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style=\"position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 25px;\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-gutters\" style=\"display: none; height: 25px;\"\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/pre\u003e\u003cp\u003e\u003cspan\u003eThen, simply follow the on-screen instructions.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eTo start the server, run: \u003c/span\u003e\u003c/p\u003e\u003cpre spellcheck=\"false\" class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"bash\"\u003e\u003cdiv class=\"CodeMirror cm-s-inner CodeMirror-wrap\" lang=\"bash\"\u003e\u003cdiv style=\"overflow: hidden; position: relative; width: 3px; height: 0px; top: 0px; left: 4px;\"\u003e\u003ctextarea autocorrect=\"off\" autocapitalize=\"off\" spellcheck=\"false\" tabindex=\"0\" style=\"position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;\"\u003e\u003c/textarea\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-scrollbar-filler\" cm-not-content=\"true\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-gutter-filler\" cm-not-content=\"true\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-scroll\" tabindex=\"-1\"\u003e\u003cdiv class=\"CodeMirror-sizer\" style=\"margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;\"\u003e\u003cdiv style=\"position: relative; top: 0px;\"\u003e\u003cdiv class=\"CodeMirror-lines\" role=\"presentation\"\u003e\u003cdiv role=\"presentation\" style=\"position: relative; outline: none;\"\u003e\u003cdiv class=\"CodeMirror-measure\"\u003e\u003cpre\u003e\u003cspan\u003exxxxxxxxxx\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-measure\"\u003e\u003c/div\u003e\u003cdiv style=\"position: relative; z-index: 1;\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-code\" role=\"presentation\"\u003e\u003cdiv class=\"CodeMirror-activeline\" style=\"position: relative;\"\u003e\u003cdiv class=\"CodeMirror-activeline-background CodeMirror-linebackground\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-gutter-background CodeMirror-activeline-gutter\" style=\"left: 0px; width: 0px;\"\u003e\u003c/div\u003e\u003cpre class=\" CodeMirror-line \" role=\"presentation\"\u003e\u003cspan role=\"presentation\" style=\"padding-right: 0.1px;\"\u003egibberish-server\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style=\"position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 25px;\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-gutters\" style=\"display: none; height: 25px;\"\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/pre\u003e\u003cp\u003e\u003cspan\u003eAt the client machine, install GiBBERISh similarly as above.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eTo access the remote server, simply run:\u003c/span\u003e\u003c/p\u003e\u003cpre spellcheck=\"false\" class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"bash\"\u003e\u003cdiv class=\"CodeMirror cm-s-inner CodeMirror-wrap\" lang=\"bash\"\u003e\u003cdiv style=\"overflow: hidden; position: relative; width: 3px; height: 0px; top: 0px; left: 4px;\"\u003e\u003ctextarea autocorrect=\"off\" autocapitalize=\"off\" spellcheck=\"false\" tabindex=\"0\" style=\"position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;\"\u003e\u003c/textarea\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-scrollbar-filler\" cm-not-content=\"true\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-gutter-filler\" cm-not-content=\"true\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-scroll\" tabindex=\"-1\"\u003e\u003cdiv class=\"CodeMirror-sizer\" style=\"margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;\"\u003e\u003cdiv style=\"position: relative; top: 0px;\"\u003e\u003cdiv class=\"CodeMirror-lines\" role=\"presentation\"\u003e\u003cdiv role=\"presentation\" style=\"position: relative; outline: none;\"\u003e\u003cdiv class=\"CodeMirror-measure\"\u003e\u003cpre\u003e\u003cspan\u003exxxxxxxxxx\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-measure\"\u003e\u003c/div\u003e\u003cdiv style=\"position: relative; z-index: 1;\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-code\" role=\"presentation\"\u003e\u003cdiv class=\"CodeMirror-activeline\" style=\"position: relative;\"\u003e\u003cdiv class=\"CodeMirror-activeline-background CodeMirror-linebackground\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-gutter-background CodeMirror-activeline-gutter\" style=\"left: 0px; width: 0px;\"\u003e\u003c/div\u003e\u003cpre class=\" CodeMirror-line \" role=\"presentation\"\u003e\u003cspan role=\"presentation\" style=\"padding-right: 0.1px;\"\u003egibberish\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style=\"position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 25px;\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-gutters\" style=\"display: none; height: 25px;\"\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003e\u003cspan\u003eNote\u003c/span\u003e\u003c/strong\u003e\u003cspan\u003e: GiBBERISh allows, possibly unnecessarily, upstream repositories that are on your local disk or NFS.\u003c/span\u003e\u003c/p\u003e\u003ch1\u003e\u003ca name=\"keywords-or-built-in-commands\" class=\"md-header-anchor\"\u003e\u003c/a\u003e\u003cspan\u003eKeywords or built-in commands\u003c/span\u003e\u003c/h1\u003e\u003cp\u003e\u003cspan\u003eGiBBERISh recognizes a few keywords as listed below.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e\u003cspan\u003eping\u003c/span\u003e\u003c/strong\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan\u003e|\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cstrong\u003e\u003cspan\u003ehello\u003c/span\u003e\u003c/strong\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan\u003e|\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cstrong\u003e\u003cspan\u003ehey\u003c/span\u003e\u003c/strong\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan\u003e|\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cstrong\u003e\u003cspan\u003ehi\u003c/span\u003e\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eTo test if the server is still connected. Consider the following situation. You are running a foreground process on the server, which outputs infrequently. Because it is in foreground, you do not have the command prompt and hence cannot execute a short command such as \u003c/span\u003e\u003ca href='https://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html'\u003e\u003ccode\u003eecho\u003c/code\u003e\u003c/a\u003e\u003cspan\u003e to see if the server is still responding. Just enter any of these keywords, and the server will send you a \u0026#39;hello\u0026#39; if it can hear you, without interrupting that foreground process in any way. However, you can also do a simple \u003c/span\u003e\u003ccode\u003eCtrl-\u0026lt;spacebar\u0026gt;\u003c/code\u003e\u003cspan\u003e or \u003c/span\u003e\u003ccode\u003eCtrl-z\u003c/code\u003e\u003cspan\u003e to get back the prompt, at the expense of stopping the foreground process. \u003c/span\u003e\u003cstrong\u003e\u003cspan\u003eNote\u003c/span\u003e\u003c/strong\u003e\u003cspan\u003e: You can use any of these commands anytime, even if a foreground process is running at the server and you do not have a prompt.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e\u003cspan\u003eexit\u003c/span\u003e\u003c/strong\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan\u003e|\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cstrong\u003e\u003cspan\u003equit\u003c/span\u003e\u003c/strong\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan\u003e|\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cstrong\u003e\u003cspan\u003elogout\u003c/span\u003e\u003c/strong\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan\u003e|\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cstrong\u003e\u003cspan\u003ehup\u003c/span\u003e\u003c/strong\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan\u003e|\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cstrong\u003e\u003cspan\u003ebye\u003c/span\u003e\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eTo end the session, and disconnect or hangup. When you do this, the current interactive shell in the server is closed and a new, fresh shell is launched ready for the next session. You therefore, would lose any environment variable you had set or function definitions you had sourced during the last session. Beware that this should also close any process running on the server that the exiting shell sends SIGHUP to, unless the process has a handler installed for HUP. Start processes in background with \u003c/span\u003e\u003ca href='https://man7.org/linux/man-pages/man1/nohup.1.html'\u003e\u003ccode\u003enohup\u003c/code\u003e\u003c/a\u003e\u003cspan\u003e if you intend to keep them running even after you logout using these keywords. \u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e\u003cspan\u003ebrb\u003c/span\u003e\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eBe right back, viz. to quickly switch to your local environment for a short while, without ending or interrupting the remote session. Any foreground process running in the server, keeps running uninterrupted. With this keyword, you simply get back your local command prompt, whenever you need to run commands locally during a remote session. To return to the remote session, just enter \u003c/span\u003e\u003ccode\u003egibberish\u003c/code\u003e\u003cspan\u003e again. You will be shown all the server output since the time you did \u003c/span\u003e\u003ccode\u003ebrb\u003c/code\u003e\u003cspan\u003e, so you miss nothing.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e\u003cspan\u003elocal\u003c/span\u003e\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eRun commands locally, i.e. at the client, inside a sub-shell. The syntax is:\u003c/span\u003e\u003c/p\u003e\u003cpre spellcheck=\"false\" class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"bash\"\u003e\u003cdiv class=\"CodeMirror cm-s-inner CodeMirror-wrap\" lang=\"bash\"\u003e\u003cdiv style=\"overflow: hidden; position: relative; width: 3px; height: 0px; top: 0px; left: 4px;\"\u003e\u003ctextarea autocorrect=\"off\" autocapitalize=\"off\" spellcheck=\"false\" tabindex=\"0\" style=\"position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;\"\u003e\u003c/textarea\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-scrollbar-filler\" cm-not-content=\"true\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-gutter-filler\" cm-not-content=\"true\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-scroll\" tabindex=\"-1\"\u003e\u003cdiv class=\"CodeMirror-sizer\" style=\"margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;\"\u003e\u003cdiv style=\"position: relative; top: 0px;\"\u003e\u003cdiv class=\"CodeMirror-lines\" role=\"presentation\"\u003e\u003cdiv role=\"presentation\" style=\"position: relative; outline: none;\"\u003e\u003cdiv class=\"CodeMirror-measure\"\u003e\u003cpre\u003e\u003cspan\u003exxxxxxxxxx\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-measure\"\u003e\u003c/div\u003e\u003cdiv style=\"position: relative; z-index: 1;\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-code\" role=\"presentation\" style=\"\"\u003e\u003cdiv class=\"CodeMirror-activeline\" style=\"position: relative;\"\u003e\u003cdiv class=\"CodeMirror-activeline-background CodeMirror-linebackground\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-gutter-background CodeMirror-activeline-gutter\" style=\"left: 0px; width: 0px;\"\u003e\u003c/div\u003e\u003cpre class=\" CodeMirror-line \" role=\"presentation\"\u003e\u003cspan role=\"presentation\" style=\"padding-right: 0.1px;\"\u003elocal \u0026lt;commands\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\u003cpre class=\" CodeMirror-line \" role=\"presentation\"\u003e\u003cspan role=\"presentation\" style=\"padding-right: 0.1px;\"\u003e\u003cspan cm-text=\"\"\u003e​\u003c/span\u003e\u003c/span\u003e\u003c/pre\u003e\u003cpre class=\" CodeMirror-line \" role=\"presentation\"\u003e\u003cspan role=\"presentation\" style=\"padding-right: 0.1px;\"\u003e\u003cspan class=\"cm-comment\"\u003e# To run codes from a file\u003c/span\u003e\u003c/span\u003e\u003c/pre\u003e\u003cpre class=\" CodeMirror-line \" role=\"presentation\"\u003e\u003cspan role=\"presentation\" style=\"padding-right: 0.1px;\"\u003elocal . \u0026lt;path to script\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003cpre class=\" CodeMirror-line \" role=\"presentation\"\u003e\u003cspan role=\"presentation\" style=\"padding-right: 0.1px;\"\u003e\u003cspan cm-text=\"\"\u003e​\u003c/span\u003e\u003c/span\u003e\u003c/pre\u003e\u003cpre class=\" CodeMirror-line \" role=\"presentation\"\u003e\u003cspan role=\"presentation\" style=\"padding-right: 0.1px;\"\u003e\u003cspan class=\"cm-comment\"\u003e# To see current working directory at client\u003c/span\u003e\u003c/span\u003e\u003c/pre\u003e\u003cpre class=\" CodeMirror-line \" role=\"presentation\"\u003e\u003cspan role=\"presentation\" style=\"padding-right: 0.1px;\"\u003elocal \u003cspan class=\"cm-comment\"\u003e# equivalent to: local pwd\u003c/span\u003e\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style=\"position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 173px;\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-gutters\" style=\"display: none; height: 173px;\"\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003e\u003cspan\u003erc\u003c/span\u003e\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eRun commands. This is akin to the \u003c/span\u003e\u003ccode\u003e.\u003c/code\u003e\u003cspan\u003e or \u003c/span\u003e\u003ca href='https://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html'\u003e\u003ccode\u003esource\u003c/code\u003e\u003c/a\u003e\u003cspan\u003e built-in of Bash. Whereas \u003c/span\u003e\u003ccode\u003esource\u003c/code\u003e\u003cspan\u003e reads commands from a local file and executes them in the current shell, \u003c/span\u003e\u003ccode\u003erc\u003c/code\u003e\u003cspan\u003e takes commands from a client-side file and executes them in the server-side shell that the user is currently interacting with. The syntax is: \u003c/span\u003e\u003c/p\u003e\u003cpre spellcheck=\"false\" class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"bash\"\u003e\u003cdiv class=\"CodeMirror cm-s-inner CodeMirror-wrap\" lang=\"bash\"\u003e\u003cdiv style=\"overflow: hidden; position: relative; width: 3px; height: 0px; top: 0px; left: 4px;\"\u003e\u003ctextarea autocorrect=\"off\" autocapitalize=\"off\" spellcheck=\"false\" tabindex=\"0\" style=\"position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;\"\u003e\u003c/textarea\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-scrollbar-filler\" cm-not-content=\"true\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-gutter-filler\" cm-not-content=\"true\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-scroll\" tabindex=\"-1\"\u003e\u003cdiv class=\"CodeMirror-sizer\" style=\"margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;\"\u003e\u003cdiv style=\"position: relative; top: 0px;\"\u003e\u003cdiv class=\"CodeMirror-lines\" role=\"presentation\"\u003e\u003cdiv role=\"presentation\" style=\"position: relative; outline: none;\"\u003e\u003cdiv class=\"CodeMirror-measure\"\u003e\u003cpre\u003e\u003cspan\u003exxxxxxxxxx\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-measure\"\u003e\u003c/div\u003e\u003cdiv style=\"position: relative; z-index: 1;\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-code\" role=\"presentation\"\u003e\u003cdiv class=\"CodeMirror-activeline\" style=\"position: relative;\"\u003e\u003cdiv class=\"CodeMirror-activeline-background CodeMirror-linebackground\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-gutter-background CodeMirror-activeline-gutter\" style=\"left: 0px; width: 0px;\"\u003e\u003c/div\u003e\u003cpre class=\" CodeMirror-line \" role=\"presentation\"\u003e\u003cspan role=\"presentation\" style=\"padding-right: 0.1px;\"\u003erc \u0026lt;local path to script\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style=\"position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 25px;\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-gutters\" style=\"display: none; height: 25px;\"\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/pre\u003e\u003cp\u003e\u003cspan\u003eAll the commands in the given script are passed to upstream in one Git-push. Hence, use of this keyword helps with latency issues.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e\u003cspan\u003etake\u003c/span\u003e\u003c/strong\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan\u003e|\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cstrong\u003e\u003cspan\u003epush\u003c/span\u003e\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eSee next section\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e\u003cspan\u003ebring\u003c/span\u003e\u003c/strong\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan\u003e|\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cstrong\u003e\u003cspan\u003epull\u003c/span\u003e\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eSee next section\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e\u003cspan\u003ehelp\u003c/span\u003e\u003c/strong\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan\u003e|\u003c/span\u003e\u003cspan\u003e \u003c/span\u003e\u003cstrong\u003e\u003cspan\u003etutorial\u003c/span\u003e\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eGives the link to this section\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e\u003cspan\u003elatency\u003c/span\u003e\u003c/strong\u003e\u003cspan\u003e \u003c/span\u003e\u003cspan\u003e|\u003c/span\u003e\u003cstrong\u003e\u003cspan\u003ertt\u003c/span\u003e\u003c/strong\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eGives the latency or round-trip-time for the current connection in seconds. \u003c/span\u003e\u003cstrong\u003e\u003cspan\u003eNote\u003c/span\u003e\u003c/strong\u003e\u003cspan\u003e: You can use any of these commands anytime, even if a foreground process is running at the server and you do not have a prompt.\u003c/span\u003e\u003c/p\u003e\u003chr /\u003e\u003cp\u003e\u003cstrong\u003e\u003cspan\u003eTip\u003c/span\u003e\u003c/strong\u003e\u003cspan\u003e: If you need to run a command that matches any of the keywords described above, use the \u003c/span\u003e\u003cstrong\u003e\u003ca href='https://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html'\u003e\u003ccode\u003ecommand\u003c/code\u003e\u003c/a\u003e\u003c/strong\u003e\u003cspan\u003e built-in of Bash.\u003c/span\u003e\u003c/p\u003e\u003ch1\u003e\u003ca name=\"file-and-directory-transfer\" class=\"md-header-anchor\"\u003e\u003c/a\u003e\u003cspan\u003eFile and directory transfer\u003c/span\u003e\u003c/h1\u003e\u003cp\u003e\u003cstrong\u003e\u003cspan\u003eCopying file from client to server:\u003c/span\u003e\u003c/strong\u003e\u003c/p\u003e\u003cpre spellcheck=\"false\" class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"bash\"\u003e\u003cdiv class=\"CodeMirror cm-s-inner CodeMirror-wrap\" lang=\"bash\"\u003e\u003cdiv style=\"overflow: hidden; position: relative; width: 3px; height: 0px; top: 0px; left: 4px;\"\u003e\u003ctextarea autocorrect=\"off\" autocapitalize=\"off\" spellcheck=\"false\" tabindex=\"0\" style=\"position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;\"\u003e\u003c/textarea\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-scrollbar-filler\" cm-not-content=\"true\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-gutter-filler\" cm-not-content=\"true\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-scroll\" tabindex=\"-1\"\u003e\u003cdiv class=\"CodeMirror-sizer\" style=\"margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;\"\u003e\u003cdiv style=\"position: relative; top: 0px;\"\u003e\u003cdiv class=\"CodeMirror-lines\" role=\"presentation\"\u003e\u003cdiv role=\"presentation\" style=\"position: relative; outline: none;\"\u003e\u003cdiv class=\"CodeMirror-measure\"\u003e\u003cpre\u003e\u003cspan\u003exxxxxxxxxx\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-measure\"\u003e\u003c/div\u003e\u003cdiv style=\"position: relative; z-index: 1;\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-code\" role=\"presentation\"\u003e\u003cdiv class=\"CodeMirror-activeline\" style=\"position: relative;\"\u003e\u003cdiv class=\"CodeMirror-activeline-background CodeMirror-linebackground\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-gutter-background CodeMirror-activeline-gutter\" style=\"left: 0px; width: 0px;\"\u003e\u003c/div\u003e\u003cpre class=\" CodeMirror-line \" role=\"presentation\"\u003e\u003cspan role=\"presentation\" style=\"padding-right: 0.1px;\"\u003etake \u0026lt;local path\u0026gt; \u0026lt;remote path\u0026gt; \u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\u003cpre class=\" CodeMirror-line \" role=\"presentation\"\u003e\u003cspan role=\"presentation\" style=\"padding-right: 0.1px;\"\u003e\u003cspan class=\"cm-comment\"\u003e#### or\u003c/span\u003e\u003c/span\u003e\u003c/pre\u003e\u003cpre class=\" CodeMirror-line \" role=\"presentation\"\u003e\u003cspan role=\"presentation\" style=\"padding-right: 0.1px;\"\u003epush \u0026lt;local path\u0026gt; \u0026lt;remote path\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style=\"position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 74px;\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-gutters\" style=\"display: none; height: 74px;\"\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003e\u003cspan\u003eCopying file from server to client:\u003c/span\u003e\u003c/strong\u003e\u003c/p\u003e\u003cpre spellcheck=\"false\" class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"bash\"\u003e\u003cdiv class=\"CodeMirror cm-s-inner CodeMirror-wrap\" lang=\"bash\"\u003e\u003cdiv style=\"overflow: hidden; position: relative; width: 3px; height: 0px; top: 0px; left: 4px;\"\u003e\u003ctextarea autocorrect=\"off\" autocapitalize=\"off\" spellcheck=\"false\" tabindex=\"0\" style=\"position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;\"\u003e\u003c/textarea\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-scrollbar-filler\" cm-not-content=\"true\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-gutter-filler\" cm-not-content=\"true\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-scroll\" tabindex=\"-1\"\u003e\u003cdiv class=\"CodeMirror-sizer\" style=\"margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;\"\u003e\u003cdiv style=\"position: relative; top: 0px;\"\u003e\u003cdiv class=\"CodeMirror-lines\" role=\"presentation\"\u003e\u003cdiv role=\"presentation\" style=\"position: relative; outline: none;\"\u003e\u003cdiv class=\"CodeMirror-measure\"\u003e\u003cpre\u003e\u003cspan\u003exxxxxxxxxx\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-measure\"\u003e\u003c/div\u003e\u003cdiv style=\"position: relative; z-index: 1;\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-code\" role=\"presentation\"\u003e\u003cdiv class=\"CodeMirror-activeline\" style=\"position: relative;\"\u003e\u003cdiv class=\"CodeMirror-activeline-background CodeMirror-linebackground\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-gutter-background CodeMirror-activeline-gutter\" style=\"left: 0px; width: 0px;\"\u003e\u003c/div\u003e\u003cpre class=\" CodeMirror-line \" role=\"presentation\"\u003e\u003cspan role=\"presentation\" style=\"padding-right: 0.1px;\"\u003ebring \u0026lt;remote path\u0026gt; \u0026lt;local path\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\u003cpre class=\" CodeMirror-line \" role=\"presentation\"\u003e\u003cspan role=\"presentation\" style=\"padding-right: 0.1px;\"\u003e\u003cspan class=\"cm-comment\"\u003e#### or\u003c/span\u003e\u003c/span\u003e\u003c/pre\u003e\u003cpre class=\" CodeMirror-line \" role=\"presentation\"\u003e\u003cspan role=\"presentation\" style=\"padding-right: 0.1px;\"\u003epull \u0026lt;remote path\u0026gt; \u0026lt;local path\u0026gt;\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style=\"position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 74px;\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-gutters\" style=\"display: none; height: 74px;\"\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/pre\u003e\u003cp\u003e\u003cspan\u003eFile transfer is atomic, which guarantees you never end up with a corrupt file, even if the transfer operation gets interrupted or terminated prematurely. If the destination file is existing, it will be overwritten after backup. If the destination path is a directory, the file would be put inside it. The paths can be absolute or relative. As should be intuitive, any relative path would be interpreted with PWD at the corresponding host as its base, i.e. relative local (remote) path would be relative to the client-side (server-side) working directory. Similarly, tilde and shell-variable expansion in the path specifications, are done with respect to the corresponding host.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e\u003cspan\u003eTip\u003c/span\u003e\u003c/strong\u003e\u003cspan\u003e: To transfer directories or a collection of files, archive them first, with \u003c/span\u003e\u003ca href='https://man7.org/linux/man-pages/man1/tar.1.html'\u003e\u003ccode\u003etar\u003c/code\u003e\u003c/a\u003e\u003cspan\u003e for example, and then use the above commands to exchange that single archive file.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e\u003cspan\u003eTip\u003c/span\u003e\u003c/strong\u003e\u003cspan\u003e: To transfer a file from the Windows filesystem in WSL, first change its path to Unix path using the command: \u003c/span\u003e\u003ccode\u003ewslpath\u003c/code\u003e\u003cspan\u003e.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cstrong\u003e\u003cspan\u003eNote\u003c/span\u003e\u003c/strong\u003e\u003cspan\u003e: File transfer is end-to-end encrypted with your Git credentials. To keep your Git repository size small, the files are transferred using free, public file-hosting servers.\u003c/span\u003e\u003c/p\u003e\u003ch1\u003e\u003ca name=\"keyboard-generated-job-control-signals\" class=\"md-header-anchor\"\u003e\u003c/a\u003e\u003cspan\u003eKeyboard-generated job-control signals\u003c/span\u003e\u003c/h1\u003e\u003cp\u003e\u003cspan\u003eAll the familiar Ctrl key generated signals are supported except \u003c/span\u003e\u003ccode\u003eCtrl-\\\u003c/code\u003e\u003cspan\u003e, which has been replaced by \u003c/span\u003e\u003ccode\u003eCtrl-e\u003c/code\u003e\u003cspan\u003e (mnemonic: \u0026#39;e\u0026#39; for exit). Because the user doesn\u0026#39;t have the liberty to open a second terminal to control a runaway foreground process that ignores SIGTSTP (as generated with \u003c/span\u003e\u003ccode\u003eCtrl-z\u003c/code\u003e\u003cspan\u003e), GiBBERISh provides \u003c/span\u003e\u003ccode\u003eCtrl-\u0026lt;spacebar\u0026gt;\u003c/code\u003e\u003cspan\u003e key-binding to force pause a foreground process with SIGSTOP - which cannot be ignored or handled.\u003c/span\u003e\u003c/p\u003e\u003ch1\u003e\u003ca name=\"try-gibberish-at-localhost\" class=\"md-header-anchor\"\u003e\u003c/a\u003e\u003cspan\u003eTry GiBBERISh at localhost\u003c/span\u003e\u003c/h1\u003e\u003cp\u003e\u003cspan\u003eIf you are a first-time user, you may want to get familiar with GiBBERISh at your local machine. To do that, install GiBBERISh twice, once as server and then as client. Now, open a terminal and run: \u003c/span\u003e\u003c/p\u003e\u003cpre spellcheck=\"false\" class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"bash\"\u003e\u003cdiv class=\"CodeMirror cm-s-inner CodeMirror-wrap\" lang=\"bash\"\u003e\u003cdiv style=\"overflow: hidden; position: relative; width: 3px; height: 0px; top: 0px; left: 4px;\"\u003e\u003ctextarea autocorrect=\"off\" autocapitalize=\"off\" spellcheck=\"false\" tabindex=\"0\" style=\"position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;\"\u003e\u003c/textarea\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-scrollbar-filler\" cm-not-content=\"true\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-gutter-filler\" cm-not-content=\"true\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-scroll\" tabindex=\"-1\"\u003e\u003cdiv class=\"CodeMirror-sizer\" style=\"margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;\"\u003e\u003cdiv style=\"position: relative; top: 0px;\"\u003e\u003cdiv class=\"CodeMirror-lines\" role=\"presentation\"\u003e\u003cdiv role=\"presentation\" style=\"position: relative; outline: none;\"\u003e\u003cdiv class=\"CodeMirror-measure\"\u003e\u003cpre\u003e\u003cspan\u003exxxxxxxxxx\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-measure\"\u003e\u003c/div\u003e\u003cdiv style=\"position: relative; z-index: 1;\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-code\" role=\"presentation\"\u003e\u003cdiv class=\"CodeMirror-activeline\" style=\"position: relative;\"\u003e\u003cdiv class=\"CodeMirror-activeline-background CodeMirror-linebackground\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-gutter-background CodeMirror-activeline-gutter\" style=\"left: 0px; width: 0px;\"\u003e\u003c/div\u003e\u003cpre class=\" CodeMirror-line \" role=\"presentation\"\u003e\u003cspan role=\"presentation\" style=\"padding-right: 0.1px;\"\u003e\u003cspan class=\"cm-keyword\"\u003eexport\u003c/span\u003e \u003cspan class=\"cm-def\"\u003eGIBBERISH\u003c/span\u003e\u003cspan class=\"cm-operator\"\u003e=\u003c/span\u003eserver\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\u003cpre class=\" CodeMirror-line \" role=\"presentation\"\u003e\u003cspan role=\"presentation\" style=\"padding-right: 0.1px;\"\u003egibberish-server\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style=\"position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 49px;\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-gutters\" style=\"display: none; height: 49px;\"\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/pre\u003e\u003cp\u003e\u003cspan\u003eThen, open another terminal and run: \u003c/span\u003e\u003c/p\u003e\u003cpre spellcheck=\"false\" class=\"md-fences md-end-block ty-contain-cm modeLoaded\" lang=\"bash\"\u003e\u003cdiv class=\"CodeMirror cm-s-inner CodeMirror-wrap\" lang=\"bash\"\u003e\u003cdiv style=\"overflow: hidden; position: relative; width: 3px; height: 0px; top: 0px; left: 4px;\"\u003e\u003ctextarea autocorrect=\"off\" autocapitalize=\"off\" spellcheck=\"false\" tabindex=\"0\" style=\"position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;\"\u003e\u003c/textarea\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-scrollbar-filler\" cm-not-content=\"true\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-gutter-filler\" cm-not-content=\"true\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-scroll\" tabindex=\"-1\"\u003e\u003cdiv class=\"CodeMirror-sizer\" style=\"margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;\"\u003e\u003cdiv style=\"position: relative; top: 0px;\"\u003e\u003cdiv class=\"CodeMirror-lines\" role=\"presentation\"\u003e\u003cdiv role=\"presentation\" style=\"position: relative; outline: none;\"\u003e\u003cdiv class=\"CodeMirror-measure\"\u003e\u003cpre\u003e\u003cspan\u003exxxxxxxxxx\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-measure\"\u003e\u003c/div\u003e\u003cdiv style=\"position: relative; z-index: 1;\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-code\" role=\"presentation\"\u003e\u003cdiv class=\"CodeMirror-activeline\" style=\"position: relative;\"\u003e\u003cdiv class=\"CodeMirror-activeline-background CodeMirror-linebackground\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-gutter-background CodeMirror-activeline-gutter\" style=\"left: 0px; width: 0px;\"\u003e\u003c/div\u003e\u003cpre class=\" CodeMirror-line \" role=\"presentation\"\u003e\u003cspan role=\"presentation\" style=\"padding-right: 0.1px;\"\u003e\u003cspan class=\"cm-keyword\"\u003eexport\u003c/span\u003e \u003cspan class=\"cm-def\"\u003eGIBBERISH\u003c/span\u003e\u003cspan class=\"cm-operator\"\u003e=\u003c/span\u003eclient\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\u003cpre class=\" CodeMirror-line \" role=\"presentation\"\u003e\u003cspan role=\"presentation\" style=\"padding-right: 0.1px;\"\u003egibberish\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style=\"position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 49px;\"\u003e\u003c/div\u003e\u003cdiv class=\"CodeMirror-gutters\" style=\"display: none; height: 49px;\"\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/pre\u003e\u003ch1\u003e\u003ca name=\"granting-remote-access-while-you-monitor\" class=\"md-header-anchor\"\u003e\u003c/a\u003e\u003cspan\u003eGranting remote-access while you monitor\u003c/span\u003e\u003c/h1\u003e\u003cp\u003e\u003cspan\u003eThere might be desperate situations where you need to grant access to your local machine to someone else. To do that safely, do the following.\u003c/span\u003e\u003c/p\u003e\u003col start='' \u003e\u003cli\u003e\u003cspan\u003eIf your machine is not already configured as server, install GiBBERISh to run as server.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003ca href='https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token'\u003e\u003cspan\u003eCreate a temporary access-token\u003c/span\u003e\u003c/a\u003e\u003cspan\u003e at your upstream account.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003eSend the access-token to the person you are granting remote access to and ask her to install GiBBERISh as client with the given token as password/PAT. [If she already has GiBBERISh client configured with a different password, ask her to backup her \u003c/span\u003e\u003ccode\u003e~/.gibberish\u003c/code\u003e\u003cspan\u003e directory before reinstallation. After the session, she can simply restore the backup.]\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003eRun: \u003c/span\u003e\u003ccode\u003egibberish-server \u0026lt;access-token\u0026gt;\u003c/code\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003eAsk the other person to run: \u003c/span\u003e\u003ccode\u003egibberish\u003c/code\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003eMonitor everything on-screen. Whenever you feel you need to interrupt any command the remote client is running on your machine, use \u003c/span\u003e\u003ccode\u003eCtrl-c\u003c/code\u003e\u003cspan\u003e,  \u003c/span\u003e\u003ccode\u003eCtrl-z\u003c/code\u003e\u003cspan\u003e or \u003c/span\u003e\u003ccode\u003eCtrl-\\\u003c/code\u003e\u003cspan\u003e as usual. In the worst case, simply close the terminal. It would kill all processes spawned in that session.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003eAfter the session is over, close your terminal to kill the server.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan\u003eRevoke the access-token from your upstream account.\u003c/span\u003e\u003c/li\u003e\u003c/ol\u003e\u003ch1\u003e\u003ca name=\"library-not-executable\" class=\"md-header-anchor\"\u003e\u003c/a\u003e\u003cspan\u003eLibrary, not executable\u003c/span\u003e\u003c/h1\u003e\u003cp\u003e\u003cspan\u003eThe Bash script for GiBBERISh, viz. \u003c/span\u003e\u003cem\u003e\u003cspan\u003egibberish_rc.bash\u003c/span\u003e\u003c/em\u003e\u003cspan\u003e, is a library rather than an executable. On startup, your interactive Bash sources this script. The \u003c/span\u003e\u003cem\u003e\u003cspan\u003einstaller\u003c/span\u003e\u003c/em\u003e\u003cspan\u003e puts the corresponding run-command in .bashrc. \u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eThe \u003c/span\u003e\u003cem\u003e\u003cspan\u003einstaller\u003c/span\u003e\u003c/em\u003e\u003cspan\u003e, on the other hand, is an executable script. Hence, do a \u003c/span\u003e\u003cem\u003e\u003cspan\u003echmod +x\u003c/span\u003e\u003c/em\u003e\u003cspan\u003e on it, if necessary.\u003c/span\u003e\u003c/p\u003e\u003ch1\u003e\u003ca name=\"internals-pointers-to-understand-the-code\" class=\"md-header-anchor\"\u003e\u003c/a\u003e\u003cspan\u003eInternals (pointers to understand the code)\u003c/span\u003e\u003c/h1\u003e\u003cp\u003e\u003cspan\u003eThe client-side and server-side codes are almost the same structurally. This is why a single shell-script suffices for both. There are two types of events:\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003e1) Internal events: User@client or Bash@server creates new data to push\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003e2) External events: Git-fetch brings new data from outside to display or process \u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eInternal events are mostly waited for, while external ones need to be polled for continuously. Everything else is mostly triggered by these events. For example, upon creation, the data to be pushed is first siloed and an encrypt-commit-push pipeline is triggered.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eThe Git repository for GiBBERISh has two linear branches, viz. server-branch and client-branch. Server fetches from server-branch, but pushes to client-branch. Client does the converse. Every user-command@client or Bash-output@server, is committed to the proper outgoing branch as a single text file. As new commands or outputs become available, this file is simply revised to hold the same. The Git-worktree, therefore, always contains only a single file, and all the commands/outputs can always be tracked from its revision history. Every time a commit happens, it triggers a post-commit hook that pushes the commit automatically.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eEvery iteration of Git-fetch triggers a checkout sequence that tracks all the new commits chronologically, restoring the corresponding version of the abovementioned text file for decryption. Upon successful decryption, the checkout function pushes the data down a pipeline to user (@client) or Bash (@server), before moving on to the next commit in the git-revision-list.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eNote that if every user-command was passed using that single text file alone, then all the commands would end up in the queue for Bash@server. To relay a user-generated signal (SIGINT, SIGTSTP, SIGQUIT) to a foreground process on demand, however, we need to route \u003c/span\u003e\u003ca href='https://man7.org/linux/man-pages/man1/kill.1.html'\u003e\u003ccode\u003ekill\u003c/code\u003e\u003c/a\u003e\u003cspan\u003e commands to a second, parallel shell in the server. We, therefore, need a way to commit commands in the repository other than the single text file mentioned before. GiBBERISh exploits Git\u0026#39;s commit-message field for this purpose. Only those commits that carry the user-generated control signals, or any other command that is to be executed by the parallel shell only, would have commit-messages which hold the commands themselves. All other commits have empty commit-messages. Whether the commit is meant for the main shell or the parallel, can therefore be ascertained simply by checking whether the commit-message is empty or not. \u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eSuch commit-message commands, meant for the parallel shell, are mostly kill(@server) and file-download(@client) commands. Hence, they do not contain any sensitive data and are consequently not encrypted to save on time. These commands are called \u003c/span\u003e\u003cstrong\u003e\u003cspan\u003ehook\u003c/span\u003e\u003c/strong\u003e\u003cspan\u003es. Both server and client share this hook-execution architecture. Hooks are the only way server can make client do some work, such as required during file transfer from server to client.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eIn contrast to SSH, GiBBERISh does not stream every keystroke made by the user to the server in real-time. Rather, it first lets the user enter the complete command, then reads it, checks for keywords, and only then decides what to do. If the command-line is not a keyword, it is pushed to the server as is for execution. To generate signals at server from particular key-sequences entered at the client, key-binding is done at the client-terminal such that it commits and pushes the appropriate hook to be executed by the parallel shell at server, whenever those keys are pressed by the user.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eThe current prompt at the server-side terminal is appended to the text file in the repository below the PGP message block containing the output of Bash@server. When a foreground process is running in that terminal, only a newline is appended instead. Client extracts this appendix to remain informed about the current state of the dynamic server-side prompt, and displays the same at the client-side terminal as required. This feature is strictly designed for adding to the user experience and is in no way a necessary part of the GiBBERISh engine.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003ca href='https://gist.github.com/SomajitDey/3a438669bd00bdf3b80e4471c2c41a98'\u003e\u003cem\u003e\u003cspan\u003eStrategy to decrease latency\u003c/span\u003e\u003c/em\u003e\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003ccode\u003egit-push\u003c/code\u003e\u003cspan\u003e is the most obvious way to transfer a file to upstream. However, it is slow (~3s). Using a file-update API, if provided by the upstream host, can make file-transfer faster (~1s). GiBBERISh uses the REST \u003c/span\u003e\u003ca href='https://docs.github.com/en/rest/reference/repos#create-or-update-file-contents'\u003e\u003cspan\u003eAPI\u003c/span\u003e\u003c/a\u003e\u003cspan\u003e of GitHub for this purpose. The speed up is significant:\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eUsing API: 3-4s | Using git-push: 6-9s\u003c/span\u003e\u003c/p\u003e\u003ch1\u003e\u003ca name=\"bug-reports-feature-requests-comments\" class=\"md-header-anchor\"\u003e\u003c/a\u003e\u003cspan\u003eBug-reports, Feature-requests, Comments\u003c/span\u003e\u003c/h1\u003e\u003cp\u003e\u003cspan\u003eCreate issue(s) and comment at \u003c/span\u003e\u003ca href='https://github.com/SomajitDey/gibberish' target='_blank' class='url'\u003ehttps://github.com/SomajitDey/gibberish\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eYou can also contact me directly at \u003c/span\u003e\u003ca href='mailto:dey.somajit@gmail.com' target='_blank' class='url'\u003edey.somajit@gmail.com\u003c/a\u003e\u003c/p\u003e\u003ch1\u003e\u003ca name=\"legal\" class=\"md-header-anchor\"\u003e\u003c/a\u003e\u003cspan\u003eLegal\u003c/span\u003e\u003c/h1\u003e\u003cp\u003e\u003ca href='https://github.com/SomajitDey/gibberish'\u003e\u003cspan\u003eGiBBERISh-- Git and Bash Based Encrypted Remote Interactive Shell\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eCopyright (C) 2021 \u003c/span\u003e\u003ca href='https://www.researchgate.net/profile/Somajit-Dey'\u003e\u003cspan\u003eSomajit Dey\u003c/span\u003e\u003c/a\u003e\u003cspan\u003e, \u003c/span\u003e\u003ca href='https://orcid.org/0000-0002-6102-9777'\u003e\u003cspan\u003eORCID ID: 0000-0002-6102-9777\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eYou are free to modify and distribute the code under GPL-3.0-or-later \u003c/span\u003e\u003ca href='https://www.gnu.org/licenses/' target='_blank' class='url'\u003ehttps://www.gnu.org/licenses/\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u003cem\u003e\u003cspan\u003eGiBBERISh comes with ABSOLUTELY NO WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Use it at your own risk. The developer or copyright holder won\u0026#39;t be liable for any damage done by or done using this software.\u003c/span\u003e\u003c/em\u003e\u003c/p\u003e\u003ch1\u003e\u003ca name=\"acknowledgements\" class=\"md-header-anchor\"\u003e\u003c/a\u003e\u003cspan\u003eAcknowledgements\u003c/span\u003e\u003c/h1\u003e\u003cp\u003e\u003cspan\u003eSoumalya Bhowmik contributed by testing this software thoroughly.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan\u003eThanks to \u003c/span\u003e\u003ca href='https://pbedat.de/'\u003e\u003cspan\u003ePatrick Bedat\u003c/span\u003e\u003c/a\u003e\u003cspan\u003e and Seth Kenlon for encouragement and discussions.\u003c/span\u003e\u003c/p\u003e\u003ch1\u003e\u003ca name=\"future-directions\" class=\"md-header-anchor\"\u003e\u003c/a\u003e\u003cspan\u003eFuture directions\u003c/span\u003e\u003c/h1\u003e\u003cp\u003e\u003ca href='https://github.com/SomajitDey/gibberish/projects/1' target='_blank' class='url'\u003ehttps://github.com/SomajitDey/gibberish/projects/1\u003c/a\u003e\u003c/p\u003e\u003cp\u003e\u0026nbsp;\u003c/p\u003e\u003c/div\u003e\n\u003c/body\u003e\n\u003c/html\u003e","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsomajitdey%2Fgibberish","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsomajitdey%2Fgibberish","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsomajitdey%2Fgibberish/lists"}