Блог

Выполнение команд на хосте из docker

После переноса home assistant в docker возникла проблема выполнения команд на хосте, в частности разные сенсоры на платформе command_line не работают. Нашел здесь статью как обойти это препятствие, но данный метод работает только до перезагрузки машины или обновления системы. Так происходит потому что docker при старте контейнера создает систему заново и папка в которой находятся ключи оказывается пустой. Чтобы этого не происходило нужно поместить ключи в место которое позволит пережить перезагрузку. Наилучший кандидат - папка /config.

Идем в Portainer и открываем консоль homeassistant

Убеждаемся что мы находимся в нужном месте и создаем папку для ключей

bash-5.0# pwd /config bash-5.0# mkdir.ssh

Генерируем ключи.

На первый вопрос указываем путь в новой папке /config/.ssh/id_rsa, остальные можно пропустить просто нажав на enter.

bash-5.0# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): /config/.ssh/id_rsa Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /config/.ssh/id_rsa Your public key has been saved in /config/.ssh/id_rsa.pub The key fingerprint is: SHA256:8neI8Pc6 /sMPbE/ sv5LU6RTE9lHdBeUInTOgSpQF0 root@raspberrypi The key's randomart image is: ---[RSA 3072]---- |....Eo.* B| |... = | |... = o| |. = = | | o S *.| | =... | | o = | | o.o o o| | o= =**B| ----[SHA256]-----

Копируем ключи на хост. Соответственно указываем своего пользователя и ip хоста

bash-5.0# ssh-copy-id -i /config/.ssh/id_rsa.pub pi@192.168.1.168 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/config/.ssh/id_rsa.pub" /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed expr: warning: '^ERROR: ': using '^' as the first character of a basic regular expression is not portable; it is ignored /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys pi@192.168.1.168's password: Number of key(s) added: 1

Теперь нужно выполнить любую команду на хосте чтобы создался файл /root/.ssh/known_hosts.

bash-5.0# ssh -i /config/.ssh/id_rsa.pub pi@192.168.1.168 ls The authenticity of host '192.168.1.168 (192.168.1.168)' can't be established. ECDSA key fingerprint is SHA256:esNSH5VhKGbxyB61fmGgoHFv1f7L2S2l57NRPYDbAP8. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '192.168.1.168' (ECDSA) to the list of known hosts.

Копируем этот файл в новую папку.

bash-5.0# cp /root/.ssh/known_hosts /config/.ssh/known_hosts

Теперь создадим файл конфигурации

bash-5.0# touch /config/.ssh/conf

И добавим в него следующе содержимое:

Host hass HostName 192.168.1.168 User pi IdentityFile /config/.ssh/id_rsa UserKnownHostsFile /config/.ssh/known_hosts

Теперь можно из docker выполнять команды вида ssh -F /config/.ssh/conf hass cmd без ввода пароля

Например узнать температуру процессора на raspberry pi:

bash-5.0# ssh -F /config/.ssh/conf hass cat /sys/class/thermal/thermal_zone0/temp 46738

В Home assistant это будет выглядеть так:

- platform: command_line name: pi_temperature scan_interval: 300 command: ssh -F /config/.ssh/conf hass 'cat /sys/class/thermal/thermal_zone0/temp' value_template: '{{ value | multiply(0.001) | round(2) }}' unit_of_measurement: '°C'


подскажите... мне надо чтоб после обновления хом асистента автоматически выполнялась команда
pip install pytuya
можно это как то реализовать?

Не совсем понятно. Под обновлением имеется ввиду переход на новую версию? Команда должна выполняться на хосте или в docker?

Следуя инструкции сталкиваюсь с проблемой, после генерации ключа система ругается, что ключ "слишком открытый" 

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@ WARNING: UNPROTECTED PRIVATE KEY FILE! @

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

Permissions 0644 for '/config/.ssh/id_rsa.pub' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/config/.ssh/id_rsa.pub": bad permissions

меняю: chmod 700 /config/.ssh/id_rsa.pub

получаю: bash-5.0# ssh -i /config/.ssh/id_rsa.pub pi@192.168.0.12 ls
Load key "/config/.ssh/id_rsa.pub": invalid format

Как у Вас установлена система?


chmod выполняете из консоли контейнера или на хосте?


Supervised, в консоле контейнера все делаю

попробуйте chmod 400

без изменений, invalid format

upd: ssh -i /config/.ssh/id_rsa pi@192.168.0.12 ls - прошло, без ".pub"

Вместо рекомендованной в инструкции команды "

ssh -i /config/.ssh/id_rsa.pub pi@192.168.1.168 ls " выполните  то, что пишет на экране после выполнения команда  "

ssh-copy-id "


: "ssh 'pi@192.168.1.168'" (со своими юзером и IP) а потом exit. 


Все сработает.

Доброго времени.
Подскажите пожалуйста, после выполнения команды:

ssh-copy-id -i /config/.ssh/id_rsa.pub pi@192.168.1.250

выдает ошибку:

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/config/.ssh/id_rsa.pub"
mktemp: (null): No such file or directory
/usr/bin/ssh-copy-id: ERROR: failed to create required temporary directory under ~/.ssh

Что можно сделать?

Вернуться назад
Вернуться назад