I'm running a script that it requests entering 'y' on each operation, I am looking for a solution like
$ ./script < echo 'yyyyyyyyyyyyyy' to pass all my inputs in one time.
There is a command created specifically for that case:
$ yes | ./script
What this does is connect the output of
yes to the input of
./script. So when
./script asks for user input it will instead get the output of
yes. The output of
yes is an endless stream of
y followed by enter. So basically as if the user is entering
y for every question of
If you want to say no (
n) instead of yes (
y) you can do it like this:
$ yes n | ./script
Note that some tools have an option to always asume
yes as answer. See here for example: Bypass the yes/no prompt in 'apt-get upgrade'
Other methods to enter input:
If you know exactly how many
y your script is expecting you can do it like this:
$ printf 'y\ny\ny\n' | ./script
The newlines (
\n) are the enter keys.
printf instead of
yes you have more fine grained control of input:
$ printf 'yes\nno\nmaybe\n' | ./script
Note that in some rare cases the command does not require the user to press enter after the character. in that case leave the newlines out:
$ printf 'yyy' | ./script
For sake of completeness you can also use a here document:
$ ./script << EOF y y y EOF
Or if your shell supports it a here string:
$ ./script <<< "y y y "
Or you can create a file with one input per line:
$ ./script < inputfile
If the command is sufficiently complex and the methods above no longer suffice then you can use expect.
Here is an example of a super simple expect script:
spawn ./script expect "are you sure?" send "yes\r" expect "are you really sure?" send "YES!\r" expect eof
The hypothetical command invocation you gave in your question does not work:
$ ./script < echo 'yyyyyyyyyyyyyy' bash: echo: No such file or directory
This is because the shell grammar allows a redirect operator anywhere in the command line. As far as the shell is concerned your hypothetical command line is the same as this line:
$ ./script 'yyyyyyyyyyyyyy' < echo bash: echo: No such file or directory
./script will be called with the argument
'yyyyyyyyyyyyyy' and the stdin will get input from a file named
echo. And bash complains since the file does not exists.
Some things (
apt-get for example) accept special flags to run in silent mode (and accept defaults). In
apt-get's case, you just pass it a
-y flag. This does completely depend on your script though.
If you need more complicated things, you can wrap your script in an expect script. expect allows you to read output and send input so you can do pretty complicated things that other scripting wouldn't allow. Here's one of the examples from its Wikipedia page:
# 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
In the shell script you can also use the following trick of spawn, expect and send
spawn script.sh expect "Are you sure you want to continue connecting (yes/no)?" send "yes"
However in the above scenerio you will have to give the phrase you are expecting to get while you execute the script for more examples go to the following link
Okay, this may not be a very elegant solution but if you write your options in a separate file and then pass it as an input to the script, it would work as well. So if you create a new file with all your options (call this file as 'options.in'), then you can easily run your script with
./script.sh < options.in and edit/create different options files as suitable.
You can write the expect script as follow:
$ vi login.exp #!/usr/bin/expect -f spawn ssh [email protected] expect "*assword: " send -- "PASSWORD\r" interact
And run it as:
$ expect login.exp