Linux pipe avec plusieurs programmes demandant une entrée utilisateur

Je me demande comment créer une pipe

program 1 | ... | program N 

où plusieurs des programmes demandent une entrée utilisateur. Le problème est que | démarre les programmes en parallèle et commence donc à lire en parallèle sur le terminal.

Pour de tels cas, il serait utile d’avoir un tuyau | cela démarre le programme (i + 1) seulement après que le programme ait produit une sortie.

Modifier:

Exemple:

 cat /dev/sda | bzip2 | gpg -c | ssh user@host 'cat > backup' 

Ici, gpg -c et ssh demandent un mot de passe.

Une solution de contournement pour cet exemple particulier serait la création de paires de clés ssh, mais cela n’est pas possible sur tous les systèmes, et je me demandais s’il existait une solution générale. En outre, gpg permet à la phrase secrète d’être transmise en tant qu’argument de ligne de commande, mais cela n’est pas suggéré pour des raisons de sécurité.

Vous pouvez utiliser cette construction:

 (read a; echo "$a"; cat) > file 

Par exemple:

 $ (read a; echo "$a"; echo cat is started > /dev/stderr; cat) > file 1 cat is started 2 3 

Ici, 1 , 2 et 3 ont été entrés depuis le clavier; cat is started été écrit par écho.

Contenu du file après exécution de la commande:

 $ cat file 1 2 3 

J’utilise maintenant:

 #!/bin/bash sudo echo "I am root!" sudo cat /dev/disk0 | bzip2 | gpg -c | (read -n 1 a; (echo -n "$a"; cat) | ssh user@host 'cat > backup') 

Le premier sudo empêchera le second de redemander le mot de passe. Comme suggéré ci-dessus, la read reporte le démarrage de ssh. J’ai utilisé -n 1 pour read car je ne veux pas attendre newline, et -n pour que l’ echo surpresse la nouvelle ligne.

pour un, vous pouvez donner le mot de passe à gpg avec l’option --passphrase .

Pour ssh, la meilleure solution serait de se connecter par clé. Mais si vous avez besoin de faire par mot de passe la commande expect sera bonne. Voici un bon exemple: Utilisez le script attend en bash pour fournir un mot de passe à la commande SSH

Attendez-vous aussi vous permet d’avoir des entrées – donc si vous ne voulez pas coder en dur vos mots de passe, cela pourrait être la voie à suivre.

J’ai eu besoin de quelque chose de similaire quelques fois auparavant, où la première commande dans le pipeline nécessite la saisie d’un mot de passe, et la commande suivante ne le fait pas automatiquement (comme c’est less cas).

Semblable à la réponse d’Igor, je trouve que l’utilisation de read dans un sous-shell est utile:

 cmd1 | ( read; cat - | cmd2 )