Comment passer des variables shell à une commande qui lit l'entrée de la console dans un script?

Nov 12 2020

J'essaie de créer un script dans lequel j'utilise une commande qui demande à l'utilisateur de saisir des données dans l'invite.

Disons que je veux inclure git pushdans un script (je sais que ce n'est pas la meilleure pratique, mais tout le monde va comprendre ce que je demande de cette façon.)

Ainsi, lorsque vous l'utilisez git pushdans la console, il vous demande un utilisateur et un mot de passe. Comment puis-je les transmettre quand gitest appelé à partir d'un script shell et que les deux sont stockés en tant que variables shell?

Cela devrait ressembler à quelque chose comme

#!/bin/bash

git push
$user $password

Réponses

2 AdminBee Nov 12 2020 at 18:08

Le moyen le plus simple semble de le diriger vers la commande externe:

printf "% s \ n% s \ n" "$user" "$password "| command_expecting_username_and_passwd

Cela affichera le contenu de $useret $password, chacun suivi d'une nouvelle ligne, et redirigera la sortie vers le stdinprocessus externe qui devrait s'attendre à ce que le nom d'utilisateur et le mot de passe dans cet ordre soient entrés par l'utilisateur s'il a été appelé de manière interactive.

Si vous souhaitez effectuer des opérations plus sophistiquées, vous pouvez vous pencher sur les scripts attendus .

Notez que, comme indiqué par Kusalananda, cela ne fonctionne que si le programme les lit depuis leur stdinet non directement depuis le terminal (ce qui semble cependant être habituel lors de la demande d'informations d'authentification), et ne fonctionnera pas lors de leur application à git( que vous avez présenté comme un exemple d'utilisation).

Pierre-AntoineGuillaume Nov 15 2020 at 02:07

Le type d'outil que vous recherchez est expect.

https://linux.die.net/man/1/expect

C'est un outil pour automatiser l'interaction avec un TTY.

Gardez à l'esprit que ce n'est pas sécurisé, et pour pousser vers github sans mot de passe, vous devez utiliser ssh

git remote add origin [email protected]:name/repo

bien que l '"origine" distante soit probablement déjà prise dans votre référentiel.

https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/connecting-to-github-with-ssh

Une fois que vous avez défini une clé publique et privée ssh et que vous l'avez ajoutée à votre agent ssh, vous n'aurez pas besoin de taper un mot de passe pour pousser ou tirer