Page 1 sur 2
lancer commande dans container vers le host
Publié : 21 sept. 2023, 22:18
par pierrotori
bonsoir
etant sous docker je voulais lancer la commande de demarrage d’un container a partir du container domoticz
est ce faisable et comment ?
pierrotori
Re: lancer commande dans container vers le host
Publié : 27 sept. 2023, 08:47
par pierrotori
Voici la solution que j'utilise pour activer le container VPN et donc executer une commande ou un shell à partir d'un container vers le host
configuration container domoticz statut run et container wireguard statut exited
La solution utilise le pipe de linux
maintenant il faut créer un shell qui va evaluer la commande qui arrive dans le pipe
Code : Tout sélectionner
p_docker=/home/pi/pipe_docker
while true; do eval "$(cat $p_docker)"; done
il faut executer le script au démarrage du serveur en ajoutant dans crontab la command
une fois la structure d'accueil réalisée, il faut remonter le pipe dans le container, pour ca il suffit d'ajouter un volume dans le docker-compose
et ensuite l'utiliser dans un script à volonté sous la forme echo commande > hostpipe
Code : Tout sélectionner
return {
active = true,
on = {
devices = { 'tunnel vpn' },
shellCommandResponses = { 'tunnelvpnon', 'tunnelvpnoff' }
},
logging = {
-- level = domoticz.LOG_INFO, -- Seulement un niveau peut être actif; commenter les autres
-- level = domoticz.LOG_ERROR,
-- level = domoticz.LOG_DEBUG,
-- level = domoticz.LOG_MODULE_EXEC_INFO,
},
-- FUNCTIONS
execute = function(dz, item)
-- PROGRAM STARTS
dz.log('============== SWITCH VPN CALCUL ==============', dz.LOG_INFO)
if item.name == 'tunnel vpn' and item.state == 'On' then
dz.log('VALUE:'..item.name..'-'..item.state, dz.LOG_DEBUG)
dz.executeShellCommand({
command = 'echo docker container start wireguard > /hostpipe',
callback = 'tunnelvpnon',
timeout = 10,
})
elseif item.name == 'tunnel vpn' and item.state == 'Off' then
dz.log('VALUE:'..item.name..'-'..item.state, dz.LOG_DEBUG)
dz.executeShellCommand({
command = 'echo docker container stop wireguard > /hostpipe',
callback = 'tunnelvpnoff',
timeout = 10,
})
elseif item.isShellCommandResponse and item.statusCode == 0 then
if item.trigger == 'tunnelvpnon' then
message='Tunnel VPN On'
dz.helpers.generalNotify(dz, 'INFO', scriptName, message, 'telegram')
elseif item.trigger == 'tunnelvpnoff' then
message='Tunnel VPN Off'
dz.helpers.generalNotify(dz, 'INFO', scriptName, message, 'telegram')
end
elseif item.isShellCommandResponse and item.statusCode ~= 0 then
dz.log('VALUE:'..tostring(item.statusCode), dz.LOG_DEBUG)
message='Tunnel VPN error'
dz.helpers.generalNotify(dz, 'ERROR', scriptName, message, 'telegram')
end
end -- execute
} -- return
on peut aussi executer un shell
ceux qui n'ont pas docker passe l'étape docker-compose et envoie la commande directement dans le pipe
Re: lancer commande dans container vers le host
Publié : 07 févr. 2024, 15:04
par chrisgen
Bonjour , suite à un plantage de mon pi , j' ai décidé de passer (après une auto-formation accélérée ..) sous docker . Je teste ton accès au shell hôte en partant d' un docker . Je précise que je ne suis pas un expert en linux . Après avoir suivi tes indications , j'essaye de lancer une commande (un bash "hello " appelé essai.sh chmod 744) .
J' écris donc dans mon shell docker sous portainer
echo " /home/./essai.sh" >/hostpipe ; (j' ai créé /home/exploit/ ; pipe_docker pipe_docker et essai.sh sont dans home ..)
Je ne vois pas d' affichage dans home ..
Si tu as une idée /orientation merci
lancer commande dans container vers le host
Publié : 07 févr. 2024, 21:32
par pierrotori
est ce que le chemin ou est ton shell et le pipe dans /home est declare en tant que volume dans ton container ?
moi mes shells sont dans /home/pi/exploit
et le pipe est dans /home/pi
les 2 chemins sont declares en tant que volume dans docker-compose
Re: lancer commande dans container vers le host
Publié : 07 févr. 2024, 23:00
par chrisgen
Merci beaucoup pour ta réponse .
Quelques précisions : après mon plantage (qui est en partie de ma faute) j' ai abandonné mon vieux pi2 qui fonctionnait toujours depuis 2015 pour passer sur une boxtv flashée( suite au post de Patdelapampa ).
J' ai installé portainer et je n' ai donc plus de répertoire pi .
J' ai donc fait mkfifo /home/pipe_docker puis chmod744
j' ai créé le fichier exp_pipe_cmd.sh (avec le bon path) que j' ai placé dans /home/exploit/
J' ai déclaré (en sus d' un volume pour domoticz existant )
volumes :
-/home/pipe_docker:/hostpipe
J' ai placé un simple fichier essai.sh dans /home/ et dans /home/exploit/ (au cas ou ..)
sur shell_docker (portainer) je vois bien hostpipe par ls . et pipe_docker sur la machine distante ( dans /home/)
la commande sur le container : echo "/home/exploit/./essai.sh" >hostpipe ne donne rien (ni sur home ni sur exploit)
j' ai rajouté l' option -e , idem . J' ai rajouté dans volumes :/home:/home idem
quel chemin devrais je ajouter ?
Ne voulant pas redémarrer mon "serveur " , j' ai déclaré un crontab ainsi " 32 13 * * * /home/exploit/./exp_pipe_cmd.sh (je voulais tester à partir de 13h 32) Merci pour tes remarques éventuelles
Re: lancer commande dans container vers le host
Publié : 08 févr. 2024, 09:21
par lost
pierrotori a écrit : 27 sept. 2023, 08:47
Voici la solution que j'utilise pour activer le container VPN et donc executer une commande ou un shell à partir d'un container vers le host
(...)
Code : Tout sélectionner
p_docker=/home/pi/pipe_docker
while true; do eval "$(cat $p_docker)"; done
Ouille! Je serais curieux de savoir la charge cpu utilisée par cette boucle qui ne rends jamais la main, mais je pense que ce ne sera pas très différent d'un petit test avec p_docker=/dev/null
Bilan: 25% de cpu là dessus sur un PC Linux quad-core = assez logiquement 1 coeur à 100% là dessus, au temps des simples coeurs tu écroulais la machine complète avec un truc pareil... Si on insère très classiquement un sleep 1 (je ne pense pas que tu souhaites passer plus d'une commande à la seconde) dans la boucle cela redevient négligeable.
Bon, sur le fond, je ne comprends toujours pas ce besoin de coller tout en conteneurs pour violer toujours plus le concept sécuritaire qui a été le besoin initial auquel ils ont répondu: Isoler par sécurité des applis à la confiance relative ou exposées en frontal sur internet.
Chacun fait ce qu'il veut, mais permettre de pouvoir exécuter n'importe quoi du conteneur vers le host c'est dangereux et retire une bonne partie de l'intérêt à l'affaire.
Il vaudrait mieux se faire un jeu de quelques commandes personnalisées, à passer via le pipe, qui soient mappées dans le script via un switch vers des commandes host qui ne permettent de faire que des trucs limités/bien choisis. Genre "REBOOT" reçu via le pipe (pour ne pas se télescoper avec la vraie commande) qui exécute la commande "reboot".
Re: lancer commande dans container vers le host
Publié : 08 févr. 2024, 10:23
par chrisgen
Bonjour @lost :
J' essaye de faire sur docker ce que je faisais avant sur mon ancienne installation cad d' allumer et éteindre mon serveur , de faire fonctionner par exemple remote control (qui est un plus waf) . Cela fonctionnait très bien .
Dans mon docker , je n' arrive pas à mettre ssh que je faisais fonctionner sans passwd avec un utilisateur restreint dans ses droits .. Je cherche donc une solution pour lancer des bashs d' un docker , et teste la solution de @Pierrotori que je n' arrive pas à faire fonctionner . Concernant le programme
p_docker=/home/pi/pipe_docker
while true; do eval "$(cat $p_docker)"; done ,
chez moi sur mon "quatre cores de course" ( boxtv flashée) , je ne vois pas la différence (je suis à 8% avec 9 containers qui tournent sans variation avec ou sans la boucle)
Merci pour toutes éventuelles orientations à la recherche du bash perdu ! .
lancer commande dans container vers le host
Publié : 08 févr. 2024, 18:57
par pierrotori
tu as bien créé le fichier sh avec un touch fichier.sh pour ne pas avoir les retours chariots et être en utf -8
ensuite voici le code complet
Code : Tout sélectionner
#!/bin/bash
# init variable
# mkfifo /path/to/pipe/mypipe
p_docker=/home/pi/pipe_docker
while true; do eval "$(cat $p_docker)"; done
pour la boucle je n'ai pas constaté de monté de CPU
Code : Tout sélectionner
ps -eaf|grep pipe # tu récupères les 2 pid
top -p 422,426 # avec les 2 pid
tu constateras qu'il consomme 0 cpu
j'ai 7 containers avec 50 scripts dzvents et mon rpi2 tourne entre 1.5 % et 2% de CPU et un load average: 0,07, 0,15, 0,12
Re: lancer commande dans container vers le host
Publié : 08 févr. 2024, 21:25
par chrisgen
Bonsoir ,merci pour ta réponse
Comment détermines tu pid 422 et 426 (qui sont je suppose les pids qui passent par le tube)?
Par ailleurs la suite du code , je pense (?) devoir le coller à la suite dans exp_pipe_cmd.sh .
Si j' ai bien interprété le code :(en simplifiant à mon niveau)
On examine les processus passant par le pipe ; on spécifie deux pids particuliers (?).
je vais tester mais peut-être que les pids 422 et 426 ne sont pas les bons ..
Re: lancer commande dans container vers le host
Publié : 08 févr. 2024, 21:40
par chrisgen
Après réflexion (je suis un peu lent et pas expert en linux) sauf erreur les 2 dernières lignes étaient pour montrer l' absence de consommation cpu ( pour @lost) , ne tiens donc pas compte de mes remarques sur les pids (sauf si je suis dans l' erreur)