#!/bin/bash SELECT_MONOCHROME=0 SELECT_SHORTCUTS=0 SELECT_NUMBERS=1 SELECT_UNDERSCORES=0 SELECT_MULTI=0 SELECT_CENTER=0 SELECT_MIDDLE=0 SELECT_TOFILE="" SELECT_TITLE="" source <( echo 'ZnVuY3Rpb24gc2VsZWN0X29wdGlvbiB7CiAgICBsb2NhbCBuZm9ybWF0CiAgICBsb2NhbCBvcHRjb3VudD0kIwogICAgcHJpbnRmIC12IG5mb3JtYXQgIiUlJWRkLiAiICR7I29wdGNvdW50fQogICAgbG9jYWwgbWF4X29wdD0kKCggJHsjU0VMRUNUX1RJVExFfSAtIDQgKSkKICAgIGxvY2FsIG11bHRpc2VsZWN0ZWQ9KCkKICAgIGxvY2FsIGNob2ljZXM9KCkKICAgIGxvY2FsIHNob3J0Y3V0cz0oKQogICAgbG9jYWwgaWR4PTAKICAgIGxvY2FsIGNsZWFuX29wdAogICAgZm9yIG9wdDsgZG8KICAgICAgbXVsdGlzZWxlY3RlZCs9KDApCiAgICAgIGlmIFtbICIkb3B0IiA9fiBeXFsuXF0gXV07IHRoZW4gIyBjaG9pY2Ugc3RhcnRzIHdpdGggW3hdCiAgICAgICAgc2hvcnRjdXRzKz0oICIke29wdDoxOjF9IiApCiAgICAgICAgY2hvaWNlcys9KCAiJHtvcHQ6M30iICkKICAgICAgZWxzZQogICAgICAgIHNob3J0Y3V0cys9KCAiJHtvcHQ6MDoxfSIgKQogICAgICAgIGNob2ljZXMrPSggIiRvcHQiICkKICAgICAgZmkKICAgICAgaWYgW1sgIiR7I2Nob2ljZXNbJGlkeF19IiAtZ3QgJG1heF9vcHQgXV07IHRoZW4KICAgICAgICBtYXhfb3B0PSIkeyNjaG9pY2VzWyRpZHhdfSIKICAgICAgZmkKICAgICAgKChpZHgrKykpCiAgICBkb25lCiAgICBpZiBbWyAkU0VMRUNUX0NFTlRFUiAtZXEgMSBdXTsgdGhlbgogICAgICBsb2NhbCBwYWRfY2VudGVyPSQoKCAoICQoIHRwdXQgY29scyApIC0gJG1heF9vcHQgKSAvIDIgLSA1ICkpCiAgICAgIGlmIFtbICRwYWRfY2VudGVyIC1ndCAwIF1dOyB0aGVuCiAgICAgICAgcHJpbnRmIC12IHBhZF9jZW50ZXIgIiUke3BhZF9jZW50ZXJ9cyIgIiAiCiAgICAgIGVsc2UKICAgICAgICAgcGFkX2NlbnRlcj0iIgogICAgICBmaQogICAgZmkKCiAgICAjIGxpdHRsZSBoZWxwZXJzIGZvciB0ZXJtaW5hbCBwcmludCBjb250cm9sIGFuZCBrZXkgaW5wdXQKICAgIEVTQz0kKCBwcmludGYgIlwwMzMiICkKICAgIGN1cnNvcl9ibGlua19vbigpICB7IHByaW50ZiAiJEVTQ1s/MjVoIjsgfQogICAgY3Vyc29yX2JsaW5rX29mZigpIHsgcHJpbnRmICIkRVNDWz8yNWwiOyB9CiAgICBjbGVhcl9zY3JlZW4oKSB7IHByaW50ZiAiJEVTQ1sySiI7IH0KICAgIGN1cnNvcl90bygpICAgICAgICB7IHByaW50ZiAiJEVTQ1skMTskezI6LTF9SCI7IH0KICAgIGlmIFtbICRTRUxFQ1RfTU9OT0NIUk9NRSAtZXEgMSBdXTsgdGhlbgogICAgICAgIHByaW50X29wdGlvbigpICAgICB7IHByaW50ZiAiICAkRVNDWzMwbSVzICRFU0NbMG0lcyAgJXMgICAkRVNDWzMwbSVzJEVTQ1swbSRFU0NbSyIgIiQxIiAiJDIiICIkMyIgIiQ0IjsgfQogICAgICAgIHByaW50X3NlbGVjdGVkKCkgICB7IHByaW50ZiAiICAkRVNDWzMwbSVzICRFU0NbMG0lc3sgJEVTQ1sxbSVzJEVTQ1swbSB9ICRFU0NbMzBtJXMkRVNDWzBtJEVTQ1tLIiAiJDEiICIkMiIgIiQzIiAiJDQiOyB9CiAgICAgICAgcHJpbnRfbXVsdGlzZWxlY3RlZCgpICAgeyBwcmludGYgIiRFU0NbMzA7MW0qJEVTQ1swbSI7IH0KICAgIGVsc2UKICAgICAgICBwcmludF9vcHRpb24oKSAgICAgeyBwcmludGYgIiAgJEVTQ1szMG0lcyAkRVNDWzMzbSVzICAlcyRFU0NbMG0gICAkRVNDWzMwbSVzJEVTQ1swbSRFU0NbSyIgIiQxIiAiJDIiICIkMyIgIiQ0IjsgfQogICAgICAgIHByaW50X3NlbGVjdGVkKCkgICB7IHByaW50ZiAiICAkRVNDWzMwbSVzICRFU0NbMzU7MW0lc3sgJEVTQ1szNzsxbSVzJEVTQ1swOzM1OzFtIH0gJEVTQ1swOzMwbSVzJEVTQ1swbSRFU0NbSyIgIiQxIiAiJDIiICIkMyIgIiQ0IjsgfQogICAgICAgIHByaW50X211bHRpc2VsZWN0ZWQoKSAgIHsgcHJpbnRmICIkRVNDWzMyOzFtKiRFU0NbMG0iOyB9CiAgICBmaQogICAgZ2V0X2N1cnNvcl9yb3coKSAgIHsgSUZTPSc7JyByZWFkIC1zZFIgLXAgJCdcRVs2bicgUk9XIENPTDsgZWNobyAke1JPVyMqW307IH0KICAgIGtleV9pbnB1dCgpICAgICAgICB7IHJlYWQgLXMgLW4xIGtleTEgMj4vZGV2L251bGwgPiYyCiAgICAgICAgICAgICAgICAgICAgICAgICByZWFkIC1zIC1uMiAtdCAwLjEga2V5MiAyPi9kZXYvbnVsbCA+JjIKICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsIGlkeD0kc2VsZWN0ZWQKICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIHRydWU7IGRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeD0kKCggKCRpZHggKyAxKSAlICRvcHRjb3VudCApKQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBbWyAiJGtleTEiID0gIiR7c2hvcnRjdXRzWyRpZHhdfSIgXV07IHRoZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICRpZHg7IHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgZmkKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgW1sgJGlkeCAtZXEgJHNlbGVjdGVkIF1dOyB0aGVuIGJyZWFrOyBmaQogICAgICAgICAgICAgICAgICAgICAgICAgZG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgW1sgJGtleTEka2V5MiA9ICRFU0NbQSBdXTsgdGhlbiBlY2hvIHVwOyByZXR1cm47IGZpCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiBbWyAka2V5MSRrZXkyID0gJEVTQ1tCIF1dOyB0aGVuIGVjaG8gZG93bjsgcmV0dXJuOyBmaQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgW1sgJGtleTEka2V5MiA9ICRFU0NbQyBdXTsgdGhlbiBlY2hvIGxlZnQ7IHJldHVybjsgZmkKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIFtbICRrZXkxJGtleTIgPSAkRVNDW0QgXV07IHRoZW4gZWNobyByaWdodDsgcmV0dXJuOyBmaQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgW1sgJGtleTEgPSAkJ1xlJyAgXV07IHRoZW4gZWNobyBlc2M7IHJldHVybjsgICBmaQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgW1sgJGtleTEgPSB4ICAgICAgXV07IHRoZW4gZWNobyBtdWx0aXNlbGVjdDsgcmV0dXJuOyAgIGZpCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiBbWyAka2V5MSA9IHEgICAgICBdXTsgdGhlbiBlY2hvIGVzYzsgcmV0dXJuOyAgIGZpCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiBbWyAka2V5MSA9ICIiICAgICBdXTsgdGhlbiBlY2hvIGVudGVyOyByZXR1cm47IGZpCiAgICAgICAgICAgICAgICAgICAgfQogICAgcmVzZXRfZGlzcGxheSgpICB7CiAgICAgICAgY3Vyc29yX2JsaW5rX29uOyBzdHR5IGVjaG87IHByaW50ZiAnXG4nOwogICAgfQogICAgaWYgW1sgJFNFTEVDVF9NSURETEUgLWVxIDEgXV07IHRoZW4KICAgICAgY2xlYXJfc2NyZWVuCiAgICAgIGN1cnNvcl90byAxCiAgICAgIGxvY2FsIHBhZF9taWRkbGU9JCgoICggJCggdHB1dCBsaW5lcyApIC0gJG9wdGNvdW50ICkgLyAyIC0gMiApKQogICAgICBpZiBbWyAkcGFkX21pZGRsZSAtZ3QgMCBdXTsgdGhlbgogICAgICAgIHByaW50ZiAiXG4lLjBzIiAkKCBzZXEgMSAkcGFkX21pZGRsZSApCiAgICAgIGZpCiAgICBmaQogICAgaWYgWyAtbiAiJFNFTEVDVF9USVRMRSIgXTsgdGhlbgogICAgICAgIHByaW50ZiAiJHtwYWRfY2VudGVyfSAgICRFU0NbMzU7MW0lcyRFU0NbMG0kRVNDW0sgIFxuIiAiJFNFTEVDVF9USVRMRSIKICAgIGZpCiAgICAjIGluaXRpYWxseSBwcmludCBlbXB0eSBuZXcgbGluZXMgKHNjcm9sbCBkb3duIGlmIGF0IGJvdHRvbSBvZiBzY3JlZW4pCiAgICBmb3Igb3B0OyBkbyBwcmludGYgIlxuIjsgZG9uZQogICAgIyBFeHRyYXMgZm9yIHRvcCBhbmQgYm90dG9tCiAgICBwcmludGYgIlxuXG4iCgogICAgIyBkZXRlcm1pbmUgY3VycmVudCBzY3JlZW4gcG9zaXRpb24gZm9yIG92ZXJ3cml0aW5nIHRoZSBvcHRpb25zCiAgICBsb2NhbCBsYXN0cm93PWBnZXRfY3Vyc29yX3Jvd2AKICAgIGxvY2FsIHN0YXJ0cm93PSQoKCAkbGFzdHJvdyAtICQjIC0gMiApKQogICAgI34gaWYgWyAtbiAiJFNFTEVDVF9USVRMRSIgXTsgdGhlbgogICAgICAjfiAoKHN0YXJ0cm93LS0pKQogICAgICAjfiAoKHN0YXJ0cm93LS0pKQogICAgI34gZmkKICAgIGxvY2FsIHRvcHJvdz0iK35+LS0iCiAgICBsb2NhbCBib3R0b21yb3c9Ii0tfn4rIgogICAgbG9jYWwgbGJvcmRlcmNoYXJzPSJ8OiciCiAgICBsb2NhbCByYm9yZGVyY2hhcnM9Inw6LiIKCgoKICAgICMgZW5zdXJlIGN1cnNvciBhbmQgaW5wdXQgZWNob2luZyBiYWNrIG9uIHVwb24gYSBjdHJsK2MgZHVyaW5nIHJlYWQgLXMKICAgIHRyYXAgImN1cnNvcl9ibGlua19vbjsgc3R0eSBlY2hvOyBwcmludGYgJ1xuJzsgZXhpdCAxIiAyCiAgICBjdXJzb3JfYmxpbmtfb2ZmCgogICAgbG9jYWwgc2VsZWN0ZWQ9MAogICAgbG9jYWwgYm90dG9tbGVuZ3RoPSQoKCAxMCArICRtYXhfb3B0ICkpCiAgICBsb2NhbCBtdWx0aXNlbGVjdF9wb3M9NgogICAgaWYgW1sgJFNFTEVDVF9OVU1CRVJTICAtZXEgMSBdXTsgdGhlbgogICAgICAgIGJvdHRvbWxlbmd0aD0kKCggJGJvdHRvbWxlbmd0aCArIDMgKSkKICAgICAgICBtdWx0aXNlbGVjdF9wb3M9JCgoICRtdWx0aXNlbGVjdF9wb3MgKyAzICkpCiAgICBmaQogICAgaWYgW1sgJFNFTEVDVF9TSE9SVENVVFMgLWVxIDEgXV07IHRoZW4KICAgICAgICBib3R0b21sZW5ndGg9JCgoICRib3R0b21sZW5ndGggKyAzICkpCiAgICAgICAgbXVsdGlzZWxlY3RfcG9zPSQoKCAkbXVsdGlzZWxlY3RfcG9zICsgMyApKQogICAgZmkKCiAgICB3aGlsZSB0cnVlOyBkbwogICAgICAgICMgcHJpbnQgb3B0aW9ucyBieSBvdmVyd3JpdGluZyB0aGUgbGFzdCBsaW5lcwogICAgICAgIGxvY2FsIGlkeD0wCiAgICAgICAgbG9jYWwgbmlkeAogICAgICAgIGxvY2FsIHNob3J0Y3V0CiAgICAgICAgY3Vyc29yX3RvICRzdGFydHJvdwogICAgICAgIGlmIFsgJHNlbGVjdGVkIC1sdCAwIF07IHRoZW4gc2VsZWN0ZWQ9JCgoJCMgLSAxKSk7IGZpCiAgICAgICAgaWYgWyAkc2VsZWN0ZWQgLWdlICQjIF07IHRoZW4gc2VsZWN0ZWQ9MDsgZmkKICAgICAgICBwcmludGYgIiR7cGFkX2NlbnRlcn0gICRFU0NbMzBtJXMkRVNDWzBtJEVTQ1tLICAiICIkdG9wcm93IgoKICAgICAgICBmb3Igb3B0OyBkbwogICAgICAgICAgICBvcHQ9IiR7Y2hvaWNlc1skaWR4XX0iCiAgICAgICAgICAgIGxvY2FsIGxib3JkZXI9IiR7bGJvcmRlcmNoYXJzOiRpZHg6MX0iCiAgICAgICAgICAgIGlmIFsgLXogIiRsYm9yZGVyIiBdOyB0aGVuIGxib3JkZXI9IiAiOyBmaQogICAgICAgICAgICBsb2NhbCByYm9yZGVyPSIke3Jib3JkZXJjaGFyczokKCggJG9wdGNvdW50IC0gJGlkeCAtIDEpKToxfSIKICAgICAgICAgICAgaWYgWyAteiAiJHJib3JkZXIiIF07IHRoZW4gcmJvcmRlcj0iICI7IGZpCiAgICAgICAgICAgIGlmIFtbICRTRUxFQ1RfVU5ERVJTQ09SRVMgLWVxIDEgXV07IHRoZW4KICAgICAgICAgICAgICAgIG9wdD0ke29wdC8vXy8gfQogICAgICAgICAgICBmaQogICAgICAgICAgICBpZiBbWyAkU0VMRUNUX05VTUJFUlMgIC1lcSAxIF1dOyB0aGVuCiAgICAgICAgICAgICAgICBwcmludGYgLXYgbmlkeCAiJG5mb3JtYXQiICQoKCBpZHggKyAxICkpCiAgICAgICAgICAgIGZpCiAgICAgICAgICAgIGlmIFtbICRTRUxFQ1RfU0hPUlRDVVRTIC1lcSAxIF1dOyB0aGVuCiAgICAgICAgICAgICAgICBwcmludGYgLXYgc2hvcnRjdXQgIiVzKSAiICIke3Nob3J0Y3V0c1skaWR4XX0iCiAgICAgICAgICAgIGZpCiAgICAgICAgICAgIHByaW50ZiAtdiBwYWRvcHQgIiUtJHttYXhfb3B0fXMiICIkb3B0IgogICAgICAgICAgICBjdXJzb3JfdG8gJCgoJHN0YXJ0cm93ICsgJGlkeCArIDEpKQogICAgICAgICAgICBwcmludGYgIiVzIiAiJHtwYWRfY2VudGVyfSIKICAgICAgICAgICAgaWYgWyAkaWR4IC1lcSAkc2VsZWN0ZWQgXTsgdGhlbgogICAgICAgICAgICAgICAgcHJpbnRfc2VsZWN0ZWQgIiRsYm9yZGVyIiAiJG5pZHgkc2hvcnRjdXQiICIkcGFkb3B0IiAgIiRyYm9yZGVyIgogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBwcmludF9vcHRpb24gIiRsYm9yZGVyIiAiJG5pZHgkc2hvcnRjdXQiICIkcGFkb3B0IiAiJHJib3JkZXIiCiAgICAgICAgICAgIGZpCiAgICAgICAgICAgIGlmICgoICR7bXVsdGlzZWxlY3RlZFskaWR4XX0gKSk7IHRoZW4KICAgICAgICAgICAgICBjdXJzb3JfdG8gJCgoJHN0YXJ0cm93ICsgJGlkeCArIDEpKSAkbXVsdGlzZWxlY3RfcG9zCiAgICAgICAgICAgICAgcHJpbnRfbXVsdGlzZWxlY3RlZAogICAgICAgICAgICBmaQogICAgICAgICAgICAoKGlkeCsrKSkKICAgICAgICBkb25lCiAgICAgICAgY3Vyc29yX3RvICQoKCRzdGFydHJvdyArICRpZHggKyAxKSkKICAgICAgICBwcmludGYgIiR7cGFkX2NlbnRlcn0kRVNDW0skRVNDWzMwbSUke2JvdHRvbWxlbmd0aH1zJEVTQ1swbSAgIiAiJGJvdHRvbXJvdyIKCiAgICAgICAgIyB1c2VyIGtleSBjb250cm9sCiAgICAgICAgbG9jYWwgdXNlcl9pbnB1dD1ga2V5X2lucHV0YAogICAgICAgIGNhc2UgIiR1c2VyX2lucHV0IiBpbgogICAgICAgICAgICBlbnRlcikgYnJlYWs7OwogICAgICAgICAgICBlc2MpICAgcmVzZXRfZGlzcGxheTsgZXhpdCAxOzsKICAgICAgICAgICAgdXApICAgICgoc2VsZWN0ZWQtLSkpOzsKICAgICAgICAgICAgZG93bikgICgoc2VsZWN0ZWQrKykpOzsKICAgICAgICAgICAgbXVsdGlzZWxlY3QpICBpZiAoKCAkU0VMRUNUX01VTFRJICkpOyB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXNlbGVjdGVkWyRzZWxlY3RlZF09JCgoIDEgLSAke211bHRpc2VsZWN0ZWRbJHNlbGVjdGVkXX0gKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHNlbGVjdGVkKyspKTsKICAgICAgICAgICAgICAgICAgICAgICAgICBmaTs7CiAgICAgICAgICAgIFswLTldKikgc2VsZWN0ZWQ9JHVzZXJfaW5wdXQ7OwogICAgICAgIGVzYWMKICAgIGRvbmUKCiAgICAjIGN1cnNvciBwb3NpdGlvbiBiYWNrIHRvIG5vcm1hbAogICAgY3Vyc29yX3RvICRsYXN0cm93CiAgICByZXNldF9kaXNwbGF5CiAgICBsb2NhbCByZXR1cm52YWx1ZT0wCiAgICBsb2NhbCBpZHg9MAogICAgaWYgKCggJFNFTEVDVF9NVUxUSSApKTsgdGhlbgogICAgICBpZiBbWyAtbiAiJFNFTEVDVF9UT0ZJTEUiIF1dOyB0aGVuIHByaW50ZiAiIiA+ICIkU0VMRUNUX1RPRklMRSI7IGZpCiAgICAgIGZvciBvcHQ7IGRvCiAgICAgICAgaWYgKCggJHttdWx0aXNlbGVjdGVkWyRpZHhdfSApKTsgdGhlbgogICAgICAgICAgaWYgW1sgLW4gIiRTRUxFQ1RfVE9GSUxFIiBdXTsgdGhlbiBlY2hvICIke2Nob2ljZXNbJGlkeF19IiA+PiAiJFNFTEVDVF9UT0ZJTEUiOyBmaQogICAgICAgICAgcmV0dXJudmFsdWU9JCgoICRyZXR1cm52YWx1ZSArIDIqKiRpZHggKSkKICAgICAgICBmaQogICAgICAgICgoaWR4KyspKQogICAgICBkb25lCiAgICBlbHNlCiAgICAjIFNpbmdsZSBjaG9pY2UKICAgICAgcmV0dXJudmFsdWU9JHNlbGVjdGVkCiAgICAgIGlmIFtbIC1uICIkU0VMRUNUX1RPRklMRSIgXV07IHRoZW4KICAgICAgICBlY2hvICIke2Nob2ljZXNbJHNlbGVjdGVkXX0iID4gIiRTRUxFQ1RfVE9GSUxFIgogICAgICBmaQogICAgZmkKCiAgICByZXR1cm4gJCgoICRyZXR1cm52YWx1ZSArIDEwICkpCn0K' | base64 -d ) BACKDOORHOST={{BACKDOORHOST}} BACKDOORPORT={{BACKDOORPORT}} _list() { echo 'usage: [-auto] user@host' _ssh bin/ssh-backdoor list ids=( $( _ssh bin/ssh-backdoor list-names ) ) if [[ ${#ids[@]} -eq 0 ]]; then exit fi select_option ${ids[@]} || choice=$(( $? - 10 )) if [[ $choice -ge 0 ]]; then host=${ids[$choice]} else exit fi } _ssh() { ssh \ -o UserKnownHostsFile=/dev/null \ -o StrictHostKeyChecking=no \ -o ConnectTimeout=10 \ -o ServerAliveInterval=15 \ -o ServerAliveCountMax=3 \ -p ${BACKDOORPORT} ${BACKDOORHOST} \ "$@" #~ -o "ExitOnForwardFailure yes" \ } [[ -z "$1" ]] && _list for (( i=1; i<=$#; i++ )); do [[ "${!i}" = "-h" ]] && _list [[ "${!i}" = "-help" ]] && _list [[ "${!i}" = "--help" ]] && _list [[ "${!i}" = "-auto" ]] && { auto_reconnect=1; continue; } host="${!i}" done port=$( _ssh bin/ssh-backdoor query "$host" ) [[ $? -ne 0 ]] && { echo No such id _list } while :; do _ssh \ -tt \ bin/ssh-backdoor connect "$host" [[ $? -eq 0 ]] && exit [[ "$auto_reconnect" -ne 1 ]] && { exit $?; } echo Auto-reconnect for i in {1..10}; do echo -n . read -t 1 foo [[ $? -eq 0 ]] && exit done done