plink

Difference between version 10 and 17 - Previous - Next
[JM] 10/13/2018 - https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html%|%plink%|%:
a command-line interface to the PuTTY back ends
I found the following code for another [Poor Man's Expect] for windows which runs by driving plink.exe:<<br>>
from:<<br>>
https://www.cnblogs.com/hua198/p/5693665.html
W======tcl
  
  proc waitTime {time} {
  after $time {set a 0 }
  vwait a
  }
  
  proc openPipe {pipestr} {
  global exePath
  if {[info exists exePath]==0 } {
    set exePath "."
  }
  set currentPath [pwd]
  cd $exePath
  set channel [open "|plink.exe $pipestr" r+]
  cd $currentPath
  fconfigure $channel -block 0 -buffering none -buffersize 1 -encoding utf-8
  fileevent $channel readable [list getEcho $channel]
  return $channel
  }
  
  proc getEcho {channel} {
  variable ${channel}read
  if [catch {
    set s [read $channel]
    #puts -nonewline $s
    append ${channel}read $s
  } errmsg ] {
    puts stderr "getEcho error := $errmsg"
  }
  }
  
  proc connect { protocol remoteip username password} {
  set url "-$protocol -l $username -pw $password $remoteip "
  set channel [openPipe $url]
  
  variable ${channel}read
  set ${channel}read ""
  set timeout 0
  while {1} {
  if {[regexp "#|>" [set ${channel}read]]>0} {
    break
  } elseif {$timeout > 12000} {
    puts stderr "connect $url : timeout "
    break
  }
  waitTime 100
  incr timeout 100
  
  }
  regsub -nocase -all {\e\[\?\d{1,4}h|\e\[\d{1,2}(;\d{1,2}){0,2}m|\e\(B\e\[m} [set ${channel}read] "" ${channel}read
  puts [set ${channel}read ]
  return $channel
  }
  
  
  proc sendCommand {channel str args} {
  variable ${channel}read
  puts -nonewline $channel $str
  puts -nonewline $channel "\r"
  set ${channel}read ""
  set readflush ""
  set timeout 0
  waitTime 100
  if {[llength $args]>0} {
    set m "$args|#|>"
  
  } else {
    set m "#|>"
  }
  
  while {1} {
    if {[regexp $m [set ${channel}read]] > 0} {
      break;
    } elseif {$timeout>10000} {
      if {[expr $timeout%3000]==0} {
      if {$readflush==[set ${channel}read]} {
        puts "execute command : $str timeout"
        break
      }
        set readflush [set ${channel}read]
      }
    }
    waitTime 100
    incr timeout 100
  }
  #regsub -nocase -all "~#" [set ${channel}read] "->" ${channel}read ;#?~#????->
  regsub -nocase -all {\e\[\?\d{1,4}h|\e\[\d{1,2}(;\d{1,2}){0,2}m|\e\(B\e\[m} [set ${channel}read] "" ${channel}read
  regsub {.*?\n} [set ${channel}read] "" ${channel}read ;#???????
  if {[llength $args]<1 && [regexp -all {(.*?)(\n)} [set ${channel}read]] >0 } {
    set i 1
    set c ""
    set a [split [set ${channel}read] "\n"]
    foreach x $a {
      if {$i<[llength $a]} {
        incr i
        append c $x "\n"
      }
    }
    set ${channel}read [string trimright $c "\n"]
    
  }
  # puts [set ${channel}read ]
  return [set ${channel}read]
  }
  
  
  proc tclclose {channel} {
  fileevent $channel readable {}
  if [catch {
    exec taskkill /F /IM plink.exe
    #close $channel
  } errmsg ] {
    puts "close plink error : $errmsg"
    return false;
  }
  
  return true;
  }
  
  set ch [connect ssh 192.168.251.10 root 123]
  puts [sendCommand $ch "ls -ll"]
  tclclose $ch
 TCL Automation SSH Interactive======
 There are a lot of ssh tools, but they can be easily applied to automation scripts, which can be easily adapted to any environment.
 There are very few tcl tools for ssh interactive login.
 The following is an automated script that is satisfactory for individuals in the tcl automation process.
 ssh command interaction by sub-packaging plink.exe

 plink.exe login to the Linux server through the command line, tcl calls plink through cmd mode
 plink.exe is placed in the current directory of the script

<<categories>> Expect