216 votes

Saisir automatiquement les données dans la ligne de commande

Je suis en train d'exécuter un script qui demande d'entrer 'y' à chaque opération, je cherche une solution du type $ ./script < echo 'yyyyyyyyyyyyyy' pour passer toutes mes entrées en une seule fois.

364voto

Adam Points 6342

Il existe une commande créée spécifiquement pour ce cas : yes

$ yes | ./script

Ce que cela fait est de connecter la sortie de yes à l'entrée de ./script . Alors quand ./script demande l'entrée de l'utilisateur, il obtiendra à la place la sortie de yes . La sortie de yes est un flux sans fin de y suivi d'un saut de ligne. Donc, en gros, c'est comme si l'utilisateur entrait y pour chaque question de ./script .

Si vous voulez dire non ( n ) au lieu de oui ( y ) vous pouvez le faire comme ceci :

$ yes n | ./script

Notez que certains outils ont une option pour toujours supposer que yes comme réponse. Voir ici par exemple : Contourner l'invite oui/non dans 'apt-get upgrade'.


Autres méthodes pour saisir les données :

Si vous savez exactement combien y votre script attend vous pouvez le faire comme ceci :

$ printf 'y\ny\ny\n' | ./script

Les nouvelles lignes ( \n ) sont les touches d'entrée.

Utilisation de printf au lieu de yes vous avez un contrôle plus fin de l'entrée :

$ printf 'yes\nno\nmaybe\n' | ./script

Notez que dans certains cas rares, la commande n'exige pas que l'utilisateur appuie sur la touche Entrée après le caractère. Dans ce cas, ne tenez pas compte des nouvelles lignes :

$ printf 'yyy' | ./script

Par souci d'exhaustivité, vous pouvez également utiliser un fichier ici le document :

$ ./script << EOF
y
y
y
EOF

Ou si votre Shell le supporte un ici la chaîne :

$ ./script <<< "y
y
y
"

Ou vous pouvez créer un fichier avec une entrée par ligne :

$ ./script < inputfile

Si la commande est suffisamment complexe et que les méthodes ci-dessus ne suffisent plus, vous pouvez utiliser s'attendre à .

Voici un exemple d'un expect script super simple :

spawn ./script
expect "are you sure?"
send "yes\r"
expect "are you really sure?"
send "YES!\r"
expect eof

Un petit détail technique :

L'invocation de la commande hypothétique que vous avez donnée dans votre question ne fonctionne pas :

$ ./script < echo 'yyyyyyyyyyyyyy'
bash: echo: No such file or directory

C'est parce que la grammaire Shell permet un opérateur de redirection n'importe où dans la ligne de commande. En ce qui concerne le Shell, votre ligne de commande hypothétique est la même que cette ligne :

$ ./script 'yyyyyyyyyyyyyy' < echo
bash: echo: No such file or directory

Cela signifie que ./script sera appelé avec l'argument 'yyyyyyyyyyyyyy' et le stdin sera alimenté par un fichier nommé echo . Et bash se plaint car le fichier n'existe pas.

13voto

Peter W. Osel Points 131

Utilisez la commande yes :

yes | script

Extrait de la page de manuel :

NAME
       yes - output a string repeatedly until killed

SYNOPSIS
       yes [STRING]...
       yes OPTION

DESCRIPTION
       Repeatedly output a line with all specified STRING(s), or 'y'.

10voto

Mufaka Points 54

Certaines choses ( apt-get par exemple) acceptent des drapeaux spéciaux pour fonctionner en mode silencieux (et acceptent les valeurs par défaut). Dans apt-get Dans ce cas, il suffit de lui passer un -y drapeau. Cela dépend complètement de votre script cependant.

Si vous avez besoin de choses plus compliquées, vous pouvez envelopper votre script dans un script expect. expect vous permet de lire la sortie et d'envoyer l'entrée de sorte que vous pouvez faire des choses assez compliquées que d'autres scripts ne permettraient pas. Voici un exemple un des exemples tirés de sa page Wikipedia :

# Assume $remote_server, $my_user_id, $my_password, and $my_command were read in earlier
# in the script.
# Open a telnet session to a remote server, and wait for a username prompt.
spawn telnet $remote_server
expect "username:"
# Send the username, and then wait for a password prompt.
send "$my_user_id\r"
expect "password:"
# Send the password, and then wait for a shell prompt.
send "$my_password\r"
expect "%"
# Send the prebuilt command, and then wait for another shell prompt.
send "$my_command\r"
expect "%"
# Capture the results of the command into a variable. This can be displayed, or written to disk.
set results $expect_out(buffer)
# Exit the telnet session, and wait for a special end-of-file character.
send "exit\r"
expect eof

7voto

Jonathan Gilbert Points 497

Dans le Shell Shell, vous pouvez également utiliser l'astuce suivante de spawn, expect et send.

spawn script.sh
expect "Are you sure you want to continue connecting (yes/no)?"
send "yes"

Cependant, dans le scénario ci-dessus, vous devrez donner la phrase que vous vous attendez à obtenir lorsque vous exécutez le script pour plus d'exemples, allez au lien suivant

Attendez-vous à ce que Bash

3voto

WebComer Points 227

Vous pouvez fournir une entrée utilisateur à votre script avec cat à partir d'un fichier texte, envoyé à votre script avec bash comme ça :

cat input.txt | bash your_script.sh

Il suffit de mettre les entrées utilisateur souhaitées dans votre fichier input.txt, les réponses que vous voulez - y, n, chiffres, chaînes de caractères, etc.

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