1

Apologies if this has been asked before, I was unable to find an answer...

I have created a bash script for OS X to mount an AFP share. The script works successfully and allows a user to type their username and password into a graphical popup using cocoa dialog

My issue is that if the username and password are entered incorrectly, I want to be able to display a new pop up window explaining this.

I was trying to do this based on the exit status of the script but the script returns 0 regardless of whether or not the mount was successful

The script is as follows;

cd=/etc/cocoaDialog.app/Contents/MacOS/cocoaDialog

rvUsername=($($cd standard-inputbox --title "Network Mount" --informative-text "Please enter your username"))

username=${rvUsername[1]}

rvPassword=($($cd secure-standard-inputbox --title "Network Mount" --informative-text "Please enter your password"))

password=${rvPassword[1]}

mkdir "/Volumes/Test"

expect <<- DONE
  set timeout -1
  spawn /sbin/mount_afp -i "afp://servername/Software" /Volumes/Test

  expect "*?ser:*"
  send "$username\n"

  expect "*?assword:*"
  send "$password\r"

  expect EOF
DONE

If I run this via Terminal or Textmate, I receive the following (as an example)

spawn /sbin/mount_afp -i afp://server/Software /Volumes/Test
User: username 
Password: 
mount_afp: the volume is already mounted 

Program exited with code #0 after 7.32 seconds.

So mount_afp is giving me a message, which I would then like to use in my script...but the exit code is 0 and I don't know how else to get hold of that message to use

Any ideas? (Hope that makes sense!)

1
  • 1
    You need to have expect capture the exit code (and stderr for the message) of mount_afp and return it to the shell somehow. Look to the documentation of expect, not the shell. Commented Dec 10, 2013 at 17:01

2 Answers 2

1

To get the exit code of the spawned command, use something like this:

# wait for the command to end : wait for the prompt $ followed by space
expect "\\$ "
send "echo \$?\r"
expect -re "(\\d+)" {
    set result $expect_out(1,string)
}
send_user "command exit with result code : $result"

This will take the content of the variable $? (which is the exit code of the prevously ended command) and save it to $result.

Sign up to request clarification or add additional context in comments.

Comments

0

Thanks for the responses all, helped point me in the right direction

I ended up taking this approach and setting the expect command as a variable

output=$(su -l $loggedInUser -c expect <<- DONE
  set timeout -1
  spawn /sbin/mount_afp -i "afp://$serverName" /Volumes/mount

  expect "*?ser:*"
  send "$username\n"

  expect "*?assword:*"
  send "$password\r"

  expect EOF
DONE)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.