Search code examples
linuxuploadsftpexpectput

Linux Expect SFTP + put file


I just got some help in automating my password input during an SFTP connection by using Expect.

I then tried to issue a put command and things got complicated again. I'm using the following code:

#!/usr/bin/expect
#!/bin/sh

expect -c "
spawn sftp remoteuser@*.*.*.*
expect \"remoteuser@*.*.*.*'s password:\"
send \"passwrd\r\"
interact "

echo "put output/data.xml\r"
echo "quit\r"

My password input and connection to the remote server works just fine but I am struggling to get the put output/data.xml command to display and execute at the SFTP prompt.

My echo "put output/data.xml\r" and echo "quit\r" lines just print as text which is not entirely surprising but I really don't know what else might work.


Solution

  • I understand you need some help, but you should at least try doing some reading. When you say expect -c 'some stuff ...', you are specifying the entire expect script as the parameter to the -c option. The Expect session will not exist afterward.

    Also, try to understand what the interact command does instead of blindly applying what someone advises.

    Anyway, the solution:

    expect  <<'END_EXPECT'
    set timeout -1
    spawn sftp [email protected]
    expect "[Pp]assword:"
    send "passwrd\r"
    expect "whatever the sftp prompt looks like"
    send "put output/data.xml\r"
    expect "whatever the sftp prompt looks like"
    send "quit\r"
    expect eof
    END_EXPECT
    

    Note that the here-doc delimiter is quoted when you first see it. That way, you will not be subjected to any shell expansions. It's like the entire here-doc is single-quoted.