Подключение к Raspberry Pi с использованием SSH-ключей

Эта инструкция позволит вам быстро подключаться к Raspberry Pi. Всего за одну секунду. Без ввода пароля.

Базовые сведения по работе с SSH вы можете найти в разделе Доступ по SSH к Raspberry Pi. А в этом разделе вы найдёте расширенную информацию по использованию SSH, а также ряд рекомендаций по использованию SSH при работе с Клевером.

Общая информация

SSH (англ. secure shell — "безопасная оболочка") - сетевой протокол, позволяющий удалённо управлять операционной системой на компьютере, к которому вы подключились. Аналогичен такому протоколу, как telnet, но позволяет выполнять шифрование сетевого трафика по время взаимодействия. Таким образом передача паролей и другой секретной информации оказываются скрыты. Операционная система Raspberry Pi поддерживает взаимодействие по SSH, как и многие другие распространённые системы на базе Linux.

SSH позволяет не только организовывать работу в командной оболочке, но и передавать файлы, а также туннелировать передаваемые данные других протоколов, например информацию с видеокамеры или телеметрию. Кроме того, SSH поддерживает несколько режимов аутентификации (то есть проверки подключающегося пользователя), с его помощью возможно подключение к Клеверу не только с использованием пароля, но и беспарольный доступ (аутентификация по ключевой паре, т.е. SSH-ключи).

Аутентификация по паролю

Аутентификация по паролю на образе RPi для Клевера включена и пароль может быть использован для входа в командную оболочку мини-компьютера. На ЭВМ с операционными системами Linux (и в первую очередь на серверах, подключенных к интернету) возможность входа по паролю обычно отключают, поскольку есть более безопасный способ аутентификации.

Вход в Клевер по паролю отключать не рекомендуется, поскольку можно совсем утратить доступ к командной оболочке по сети.

При первом подключении к RPi пользователю показывается уведомление с предложением сохранить уникальный отпечаток fingerprint. Сохранённая информация накапливается на компьютерах с которых выполняется вход по SSH на RPi, и проверяется на внезапную подмену.

В ОС Linux и Unix (Mac OS) в текстовом SSH-клиенте первое подключение к RPi выглядит таким образом:

ssh pi@192.168.11.1
# The authenticity of host '192.168.11.1 (192.168.11.1)' can't be established.
# ED25519 key fingerprint is SHA256:4w/7MqTgrtsqPwKnVAMISpouaOJNqzUew2NkJjldMWI.
# This key is not known by any other names
# Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
# Warning: Permanently added '192.168.11.1' (ED25519) to the list of known hosts.
# pi@192.168.11.1's password: *********
# Linux clover-3270 5.10.17-v7l+ #1414 SMP Fri Apr 30 13:20:47 BST 2021 armv7l

whoami
# pi

exit

В графических программах в Windows у вас будут периодически возникать окошки с похожими предупреждениями.

Сохранение отпечатка в Windows

В Windows 10 появился встроенный SSH-клиент, который можно запускать из командной строки, см. руководство по использованию от Microsoft по этой ссылке.

Аутентификация с использованием SSH-ключей

SSH-ключи - это удобный, быстрый альтернативный способ подключения к Raspberry Pi, для которого не требуется ввод пароля. В частности, при эксплуатации Клевера такой способ удобен потому, что экономит время, а значит и заряд аккумулятора, и лимит времени отведённого на мероприятия в полётных зонах. Кроме того, использование SSH-ключей открывает возможности по удобному использованию других программ, которыми бы вы вряд-ли воспользовались бы при необходимости всякий раз набирать пароль.

SSH-ключ делится на две части: пара состоит из т.н. закрытого и открытого ключа. Ключ однократно генерируется. Одна часть ключа (открытая) однократно передаётся на удалённый компьютер к которому будет выполняться подключение, вторая часть ключа (закрытая) хранится на компьютере, который будет подключаться, закрытая часть ключа никуда не передаётся.

Открытый ключ однократно копируется на Raspberry Pi, а закрытый ключ сохраняется в ноутбуке в виде файла.

Подготовка

Для того, чтобы пара ключей появилась, её необходимо сгенерировать. В ОС Linux и Unix (Mac OS) есть программа ssh-keygen с помощью которой мы и получим нужную нам пару ключей (внимание! команды выполняются не в Raspberry Pi, и не в виртуальной машине симулятора Gazebo, а в командной оболочке ноутбука с которого вы будете подключаться к Клеверу):

Прежде чем пользоваться ключами, необходимо выполнить ряд действий для настройки прав доступа на ноутбуке:

# однократная настойка прав доступа к пользовательским директориям
chmod o-rwx $HOME
mkdir ~/.ssh
chmod g-rwx,o-rwx ~/.ssh
touch ~/.ssh/config ~/.ssh/known_hosts
chmod 600 ~/.ssh/config ~/.ssh/known_hosts

Директория .ssh в домашней папке пользователя - это стандартное место хранения и ключевых пар, и настроек подключения с использованием SSH, поэтому доступ к ней запрещаем группе Others (посторонние). Современные дистрибутивы Linux проверяют права доступа к файлам в директории .ssh и могут отказать в аутентификации по ключевым парам.

Генерация пары SSH-ключей

Генерируем пару SSH-ключей в директории ~/.ssh на ноутбуке:

