Pass commands as input to another command (su, ssh, sh, etc)

前端 未结 3 612
南方客
南方客 2020-11-21 23:23

I have a script where I need to start a command, then pass some additional commands as commands to that command. I tried

su
echo I should be root n         


        
3条回答
  •  Happy的楠姐
    2020-11-21 23:24

    If you want a generic solution which will work for any kind of program, you can use the expect command.

    Extract from the manual page:

    Expect is a program that "talks" to other interactive programs according to a script. Following the script, Expect knows what can be expected from a program and what the correct response should be. An interpreted language provides branching and high-level control structures to direct the dialogue. In addition, the user can take control and interact directly when desired, afterward returning control to the script.

    Here is a working example using expect:

    set timeout 60
    
    spawn sudo su -
    
    expect "*?assword" { send "*secretpassword*\r" }
    send_user "I should be root now:"
    
    expect "#" { send "whoami\r" }
    expect "#" { send "exit\r" }
    send_user "Done.\n"
    exit
    

    The script can then be launched with a simple command:

    $ expect -f custom.script
    

    You can view a full example in the following page: http://www.journaldev.com/1405/expect-script-example-for-ssh-and-su-login-and-running-commands

    Note: The answer proposed by @tripleee would only work if standard input could be read once at the start of the command, or if a tty had been allocated, and won't work for any interactive program.

    Example of errors if you use a pipe

    echo "su whoami" |ssh remotehost
    --> su: must be run from a terminal
    
    echo "sudo whoami" |ssh remotehost
    --> sudo: no tty present and no askpass program specified
    

    In SSH, you might force a TTY allocation with multiple -t parameters, but when sudo will ask for the password, it will fail.

    Without the use of a program like expect any call to a function/program which might get information from stdin will make the next command fail:

    ssh use@host <<'____HERE'
      echo "Enter your name:"
      read name
      echo "ok."
    ____HERE
    --> The `echo "ok."` string will be passed to the "read" command
    

提交回复
热议问题