使用expect实现ssh自动交互

本文发布时间: 2019-Mar-22
使用expect实现ssh自动交互  下面是使用expect实现的自动远端命令执行的脚本ssh-exec:  #!/bin/sh  #   exec expect -- "$0" ${1+"$@"}  # ssh-exec host user password command  # execute command on remote host  exp_version -exit 5.0  set ERR_PERMISSION_DENIED 1  set ERR_DIR_OR_FILE_NOT_EXIST 2  set ERR_TIMEOUT 3  set ERR_CONNECTION_REFUSED 4  set ERR_INVALID_ARGUMENT 5  proc auth_trans {password} {  upvar #0 ERR_PERMISSION_DENIED ERR_PERMISSION_DENIED  upvar #0 ERR_DIR_OR_FILE_NOT_EXIST ERR_DIR_OR_FILE_NOT_EXIST  send "$passwordr"  expect {  #password not correct  "Permission denied, please try again." {  exit $ERR_PERMISSION_DENIED  }  # ...transmission goes after...  -re "Is a directory|No such file or directory" {  exit $ERR_DIR_OR_FILE_NOT_EXIST  }  -re "KB/s|MB/s" {  set timeout -1  expect eof  }  }  }  if {$argc!=2} {  send_user "usage: remote-exec command passwordn"  send_user " command should be quoted.n"  send_user " Eg. remote-exec "ssh ls\; echo done" passwordn"  send_user " or: remote-exec "scp /local-file :/remote-file" passwordn"  exit $ERR_INVALID_ARGUMENT  }  set cmd [lindex $argv 0]  set password [lindex $argv 1]  eval spawn $cmd  #timeout in sec, default 10  set timeout 30  expect {  #first connect, no public key in ~/.ssh/known_hosts  "Are you sure you want to continue connecting (yes/no)?" {  send "yesr"  expect "password:"  auth_trans $password  }  #already has public key in ~/.ssh/known_hosts  "password:" {  auth_trans $password  }  #user equivalence already established, no password is necessary  -re "kB/s|MB/s" {  set timeout -1  expect eof  }  -re "Is a directory|No such file or directory" {  expect eof  exit $ERR_DIR_OR_FILE_NOT_EXIST  }  "Connection refused" {  expect eof  exit $ERR_CONNECTION_REFUSED  }  #connetion error  timeout {  exit $ERR_TIMEOUT  }  }


(以上内容不代表本站观点。)
---------------------------------
本网站以及域名有仲裁协议。
本網站以及域名有仲裁協議。

2020-Jul-13 01:15am
栏目列表