ssh-keygen -f ~/.ssh/id_clover -C "SSH key for Clover" -N ""
# Your identification has been saved in /home/galina/.ssh/id_clover
# Your public key has been saved in /home/galina/.ssh/id_clover.pub

chmod 400 ~/.ssh/id_clover*

Копирование SSH-ключа на Raspberry Pi

После чего подключаемся к Raspberry Pi по Wi-Fi и продолжаем вводить команды на ноутбуке для копирования ключа на мини-компьютер:

ssh-copy-id -i ~/.ssh/id_clover.pub pi@192.168.11.1
# pi@192.168.11.1's password: *********

В результате с ноутбука на микрокомпьютер RPi будет скопирована т.н. открытая часть ключа, а закрытая останется на ноутбуке. Для проверки подключения без ввода пароля используем команду с указанием пути где находится SSH-ключ:

ssh -i ~/.ssh/id_clover pi@192.168.11.1

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

pi@clover-3270:~ $ exit
# logout
# Connection to 192.168.11.1 closed.

galina@Thinkpad-X1:~/.ssh$

Настройка SSH-подключения к Клеверу

Теперь давайте настроим SSH-терминал таким образом, чтобы не приходилось всякий раз вписывать путь к закрытому ключу. Это делается с помощью редактирования файла ~/.ssh/config на ноутбуке. Откройте файл в текстовом редакторе и добавьте в файл следующие строки (если там уже есть какая-то информация, то поместите их в конец файла):

Host 192.168.11.1
    User pi
    IdentityFile ~/.ssh/id_clover
    PreferredAuthentications publickey,password
    PubkeyAuthentication yes
    PasswordAuthentication yes
    ConnectTimeout 1
    TCPKeepAlive yes
    ServerAliveInterval 2
    ServerAliveCountMax 3
    StrictHostKeyChecking no

Эта настройка:

  • влияет на работу SSH-терминала при подключении к компьютеру с ip-адресом 192.168.11.1;
  • если имя пользователя не указано, то автоматически будет использоваться имя pi;
  • будет автоматически использоваться приватный ключ ~/.ssh/id_clover;
  • если ключ по каким-то причинам не подойдёт (был заменён на одном ноутбуке, но забыт заменить на другом), то SSH-терминал перейдёт к аутентификации по паролю (настройки PreferredAuthentications, PubkeyAuthentication, PasswordAuthentication);
  • если связь с RPi не может установиться (WiFi ещё не включился), то SSH-подключение не зависнет, а быстро завершится (настройка ConnectTimeout);
  • если связь с RPi будет внезапно разорвана, то SSH-подключение не зависнет, а быстро завершится (настройки TCPKeepAlive, ServerAliveInterval, ServerAliveCountMax);
  • уникальные SSH-отпечатки RPi-микрокомпьютеров (fingerprints) о которых упоминалось выше, проверяться больше не будут (настройка StrictHostKeyChecking).

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

Если у вас в лаборатории несколько дронов на базе Raspberry Pi, и несколько ноутбуков, то можно однократно сгенерировать SSH-ключи, скопировать их на все дроны и разложить по всем ноутбукам, тогда с любого ноутбука можно будет быстро зайти на любой из дронов.

Теперь, чтобы подключиться к RPi из терминала Linux вам достаточно набрать ssh 1[TAB][TAB][ENTER] и ip-адрес 192.168.11.1 автоматически дополнится в командной строке, т.к. командная оболочка использует адреса из файла ~/.ssh/config и способна "угадать" ваши намерения для подключения к Клеверу. Нажав ввод вы мгновенно окажетесь в терминале RPi.

Графические программы для Windows, которые поддерживают работу с SSH-ключами, которыми вы можете воспользоваться: PuTTY и MobaXterm.

Копирование файлов при помощи SSH

Чтобы скопировать файл circle_flight.py с ноутбука на RPi в домашнюю папку пользователя pi можно также воспользоваться SSH. Для этого наберите в командной оболочке команду:

# сначала указываем 'что' копируем, а потом 'куда'
scp circle_flight.py 192.168.11.1

Для того, чтобы скопировать файл output.avi c RPi из папки examples на ноутбук используем похожую команду:

# после символа ':' (двоеточие) можно указать путь на удалённом компьютере
# путь указанный как './' означает текущую папку, куда будет скопирован файл
scp 192.168.11.1:examples/output.avi ./

Удалённый запуск команд по SSH

Чтобы запустить команду с ноутбука на RPi (то есть удалённо) можно также воспользоваться SSH.

Команда выключения Raspberry:

ssh 192.168.11.1 'sudo shutdown now'

Пример команды запуска Python-скрипта:

ssh -t 192.168.11.1 'ROS_HOSTNAME=`hostname`.local && . /opt/ros/noetic/setup.bash && . /home/pi/catkin_ws/devel/setup.bash && python3 examples/get_telemetry.py'

Для того, чтобы удалённо запустить запись видео можно выполнить команду:

ssh -t 192.168.11.1 'ROS_HOSTNAME=`hostname`.local && . /opt/ros/noetic/setup.bash && . /home/pi/catkin_ws/devel/setup.bash && rosrun image_view video_recorder image:=/main_camera/image_raw'

results matching ""

    No results matching ""