« Convertiseur Fig -> LaTeX -> EPSMontage SSHFS »

Autoconnection

14.11.09

Permalien 16:20:42, par mazet Email , 603 mots   French (FR) latin1
Catégories: Programmation, Tcl/Tk

Autoconnection

Script Tcl/expect permettant de se connecter à une machine avec plusieurs rebonds
# -*- tcl -*-
# the next line restarts using expect \
exec expect "$0" -- ${1+"$@"}


# autoconnect.tcl - an expect script to connect a machine beyond multiple hops
# Copyright (C) 2001 Laurent Mazet

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */

# Changelog:
# - 1.0.0
#   * add default configuration files generation
# - 0.9.0
#   * initial release

# set to 1 to force conservative mode even if script wasn't run
# conservatively originally
set force_conservative 0

if {$force_conservative} {
  set send_slow {1 .1}
  proc send {ignore arg} {
    sleep .1
    exp_send -s -- $arg
  }
}

proc test_exec {} {
 
  send "exec\r"
  expect {
    " not " {
      set cmd ""
    }
    "\r" {
      set cmd "exec "
    }
  }
 
  return $cmd
}

proc cross_gateway {gateway netlogin netpassword} {
 
  send "open $gateway\r"
 
  expect {
    "OneIT Username: " {
      send -- "$netlogin\r"
    }
    timeout {
      send_user "connection to $host timed out\n"
      exit 1
    }
  }
 
  expect  {
    "OneIT Password: " {
      send -- "$netpassword\r"
    }
    timeout {
      send_user "connection to $host timed out\n"
      exit 1
    }
  }
 
  expect {
    "tngate0>" {
      return
    }
    "failed" {
      send_user "\nincorrect netlogin or netpassword for $gateway\n"
      exit 1
    }
    timeout {
      send_user "connection to $host timed out\n"
      exit 1
    }
  }
 
  return
}

proc telnet {host login password prompt} {
 
  set prefix [test_exec]
 
  send -- "${prefix}telnet $host\r"
 
  expect {
    "ogin:" {
      send -- "$login\r"
    }
    timeout {
      send_user "connection to $host timed out\n"
      exit 1
    }
  }
 
  expect {
    "assword:" {
      send -- "$password\r"
    }
    timeout {
      send_user "connection to $host timed out\n"
      exit 1
    }
  }

  expect {
    "$prompt" {
      return
    }
    "incorrect" {
      send_user "incorrect login or password on $host\n"
      exit 1
    }
    timeout {
      send_user "connection to $host timed out\n"
      exit 1
    }
  }

  return
}

proc ssh {login_host arg1 {arg2 ""}} {

  if {$arg2 == ""} {
    set password ""
    set prompt "$arg1"
  } else {
    set password "$arg1"
    set prompt "$arg2"
  }
 
  set prefix [test_exec]
 
  send -- "${prefix}ssh $login_host\r"
 
  if {$password != ""} {
    expect {
      "assword:" {
        send -- "$password\r"
      }
      "refused" {
        send_user "Connection refused by $login_host\n"
        exit 1
      }
      timeout {
        send_user "connection to $login_host timed out\n"
        exit 1
      }
    }
  }
 
  expect {
    "$prompt" {
      return
    }
    "refused" {
      send_user "Connection refused by $login_host\n"
      exit 1
    }
    "incorrect" {
      send_user "incorrect login or password on $login_host\n"
      exit 1
    }
    timeout {
      send_user "connection to $login_host timed out\n"
      exit 1
    }
  }
 
  return
}

set timeout 30
match_max 100000

set hook [lindex $argv 0]
set nargs [llength $argv]
if {$nargs != 1} {
  set hook "-h"
}

switch $tcl_platform(platform) {
  windows {
    set basercfile "_autoconnect.rc"
  }
  default {
    set basercfile ".autoconnectrc"
  }
}

if {[info exists env(AUTOCONNECTRC)]} {
        set rcfile $env(AUTOCONNECTRC)
  if {[file isdirectory $rcfile]} {
    set rcfile [file join $rcfile $basercfile]
        }
} elseif {[info exists env(HOME)]} {
  set rcfile [file join $env(HOME) $basercfile]
} else {
  set rcfile [file join "/" $basercfile]
}

if {[file exists $rcfile]} {
  if {[catch {source $rcfile} error]} {
    puts "Error(s) in your resource file ($rcfile)"
    exit 1
  }
} else {
  puts "No resource file."
  set f [open $rcfile "w"]
  if {$f == 0} {
    puts "Can't create a skeleton"
                exit 2
  } else {
    puts "Create a skeleton"
  }
  puts $f "# Resource file for autoconnect"
  puts $f ""
  puts $f "# Gateway setting"
  puts $f "#set gateway "tngate0.mot.com""
  puts $f "#set gwlogin "my_gateway_login""
  puts $f "#set gwpasswd "my_gateway_passwd""
  puts $f ""
  puts $f "# Exemple of host connections"
  puts $f "#set conn(hook1) {telnet "foo_host" "my_login" "my_passwd" "my_prompt"}"
  puts $f "#set conn(hook2) {telnet "foo_host" "my_login" "my_passwd" "my_prompt";"
  puts $f "#                 telnet "bar_host" "my_login" "my_passwd" "my_prompt"}"
  puts $f "#set conn(hook3) {telnet "foo_host" "my_login" "my_passwd" "my_prompt";"
  puts $f "#                 ssh "my_login@bar_host" "my_passwd" "my_prompt"}"
  puts $f "#set conn(hook4) {telnet "foo_host" "my_login" "my_passwd" "my_prompt";"
  puts $f "#                 ssh "my_login@bar_host" "my_prompt"}"
  close $f
  puts "Don't forget to protect it: chmod 0600 $rcfile"
  exit 0
}

if {$hook == "-h"} {
  puts "Usage: autoconnect \[-h\] <hook>"
  exit 3
}

if {"$conn($hook)" == ""} {
  puts "Unknown hook `$hook'"
  exit 4
}

spawn telnet
expect "telnet>"
cross_gateway $gateway $gwlogin $gwpasswd
eval $conn($hook)

interact