#!/bin/sh # \ exec expect -- "$0" ${1+"$@"} # remote-exec - execute command on remote host # Version 0.1 # Zhigang Wang exp_version -exit 5.0 if {$argc==1} { set cmd [lindex $argv 0] } else { if {$argc==2} { set cmd [lindex $argv 0] set password [lindex $argv 1] } else { send_user "usage: remote-exec command [password]\n" send_user "Eg. remote-exec \"ssh user@host ls\\; echo done\" password\n" send_user "or: remote-exec \"scp /local-file user@host:/remote-file\" password\n" send_user "or: remote-exec \"scp user@host:/remote-file local-file\" password\n" send_user "or: remote-exec \"rsync --rsh=ssh /local-file user@host:/remote-file\" password\n" send_user "Caution: command should be quoted.\n" exit } } eval spawn $cmd set timeout 120 while {1} { expect -re "Are you sure you want to continue connecting (yes/no)?" { # First connect, no public key in ~/.ssh/known_hosts send "yes\r" } -re "assword:" { # Already has public key in ~/.ssh/known_hosts send "$password\r" } -re "Permission denied, please try again." { # Password not correct exit } -re "kB/s|MB/s" { # User equivalence already established, no password is necessary set timeout -1 } -re "file list ..." { # rsync started set timeout -1 } -re "bind: Address already in use" { # For local or remote port forwarding set timeout -1 } -re "Is a directory|No such file or directory" { exit } -re "Connection refused" { exit } -re "Last login:" { interact exit } timeout { exit } eof { exit } }