Expect script problem

Hello all you scripting Gurus,

I have an expect script that gets called from an AppleScript Studio app that basically takes arguments for user name, password, and server address and then calls rsync. Everything works wonderfully, EXCEPT (there had to be one of those) if the user name starts with a t, such as "test_student", the t gets converted to a 'tab' and I instead get "[tab]est_student", which obviously won't authenticate properly.

In the following code, the problem happens at the end of the spawn line, the $login variable has the problem (although I haven't tested to see if $server and $password variables have the same problem).

I guess my question is if there is a way to make it so that expect just enters the text and doesn't try to do fancy [tabs] and such? Is there a best practice in a script like this to make sure that doesn't happen?

Thanks in advance for any help offered.

Jeff
--------

The script is as follows:

#!/usr/bin/expect --
#
# Student Backup Script
# 
# Purpose:      Based on provided login name, password and server, 
#				backup the user's Documents folder.
# Requires:     TCL and Expect extension
# Author:       Jeff Dyck
# Date:         12/18/2007
#
#               Usage format is ExpectBackup.sh username password server

# Bring in the variables...

set timeout 20

set localUser [exec whoami]
set login [lindex \\$argv 0]
set password [lindex \\$argv 1]
set server [lindex \\$argv 2]
set mode [lindex \\$argv 3]

# Begin syncronization...

spawn time rsync -a -z -E --exclude-from=/tmp/exclude.txt --progress --partial --timeout=30 -e ssh /Users/$localUser/Documents $login@$server:

expect {
       "(yes/no)?"  { send "yes\r"; exp_continue}
       "?assword:"  { send "$password\r"; exp_continue}
       }
       
# Wait for rsync to finish.
# expect eof

# Done.

exit 0

I think that expect uses single backslash to escape characters, at least that's the way I do in some of my scripts. Try that and let us know.

Thanks for taking the time to offer your suggestion sysgate. I just tried modifying the script to use both forward and backward slashes, neither did what I wanted, but they had very different results...

When I used a backward slash (\) I got the following rsync command out of the expect script - the escape character seems to have just nulled the $ so I get the variable name inserted, rather than the variable's value:

spawn time rsync -a -z -E --exclude-from=/tmp/exclude.txt --progress --partial --timeout=30 -e ssh /Users/admin/Documents $login@time-od.csf.bc.ca:

When I used a forward slash (/) I got the following,which is the same as before, adding an unwanted [tab]:

spawn time rsync -a -z -E --exclude-from=/tmp/exclude.txt --progress --partial --timeout=30 -e ssh /Users/admin/Documents /	est_student@time-od.csf.bc.ca:

I even tried entering both / and \ in front of test_student right in the original command and that doesn't help either... / just adds the / in front of test_student (so does get rid of the [tab], but also doesn't give the right command) and \ doesn't seem to do anything, still end up with [tab]est_student.

What IS interesting to me is that I entered the server as 'time' simply to test if that 't' was also coming out as a [tab] - as you can see from the results, it isn't - I suspect because it's immediately behind the @ character. So perhaps this is something to do with having the variable right after a space.

So back to the drawing board. Any other ideas?

Jeff

I don't understand why this script attempts to escape the variable notation ($)
preceding the argv list.
it is utterly broken this way.
example:

proc randlist {len {components "satrednfgbhj"}} {
set i 0
                      while {$i < $len} {
                            set a [expr int(1 + rand() * [string length $components] - 1)]
                             lappend ret "[string index $components $a]"
                             incr i
                       }
                       return $ret
}

foreach a [randlist 23] {puts -nonewline "No interp of escape = \\$a\nAnd interpreted = " ; eval puts "\\$a"}
Output of above:
No interp of escape = \f
And interpreted =  
No interp of escape = \n
And interpreted = 

No interp of escape = \j
And interpreted = j
No interp of escape = \e
And interpreted = e
No interp of escape = \t
And interpreted = 	
No interp of escape = \j
And interpreted = j
No interp of escape = \e
And interpreted = e
No interp of escape = \e
And interpreted = e
No interp of escape = \n
And interpreted = 

No interp of escape = \f
And interpreted =  
No interp of escape = \t
And interpreted = 	
No interp of escape = \e
And interpreted = e

Short answer: There is no need to escape the dollar sign notation and it breaks interpretation of characters during command expansion.

ramen_noodle,

I removed the \\'s from the argv entries at the beginning of the script and that seems to have fixed the problem. It's been a while since I wrote this script originally, but I believe I grabbed that syntax from a sample script I found online, so big ooops I guess.

Thanks for pointing out what I wasn't seeing, may much good karma come your way :).

Jeff