title: OSX bash & expect
body: <p>I have a script that must perform a 'sudo' operation on each of a number of hosts.  I'm trying to get expect working so I only have to enter it once, and have run into a couple of issues.</p>
  
  <p>First, several examples suggest to use:</p>
  
  <pre><code>/usr/bin/expect &lt;&lt;EOD
  spawn ssh -t $host /usr/bin/sudo -v
  expect "Password:"
  send "$SUDOPASS\n"
  EOD
  </code></pre>
  
  <p>However, as soon as I enter the second '&lt;', all of the quoting gets screwed up, and my script will terminate with an unexpected end of file.  This is really strange, as I use the same mechanism with cat to write out files in other scripts.</p>
  
  <p>Other examples suggest:</p>
  
  <pre><code>/usr/bin/expect -c "
  spawn ssh -t $host /usr/bin/sudo -v
  expect "Password:"
  send "$SUDOPASS\n"
  "
  </code></pre>
  
  <p>Doing it this way (and adding -d to expect), I get errors about no tty and a repeat of my password with an 'n' appended to the end, so it isn't sending a newline (I've tried '\r' as well), but instead appears to be escaping the 'n'</p>
  
  <p>Since most of the examples I'm finding are from Linux, I expect (ha, ha, pun not intended!) that they're using a GNU expect, and I'm using a BSD expect.  I am reading through the man page, but the word "spawn" appears so many times, it could be quite a while before I stumble across the correct instance.</p>
  
  <p>Here's a result that seems to be closest to working:</p>
  
  <pre><code>flamingo:~ jnojr$ Scripts/getinfo_expect.sh 
  Assuming you have one 'sudo' password for all of your hosts, enter it now: 
  expect version 5.45
  spawn /usr/bin/ssh -t macbook /usr/bin/sudo -v
  parent: waiting for sync byte
  parent: telling child to go ahead
  parent: now unsynchronized from child
  spawn: returns {67358}
  
  expect: does "" (spawn_id exp7) match glob pattern "Password:"? no
  Password:
  expect: does "Password:" (spawn_id exp7) match glob pattern "Password:"? yes
  expect: set expect_out(0,string) "Password:"
  expect: set expect_out(spawn_id) "exp7"
  expect: set expect_out(buffer) "Password:"
  send: sending "password\n" to { exp7 }
  argv[0] = /usr/bin/expect  argv[1] = -d  argv[2] = -c  argv[3] = 
      spawn /usr/bin/ssh -t macbook /usr/bin/sudo -v
      expect Password: { send password\n }  
  set argc 0
  set argv0 "/usr/bin/expect"
  set argv ""
  sudo: no tty present and no askpass program specified[/CODE]
  </code></pre>
  
  <p>That's with leaving the '\n' outside of the quotes, as in </p>
  
  <pre><code>send "$SUDOPASS"\n
  </code></pre>
  
  <p>It seems to be mostly working, except skipping the '-t' option to ssh</p>