Администрирование нескольких серверов с мобильного по ssh в Termux

Тот кто скажет, что администрирование серверов с современных мобильных устройств — это жесть и хардкор, тот скорее всего не знает, что такое разработка wap сайтов на wml  с Siemens A60. Тот не знает, что такое радость первого удачного взлома с Siemens C75, когда ради смеха ты «потрошишь» аккаунты юзеров несчастных знакомств, отправляя им xss payload-ы. Тот не знает, что такое запустить сервер с php и apache на Nokia N70, и написать вполне себе рабочую баннерную сеть в среде 3 на 4 сантиметра. Но вернемся к современным инструментам))

Рассмотрим настройку bash окружения оболочки и Android программы для работы по SSH, т.к. Apple не признаю. Впрочем и гугл с мелкомягкими не сильно жалую, но что поделаешь с корпорациями «добра». Подключаться к 4-м администрируемым серверам мы будем из Termux, причем без набора команд ssh — всего в пару кликов.

Termux

Именно этот эмулятор терминала нам понадобится под Android. Поиск и установка пакетов в терминале выполняется так:

pkg search openssh
pkg install openssh

Или вот так:

apt install bash-completion

Но прежде чем начать работу с терминалом настоятельно рекомендую поставить правильную клавиатуру и языковые пакеты словарей с автозавершением ввода.

В Play маркете нам понадобятся:

  • Hacker’s keyboard
  • English completion dictionary
  • Russian dictionary

Очень классная клава, советую даже не хацкерам.

Теперь в Termux настроим приглашение ввода, поскольку $PS1 по умочанию не даёт никакой информативности о текущем каталоге, выводя лишь значок доллара.

vi .bashrc

Да, vi таки придется освоить, именно он более удобен на мобильном терминале, чем nano. Хотя дело вкуса…

И добавляем строчки:

PS1="\[\033[1;32m\]\w\[\033[0;36m\]$ \[\033[0m\]\[\033[0m\]"
eval `ssh-agent`

Текущий каталог мы раскрасили светло-зеленым и доллар бирюзовым. Большего нам не нужно, доллар на решетку менять не будем, т.к. устройство всё равно не рутовано. И при входе в терминал сразу же запускаем ssh-agent

Отлично. Кто я?

~$ whoami
u0_a207

Где я?

~$ pwd
/data/data/com.termux/files/home

Предположим, у нас уже есть приватный ключ id_rsa подходящий к 4 серверам от юзеров sudo. Если ещё не настроили доступ по ключам, то:

Добавление юзера sudo на сервер с авторизацией по SSH ключам

Настройка SSH доступа по сертификатам

Естественно, наш приватный ключ защищен паролем, на случай утечки файла ключа в чужие руки. Этот ключик нам необходимо разместить тут:

/data/data/com.termux/files/home/.ssh/id_rsa

Наш домашний каталог в Termux, в котором мы находимся это:

/data/data/com.termux/files/home/

Как настроить доступ к Android по ssh мы рассмотрим в следующей статье, сейчас же нам просто нужно залить ключ на место и поставить ему права 600.

Из не рутованого устройства мы не сможем перейти файловыми менеджерами в каталог /data/ поскольку это системная папка. Значит зальем файл в любой доступный нам каталог и переместим командой в нужное место:

mv /sdcard/Download/id_rsa /data/data/com.termux/files/home/.ssh/id_rsa
chmod 600
chown u0_a207: /data/data/com.termux/files/home/.ssh/id_rsa

Вот и пришло время, написать наш дружелюбный скриптик, который лишь в первый запуск спросит пароль от нашего приватного ключа, а дальше мы сможем подключаться к серверам буквально в 1 клик.

Назовем его sos. Всё же должно случиться нечто экстренное, чтобы влазить дрочиться с мобильного в терминале)) Ну например — лень)) встать с дивана и включить комп, когда нужно глянуть/сделать что-то по мелочи. Бывает же такое.

Файл скрипта необходимо создать тут:

vi /data/data/com.termux/files/usr/bin/sos

Именно этот bin каталог прописан в $PATH в эмуляторе Termux

~$ echo $PATH
/data/data/com.termux/files/usr/bin:/data/data/com.termux/files/usr/bin/applets

А вот и наш лаконичный помощник:

#!/data/data/com.termux/files/usr/bin/bash

[ ! "$(ssh-add -l | grep -i rsa)" ] && ssh-add ~/.ssh/id_rsa

