6 votes

Empêcher sudo, apt-get, etc. d'avaler les entrées collées sur STDIN ?

J'écris souvent des instructions wiki pour installer divers paquets serveur sur Ubuntu (11.10 Oneiric pour le moment). Elles impliquent toujours des choses comme :

sudo apt-get install -y postfix
sudo cp ~/siteconfig/etc/postfix/main.cf /etc/postfix

mais lorsque vous faites un copier-coller dans un terminal, sudo, apt-get, ou une autre sous-séquence avalent aléatoirement les lignes d'entrée suivantes, et seul le champ apt-get install arrive.

Y a-t-il un moyen de rendre ce document plus facile à copier-coller ? Je suppose que je pourrais envelopper chaque section avec

cat > script <<EOF
apt-get install -y postfix
cp ~/siteconfig/etc/postfix/main.cf /etc/postfix
EOF
sudo sh ./script

mais y a-t-il un meilleur moyen ?

0 votes

Utilisez-vous un outil de gestion de la configuration pour ce genre de choses ?

9voto

Mark Plotnick Points 671

Il y a un rapport de bogue en cours à ce sujet : Rapport de bogue Debian n° 728775 - apt-get consomme des entrées de façon injustifiée . Le rapport dit :

Lorsqu'apt-get est invoqué d'une manière qui implique l'installation d'un fichier paquet, il lit toutes les données disponibles sur l'entrée standard, quel que soit le besoin réel. Cela rompt la capacité habituelle, lors d'un Shell interactif, de taper la commande suivante pendant que la commande actuelle est en cours d'exécution : apt-get consomme l'entrée qui était destinée à la Shell. strace montre que la commande entrée est lue par le processus apt-get de niveau supérieur, par read(2) depuis fd 0, en réponse à pselect(2).
...
C'est dans pkgDPkgPM::Go() dans apt-pkg/deb/dpkgpm.cc. Plus loin dans la même fonction, il y a une boucle pselect qui correspond à ce que j'ai vu avec strace. Elle lit à partir de stdin sous réserve uniquement de (master >= 0 && !d->stdin_is_dev_null)

Et dans une réponse :

C'est pour éviter que quelqu'un tape sa prochaine commande pendant que les paquets sont en train de téléchargements, mais que cette entrée soit ensuite utilisée comme réponse à une pendant l'installation.

Une solution de contournement pour vous, puisque vous donnez déjà apt-get le site -y si l'on ne veut pas qu'il pose des questions ou lise les réponses, est de rediriger stdin vers /dev/null. Lorsque je fais ce qui suit :

apt-get install -y gdb-doc < /dev/null

mon typeahead pendant l'exécution du apt-get n'est pas effacée.

6voto

aculich Points 3460

Une façon d'éviter le problème du copier-coller, ainsi que d'exécuter les commandes l'une après l'autre en toute sécurité, est de les placer sur la même ligne en les séparant par && qui n'exécutera que le cp sur l'achèvement réussi de la sudo apt-get install :

sudo apt-get install -y postfix && sudo cp ~/siteconfig/etc/postfix/main.cf /etc/postfix

Après tout, si la première commande échoue, vous ne voulez probablement pas continuer à exécuter les autres commandes.

Quant à la raison pour laquelle les commandes sont avalées lorsque vous collez plusieurs lignes à la fois... lorsque postfix est installé, il pose des questions de configuration avec le frontal de dialogue debconf qui est probablement ce qui interfère avec le couper-coller. Peut-être qu'un frontal différent comme readline ou non interactif interférerait moins ? Quoi qu'il en soit, j'utiliserais l'option && de toute façon, car elle est plus sûre.

Si vous installez postfix avec vos scripts, il semble que vous essayez peut-être d'automatiser l'installation de nouveaux systèmes ? Si c'est le cas, envisagez d'utiliser pré-ensemencement comme une option (voici quelques Documentation spécifique à Ubuntu 11.10 ) ou peut-être utiliser Marionnette ?

1 votes

Oui, je me dirige vers un outil de configuration (et j'utilise actuellement le preseeding pour certaines choses), mais je pense que c'est un cas général qui va continuer à se produire - il y aura toujours des instructions wiki multilignes. Je suppose que je pourrais ajouter && \ à la fin de chaque ligne, c'est peut-être la meilleure façon

0 votes

Les scripts Shell sont parfaits pour les choses rapides et sales, mais je préfère écrire des Shell en utilisant Python / Fabric / Puppet qui, ensemble, construisent un système beaucoup plus gérable avec une meilleure gestion des exceptions / erreurs et une syntaxe plus saine que ce que vous avez à gérer dans les monstrueux Shell Shell.

2voto

SystemParadox Points 807

Pour apt-get, je trouve que yes fonctionne mieux que -y :

yes | apt-get install postfix

0voto

Khaled Points 35208

Si votre problème est lié à apt-get install vous pouvez essayer ce qui suit :

sudo apt-get install -y -q=2 postfix
sudo cp ~/siteconfig/etc/postfix/main.cf /etc/postfix

0voto

ghoti Points 765

Je ne sais pas pourquoi cela se produit avec votre pâte. Cela n'arrive pas avec moi.

La solution est peut-être sociale, plutôt que technique.

Écrivez vos commandes sur une ligne à part, en les séparant de la documentation :


Tout d'abord, nous installons postfix :

    sudo apt-get install -y postfix

Ensuite, nous récupérons sa configuration :

    sudo cp ~/siteconfig/etc/postfix/main.cf /etc/postfix

Si les gens sont obligés de couper-coller ligne par ligne, le problème de la "ligne suivante" disparaît. Et plus de documentation n'est jamais une mauvaise chose :)

0 votes

S'il vous plaît, ne faites pas cela. Il est tellement pénible d'être obligé de copier manuellement ligne par ligne. Si vous intercalez de la documentation, utilisez les Shell-commentaires.

0 votes

@SystemParadox - alors le problème initial de l'OP demeure. Faire de l'administration système par copier-coller est une mauvaise idée. Si cela ne fonctionne pas en premier lieu pour l'utilisateur, tant mieux. Le fait de rendre cette pratique pénible contribue à la décourager.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X