web-dev-qa-db-fra.com

Essayer de passer deux variables dans un script bash

J'essaie de faire fonctionner le script suivant pour la commande ufw qui attend de moi que j'appuie sur y ou n pour confirmer ma commande. De plus, je souhaite transmettre mon mot de passe à la commande Sudo (je sais, mauvaise idée).

echo 'y' | { echo 'my password'; } | Sudo ufw reset

Le bit de mot de passe Sudo fonctionne, mais le message d'erreur suivant de la commande ufw reset s'affiche:

Resetting all rules to installed defaults. Proceed with operation (y|n)? Aborted

La commande est annulée plutôt que d'accepter le "y" que j'essayais de l'envoyer. Quelqu'un peut-il me dire ce que je fais mal?

4
Robert Baker

Vous dirigez le y vers echo 'my password', pas vers Sudo.

Utilisez le bloc pour regrouper les deux échos:

{ echo 'my password' ; echo y ; } | Sudo ufw reset

Sudo lit normalement le mot de passe depuis un terminal, pas stdin, à moins que vous ne fournissiez l’option -S.

11
choroba

Vous pouvez y arriver comme ça:

printf '%s\n%s\n' 'your_password' 'y' | Sudo -S ufw reset

ou avec su -c:

printf '%s\n' 'your_password' | Sudo -S su -c "{ yes | ufw reset; }"
  • Ceci utilise le petit outil de Nice yes au lieu de echo y.
  • Je préfère printf au lieu de echo pour les chaînes inconnues. -> voir ceci .

Note: C'est vraiment une mauvaise idée. Mieux vaut ajouter ufw à la liste NOPASSWD dans le fichier sudoers. Voir ici . Ou si vous voulez exécuter cette commande plusieurs fois/automatiquement, vous pouvez plutôt l'ajouter en tant que root cronjob .

8
pLumo