select_srv() {
    echo '------------------'
    echo '192.168.1.100 - press [a/A]'
    echo '192.168.1.101 - press [b/B]'
    echo '192.168.1.102 - press [c/C]'
    echo '192.168.1.103 - press [d/D]'
    echo '------------------'
    echo 'Press [E/e] to exit'
    echo '------------------'
    echo -n 'Select server: '
    read -n1 s
    echo
    case "$s" in
    "a" | "A")
        ssh [email protected] -p2449 -i ~/.ssh/id_rsa
        ;;
    "b" | "B")
        ssh [email protected] -p3782 -i ~/.ssh/id_rsa
        ;;
    "c" | "C")
        ssh [email protected] -p2881 -i ~/.ssh/id_rsa
        ;;
    "d" | "D")
        ssh [email protected] -p4529 -i ~/.ssh/id_rsa
        ;;
    "e" | "E")
        echo Bye bye!
        exit 0
        ;;
    *)
        printf "\033[0;31mUnknown server...\033[0m\n"
        ;;
    esac
}

while true; do
    select_srv
done

exit 0

Обратите внимание, на шебанг:

#!/data/data/com.termux/files/usr/bin/bash

именно тут рапологается bash в Termux

Попробуем:

Пароль ключа спрашивается только при первом запуске скрипта. Далее набираем sos и получаем лаконичное меню серверов. Достаточно 1 нажатия в любом регистре, для подключения к любому выбранному серверу по ssh. Отключение от текущего сервера возвращает нас снова в меню скрипта sos. Неверный выбор возвращает меню и красноречивую ошибку Unknown server. Для возвращения в Termux жмем E в любом регистре.

Вот пример с парочкой реальных серверов:

UPD: немножко поюзав эту весьма удобную программку, нашел моменты, которых в ней не хватает.

Во-первых добавим приём параметров сразу в командной строке, чтобы для подключения к нужному серверу можно было набирать команду вида: sos b и сразу минуя меню, происходило подключение к нему.

Во-вторых ssh позволяет удаленно выполнять команды, почему бы нам по аргументу u(или выбору в меню u) не получать например состояние uptime всех серверов.

Обновлённый код программки со скринов выше:

#!/data/data/com.termux/files/usr/bin/bash

[ ! "$(ssh-add -l | grep -i rsa)" ] && ssh-add ~/.ssh/id_rsa

select_srv() {
    echo '------------------'
    if [ "$1" ]; then
        s=$1
    else
        echo '192.168.1.100   - press [A] (root)'
        echo '192.168.1.101   - press [B]'
        echo '192.168.1.102   - press [C]'
        echo '192.168.1.103   - press [D]'
        echo '192.168.1.104   - press [X]'
        echo '192.168.1.105   - press [Y] (root)'

        echo '------------------'
        echo 'Press [U] from get uptimes'
        echo 'Press [E] to exit'
        echo '------------------'
        echo -n 'Select server: '
        read -n1 s
        echo -e '\n------------------'
    fi

    case "$s" in
    "a" | "A")
        ssh [email protected] -p2411 -i ~/.ssh/id_rsa
        select_srv
        ;;
    "b" | "B")
        ssh [email protected] -p4433 -i ~/.ssh/id_rsa
        select_srv
        ;;
    "c" | "C")
        ssh [email protected] -p5522 -i ~/.ssh/id_rsa
        select_srv
        ;;
    "d" | "D")
        ssh [email protected] -p2262 -i ~/.ssh/id_rsa
        select_srv
        ;;
    "x" | "X")
        ssh [email protected] -p2277 -i ~/.ssh/id_rsa
        select_srv
        ;;
    "y" | "Y")
        ssh [email protected] -p2678 -i ~/.ssh/id_rsa
        select_srv
        ;;
    "u" | "U")
        echo 'Report from servers:'
        echo '192.168.1.100'
        ssh [email protected] -p2411 -i ~/.ssh/id_rsa uptime
        echo '192.168.1.101'
        ssh [email protected] -p4433 -i ~/.ssh/id_rsa uptime
        echo '192.168.1.102'
        ssh [email protected] -p5522 -i ~/.ssh/id_rsa uptime
        echo '192.168.1.103'
        ssh [email protected] -p2262 -i ~/.ssh/id_rsa uptime
        echo '192.168.1.104'
        ssh [email protected] -p2277 -i ~/.ssh/id_rsa uptime
        echo '192.168.1.105'
        ssh [email protected] -p2678 -i ~/.ssh/id_rsa uptime
        select_srv
        ;;
    "e" | "E")
        echo Bye bye!
        exit 0
        ;;
    *)
        printf "\033[0;31mUnknown server...\033[0m\n"
        select_srv
        ;;
    esac
}

select_srv $1
exit 0

 

 

Оставить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *