【转】使用expect和ssh远程执行命令的脚本
晚上找了个脚本,可以用来远程执行命令,这个脚本的用处就是让你可以密码和命令一次性作为参数带入,单纯用ssh只能手工输入密码。有了这个脚本再结合“erl -detached”的方式就可以实现远程开服了,感谢原作者 :)
2011年5月6日:增加了ssh私钥验证的支持。
#!/usr/bin/expect -f exp_version -exit 5.0 if {$argc!=2} { send_user "usage: remote-exec command passwordn" send_user "Eg. remote-exec "ssh user@host ls\; echo done" passwordn" send_user "or: remote-exec "scp /local-file user@host:/remote-file" passwordn" send_user "or: remote-exec "scp user@host:/remote-file local-file" passwordn" send_user "or: remote-exec "rsync --rsh=ssh /local-file user@host:/remote-file" passwordn" send_user "Caution: command should be quoted.n" exit } set cmd [lindex $argv 0] set password [lindex $argv 1] eval spawn $cmd set timeout 30 while {1} { expect -re "Are you sure you want to continue connecting (yes/no)?" { # First connect, no public key in ~/.ssh/known_hosts send "yesr" } -re "Enter passphrase for key " { # Already has public key in ~/.ssh/known_hosts send "$passwordr" } -re "password:" { # Already has public key in ~/.ssh/known_hosts send "$passwordr" } -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 } timeout { exit } eof { exit } }