[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