En 'bash', comment faire

[quote=“MisterFreez”]Tu crée un fifo
Tu donne ce fifo en entrée d’apt-get
Tu fais ton read etc
Tu écris dans le fifo pour piloter apt-get[/quote]
Heu ! c’est quoi un “fifo” ?

Je te renvoie à la doc : linux-kheops.com/doc/man/man … ifo.3.html
Je serais plus causant demain avec un clavier que je maîtrise mieux :slightly_smiling:

OK, prends ton temps car de ce que j’ai lu dans le lien, je ne comprends strictement rien.
Sois gentil de m’expliquer par un exemple.
Merci :006

C'est rediriger la sortie standard de "echo" vers l'entrée standard de "mon_programme" mon programme au moyen d'un pipe.
Un pipe d'un point de vu fonctionnel c'est un tampon fifo (first in, first ou), c'est à dire que si tu écris "coucou" puis "hello" dans un pipe, le programme qui le lie va lire "coucou" puis "hello" (il existe des fonctionnement différents).

La commande mkfifo permet de créer comme un pipe mais nommé, il apparaît dans le système de fichier. Tu peut alors remplacer la commande si dessus par :
[code]mkfifo monFIFO
echo "coucou" >> monFIFO
mon_programme < monFIFO[/code]

Dans ton cas tu devrais pouvoir faire ça :
[code]#!/bin/bash
FIFO="monFIFO"
mkfifo "${FIFO}"
sudo apt-get upgrade < "${FIFO}" &
# ici tu va avoir un problème que je te laisse résoudre (pas le temps de regarder plus en détail)
# il faut que sudo exécute bien la commande : « apt-get upgrade < "${FIFO}" & » et pas simplement « apt-get upgrade »
read -n1
if [ "${REPLY}" == 'p' ] ; then
    echo 'p' >> "${FIFO}"
    echo "c'est bon"
fi[/code]

C’est rediriger la sortie standard de “echo” vers l’entrée standard de “mon_programme” mon programme au moyen d’un pipe.
Un pipe d’un point de vu fonctionnel c’est un tampon fifo (first in, first ou), c’est à dire que si tu écris “coucou” puis “hello” dans un pipe, le programme qui le lie va lire “coucou” puis “hello” (il existe des fonctionnement différents).

La commande mkfifo permet de créer comme un pipe mais nommé, il apparaît dans le système de fichier. Tu peut alors remplacer la commande si dessus par :

mkfifo monFIFO echo "coucou" >> monFIFO mon_programme < monFIFO

Dans ton cas tu devrais pouvoir faire ça :

[code]#!/bin/bash
FIFO="monFIFO"
mkfifo "${FIFO}"
sudo apt-get upgrade < “${FIFO}” &

ici tu va avoir un problème que je te laisse résoudre (pas le temps de regarder plus en détail)

il faut que sudo exécute bien la commande : « apt-get upgrade < “${FIFO}” & » et pas simplement « apt-get upgrade »

read -n1
if [ “${REPLY}” == ‘p’ ] ; then
echo ‘p’ >> "${FIFO}"
echo "c’est bon"
fi[/code]

Merci, ça c’est de l’explication :023
Je ne vais pas trop avoir de temps aujourd’hui car ==> dentiste :005
mais je testerai rapidement et je donnerai le résultat ici.
:006

J’ai commencé un test ce soir avec ce script d’essai : fifo

[code]#!/bin/bash

pour vider les anciens ‘epingles’

sudo sed -i~ ‘/^Explanation:/,$d’ /etc/apt/preferences
sudo tail -30 /etc/apt/preferences
sleep 2

pour supprimer le fichier ‘monFIFO’ créé précédemment

sudo rm -f /home/ricardo/monFIFO

sudo apt-get update

FIFO="monFIFO"
mkfifo "${FIFO}"
echo
echo "TEST mkfifo est passe"
echo
sleep 2
sudo apt-get upgrade < “${FIFO}” &

ici tu va avoir un problème que je te laisse résoudre (pas le temps de regarder plus en détail)

il faut que sudo exécute bien la commande : « apt-get upgrade < “${FIFO}” & » et pas simplement « apt-get upgrade »

read -n1
if [ “${REPLY}” == ‘p’ ] ; then
echo ‘p’ >> "${FIFO}"
echo "c’est bon"
fi[/code]
Ça bloque après
echo "TEST mkfifo est passe"
echo
sleep 2

même upgrade seul ne se fait pas.

C’est normal. Sudo te demande un mot de passe mais comme tu l’a lancé en arrière plan il n’a pas la main.
Je préfère utiliser su dans ces cas là.

Mais du coup il faut entrer le mot de passe root.

Avec sudo je ne sais pas trop comment faire il faut faire des tests. :slightly_smiling:

bash: : Aucun fichier ou dossier de ce type
Il arrive au même endroit mais ne trouve pas ‘quel fichier’ ?
Je suppose que c’est 'monFIFO’
Si oui, je le vois (0 oct) dans ~/
Il y a une histoire de chemin ?
il faudrait ptet que je lance la commande directement en tant que root au départ ?

Dès que j’ai du temps, je met tout ça un peu en forme dans une preuve de concept.

Ce n’est pas pressé, merci :006

[code]#!/bin/bash

TMPDIR=$(mktemp -d)
FIFO="${TMPDIR}/monFIFO"

mkfifo “${FIFO}”

cat -n < “${FIFO}” &
echo 'On va attendre 1s’
sleep 1
echo 'Puis on écris dans le fifo’
echo -n 'écrivez quelque chose : '
read
echo “${REPLY}” > “${FIFO}”

rm -rf “${TMPDIR}”[/code]
Mon premier exemple (il ne gère pas sudo c’est juste pour illustrer l’utilisation du fifo).
[ul]
[li]On crée le fifo[/li]
[li]on lance cat en lui donnant le fifo à manger (l’option -n permet de numéroter le lignes ce qui permet de bien différencier qui écris quoi sur le terminal)[/li]
[li]On attend un peu pour le style[/li]
[li]On lit une entrée au clavier, on envoie ce qu’on viens de lire dans le fifo[/li]
[li]Ça ressort de l’autre coté et cat nous affiche ce que l’on viens d’écrire[/li][/ul]

Du coup pour ton cas à toi, il suffit de remplacer la commande :

par l’upgrade qui va bien (et qui se lance en arrière plan) et de faire un peu de vérification avant d’écrire dans le FIFO (mais il faut toujours y écrire :slightly_smiling:.

Le man de sudo donne cet exemple (pas idiot) :

Donc tu devrais pouvoir faire ça :

Du coup pour ton script de tout en haut :

[code]#!/bin/bash

pour vider les anciens ‘epingles’

sudo sed -i~ ‘/^Explanation:/,$d’ /etc/apt/preferences
sudo tail -30 /etc/apt/preferences
sleep 2

Je met ma gestion des FIFO parce que je l’aime bien

TMPDIR="$(mktemp -d)“
FIFO=”${TMPDIR}/monFIFO"

mkfifo "${FIFO}"
echo
echo "TEST mkfifo est passe"
echo
sleep 2
sudo sh -c “apt-get upgrade < ${FIFO} &”

read -n1
if [ “${REPLY}” == ‘p’ ] ; then
echo ‘p’ > "${FIFO}"
echo "c’est bon"
else
echo > "${FIFO}"
fi

rm -rf “${TMPDIR}”[/code]

Ça par contre je ne l’ai pas testé, je te laisse le soin de le faire :slightly_smiling:

Test :
J’ai fait un copié/collé de ta proposition mais la réaction attendue ne vient pas.
J’arrive à
TEST mkfifo est passe
et là : ça bloque
au bout de 10 sec , pour tester, je tape ‘p’
il repart pour arriver à
pc’est bon (le ‘p’ que j’ai entré suivi de ‘c’est bon’)
puis, dans la foulée
Lecture des listes de paquets… Fait
Construction de l’arbre des dépendances

pour arriver à :
Les paquets suivants seront mis à jour :
blabla
Souhaitez-vous continuer [O/n] ?

je tape sur “entree”
Annulation.
retour à l’invite
ricardo@sid-sda8:~$
Le Oui n’a pas été pris en compte pour continuer upgrade :017

En fait, il attend une réponse après 'sudo sh -c "apt-get upgrade < ${FIFO} &“
J’ai refait le test et j’ai tapé sur 'entree”. Là, upgrade a été jusqu’à la fin car il n’y avait pas de paquets à épingler.
Donc, à mon avis, il faut impérativement taper “entree” pour que upgrade commence. Reste à savoir si, arrivé à une demande de listbugs où il faudra taper ‘p’, il le prendra en compte.
Pour le tester, je peux faire un dist-upgrade à la place car là, il y a toujours des ‘pinnages’ à faire. Seulement, je ne tiens pas à ce que ça aboutisse. Comment je peux faire pour stopper la chose au cas où le ‘p’ de répondrait pas ???

[quote]#!/bin/bash

pour vider les anciens ‘epingles’

sudo sed -i~ ‘/^Explanation:/,$d’ /etc/apt/preferences
sudo tail -30 /etc/apt/preferences
sleep 2

Je met ma gestion des FIFO parce que je l’aime bien

TMPDIR="$(mktemp -d)“
FIFO=”${TMPDIR}/monFIFO"

mkfifo "${FIFO}"
echo
echo "TEST mkfifo est passe"
echo
sleep 2
sudo sh -c “apt-get upgrade < ${FIFO} &”
# C’EST ICI QU’IL ATTEND UNE ENTREE
read -n1
if [ “${REPLY}” == ‘p’ ] ; then
echo ‘p’ > "${FIFO}"
echo "c’est bon"
else
echo > "${FIFO}"
fi[/quote]

(N’utilisant pas listbugs, je peux avoir loupé quelque chose, auquel cas, ne pas trop tenir compte de ce post ^^")

Je comprends pas trop l’usage de mkfifo dans ce script; pourquoi ne pas utiliser un here-document?
Exemple de code:

[code]#!/bin/sh

[…]

apt-get upgrade << EOF
\r
EOF

[…]

[/code]

Que je sache, mais je ne suis pas un spécialiste, tu ne peux pas écrire de code dans ce type de document. Si j’ai bien compris ce que cherche à faire ricardo, il veut exécuter apt-get et vérifier ce que l’utilisateur entre au clavier avant de laisser apte finir son boulot.

Oui, je laisse tomber car j’ai tenté toutes les possibilités et ça ne colle pas, il faudrait rentrer dans le script de apt-litbugs (en ruby ?)mais ça ne vaut pas le coup.