ϪfG ddlZddlZddlZddlZddlZddlZddlZddlmZm Z ddl m Z m Z ddl mZddlmZddlmZmZmZmZmZddlmZmZmZddlmZmZdd lmZm Z Gd d eZ!da"da#da$da%da&da'd Z(d Z)dZ*dZ+dZ,dZ-dZ.dZ/dZ0GddZ1GddejdZ2GddejfZ4GddejjZ5GddejlZ6dZ7d Z8e9d!k(re(yy)"N)ListTuple)connectdefault) ConchOptions) ConchError)channelcommon connection forwardingsession)reactorstdiotask)logusage)ioType networkStringc eZdZUdZdZgdgdgdgZgdgdgdgd gd gd gZejd gejd ejd dejejdejddgZ gZ e eeeeeffed<gZe eeeeeffed<dZdZdZdZy) ClientOptionsz(Usage: conch [options] host [command] zYconch is a SSHv2 client that allows logging into a remote machine and executing commands.)escapee~) localforwardLNzr! localPort remoteHost remotePorts r@opt_localforwardzClientOptions.opt_localforward\sH-.GGCL) :z N _  !!9z:.F"GHrBc|jd\}}}t|}t|}|jj|||ffy)zH Forward remote port to local address (rport:host:port) rDN)rErFr2rG)r>r!rJconnHostconnPorts r@opt_remoteforwardzClientOptions.opt_remoteforwardesH*+& Hh_ x= ""J80D#EFrBc6||d<dj||d<y)Nhost r+)join)r>rQr+s r@ parseArgszClientOptions.parseArgsnsV ((7+YrBN)__name__ __module__ __qualname__synopsislongdesc optParametersoptFlagsr Completions CompleterCompleteUserAtHostcompDatar1rrrF__annotations__r2rArKrOrTrBr@rrsH *   M" 8AE0>K H!u  +,+EOO2IJ,U__3JK %E $ $ & EOO) , EOO*T : H8:M4c5c?23498:NDsE#s(O345: 7IG,rBrctjdd}d|vr'|jd}|||dz|z}||dz|dz=|ddD]2} |j|}|dddk(r||dzddk7rg|||dz4t a t j |t d r{t d r1t d dk(rtj}n$tt d d }ntj}tj}tj ||t_ ntj"t%tj&j)} t+j,|a t3j2t2j4d } t7j8t.r)t+j:|t*j<t.|r$t3j2t2j4|t d r t ds t ds3t3j2t2j>t2j@ tjjCr*t d s!tdjEt dtjtFy#t$rYwwxYw#tj$rB}td|t jtjdYd}~vd}~wwxYw#t0$rdaYwxYw#t0$rd}YwxYw#t.r)t+j:|t*j<t.|r$t3j2t2j4|t d r t ds t ds3t3j2t2j>t2j@wwxYw)Nr7z-lr6z-or-zERROR: rlogfileza+c6tjdtSNr)r callLater reConnect)as r@zrun..sw'8'8I'FrBr+r"r$zConnection to {} closed.rQ)$r<argvindex ValueErrorroptions parseOptionsr UsageErrorprintopt_helpr=stdoutopenstderrr startLogging discardLogs doConnectstdinfilenor" tcgetattrold BaseExceptionsignalSIGUSR1rrun tcsetattrTCSANOWSIGWINCHSIG_DFLisattyformat exitStatus)argsiargur!realoutfdoldUSR1s r@rr|s 88ABS#8"$QQ oGT" u~ 9 y!S(JJ+T2 A**    K    BmmB-- NNF  ;  MM"ckk3 /  MM&..' 2 I 75>'':J MM&//6>> : zz79#5 (//@AHHZ[       sm  *    MM"ckk3 /  MM&..' 2 I 75>'':J MM&//6>> :;Ks[/J/J?L0%L)L;/ J<;J<?L7LL L&%L&) L87L8;B%O cddlm}datjdt t j|j)Nrfailurer6g{Gz?) twisted.pythonrrrrh _stopReactorrerrFailurers r@ handleErrorrs2&J dL)GGGOO  rBcL tjy#t$rYywxYwN)rstopr~rarBr@rrs"      s  ##cdtdvr*tdjdd\td<td<tjs ddgt_td}tdstjtd<tds dtd<nt tdtd<td}td}t j}td s!t j|ttd <t jtdtt}tj||t||jty) N@rQr7userz ~/.ssh/id_rsaz ~/.ssh/id_dsaportzhost-key-algorithms)rorE identitysgetpassgetuserrFr verifyHostKeygetHostKeyAlgorithmsSSHUserAuthClient SSHConnectionr addErrback_ebExit)rQrvhkuaos r@ryrys gfo+26?+@+@a+H(   ,o> 6?D 6?!//+ 6?gfo. 6?D 6?D   C ( ))0)E)EdG)T%&  # #GFOWmo NC OOD$c2==gFrBcBd|atjdty)Nzconch: exiting with error 皙?)rrrhr)r!s r@rrs-aS1J c<(rBc ttjdrtttj rjtj D]W\}}t j|tjt|t}tj j|YtjrdtjD]6\}}tjd|d|tj||8t j ddt"tdr tdrtj%t'tdrdt)j*rt)j,d t)j.t1d D]} t)j2|yy#t4$r(}d dl}|j6|j8k7rYd}~Id}~wwxYw) N sendIgnorez!asking for remote forwarding for rDbeforeshutdownr&agentr r)hasattrconn transport _KeepAliveror1r listenTCPr SSHListenForwardingFactory SSHListenClientForwardingChannelrGr2rmsgrequestRemoteForwardingaddSystemEventTriggerbeforeShutdown openChannel SSHSessionosr _exitsetsidrangecloseOSErrorerrnoEBADF)rHhostportr)rJrrrs r@ onConnectrswt~~|,4#*#8#8 ) Ix!!55($DA    % %a ( )$+$:$: ? J GG7 |1XJO P  ( (X > ? %%h NK 9 !1 &v 779 HHQK q A     77ekk)* sF55 G&>G!!G&chttjjjyr)rrrloseConnectionrarBr@ririsNN++-rBctj}|D]5\}}tjd|d|tj |7y)Nz cancelling rD)ror2rrrcancelRemoteForwarding)r2rJrs r@rr sH++N .0 H +j\8*56 ##J/0rBcLtdstjdtyy)N reconnectr)rorrhrrarBr@stopConnectionrs ; #|, rBc$eZdZdZdZdZdZy)rc||_d|_tj|j|_|j j dy)Ni,)r globalTimeoutr LoopingCall sendGloballcstart)r>rs r@__init__z_KeepAlive.__init__s7 !""4??3  crBc|jjddd}|j|jt j d|j |_y)Ns"conch-keep-alive@twistedmatrix.comrBr7 wantReply)rsendGlobalRequestaddBoth _cbGlobalrrh _ebGlobalr)r>ds r@rz_KeepAlive.sendGlobal sM II ' ' 13! (  $..!$..r4>>BrBc`|jr"|jjd|_yyr)rcancel)r>ress r@rz_KeepAlive._cbGlobal's*       % % '!%D  rBct|jr,d|_|jjjyyr)rrrrr>s r@rz_KeepAlive._ebGlobal,s.   !%D  II   . . 0 rBN)rUrVrWrrrrrarBr@rrs C& 1rBrc<eZdZdZdZdZdZdZdZdZ dZ y ) rc8|ag|_i|_tyr)rr1r2rrs r@serviceStartedzSSHConnection.serviceStarted3s  rBcl|j}g|_|D]}|jtyr)r1rr)r>lfr)s r@serviceStoppedzSSHConnection.serviceStopped:s6    A    rBctjd|f}|jd|d}tjd|d||j |j |||j|j||y)N0.0.0.0s tcpip-forwardr7rzrequesting remote forwarding rD) r packGlobal_tcpip_forwardrrr addCallback_cbRemoteForwardingr_ebRemoteForwarding)r>rJrdatars r@rz%SSHConnection.requestRemoteForwardingAsu22Iz3JK  " "#3TQ " G / |1XJGH d.. HE T--z8DrBctjd|d|||j|<tjt|jy)Nzaccepted remote forwarding rD)rrr2repr)r>resultrJrs r@rz!SSHConnection._cbRemoteForwardingHsC -j\8*EF*2J' T(()*rBcftjd|d|dtj|y)Nzremote forwarding rDz failedrr)r>r!rJrs r@rz!SSHConnection._ebRemoteForwardingMs) $ZL(7CD  rBctjd|f}|jd|tjd| |j |=tjt|j y#t $rY4wxYw)Nrscancel-tcpip-forwardzcancelling remote forwarding )r rrrrr2 Exceptionr)r>rJrs r@rz$SSHConnection.cancelRemoteForwardingQs|22Iz3JK 6= / |<= ##J/ T(()*   s A99 BBctjd|tj|\}}tj|jtj||d|jvr9|j|d}tjd|t ||||St tjd)NzFTCP r7zconnect forwarding ) remoteWindowremoteMaxPacketrzdon't know about that port) rrr unpackOpen_forwarded_tcpipr2SSHConnectForwardingChannelrr OPEN_CONNECT_FAILED)r> windowSize maxPacketrremoteHPorigHP connectHPs r@channel_forwarded_tcpipz%SSHConnection.channel_forwarded_tcpip[s %x !%@@F& ##$  A;$-- -++HQK8I GG))5 6. ITX ..0L rBc4tjd|tj|jt|jdk(r tjdt y|j j dj||y)Nzconnection closing r7zstopping connectionr)rrchannelsr9r __class__ __bases__ channelClosed)r>r s r@r zSSHConnection.channelClosedksk %gY/0   t}}  " GG) *   NN $ $Q ' 5 5dG DrBN) rUrVrWrrrrrrrr rarBr@rr2s,E+ + ErBrcXeZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd Zy)rssessionc,tjdjdtdr1jj ddd}|j dtd rytd r td s td s ttj}td r"td sd_ j|_ nj|_ fd|_tj |_d}tdr8jj dt#j$td ytd rtd rt&j(d}t+j,|t.j0d}t3j4d|}tj6||d}jj d|t9j8t8j:j<jj dt#j$td ytd st&j(d}t+j,|t.j0d}t3j4d|}tj6||d}jj d|t9j8t8j:j<jj ddy)Nzsession z openrsauth-agent-req@openssh.comrBr7rc,tj|Srr)xs r@rkz(SSHSession.channelOpen..s rBr&r+r"r$rc$jSr)sendEOF)rr>s r@rkz(SSHSession.channelOpen..s T\\^rBrr(s subsystemTERM123456784Hspty-reqsexecsshell)rridror sendRequestr _enterRawModer SSHSessionClient escapeMode handleInput dataReceivedwriteconnectionLostr StandardIOr NSrenvironfcntlioctlr" TIOCGWINSZstructunpackpackRequest_pty_reqrr_windowResized) r>foorcrtermwinszwinSize ptyReqDatas ` r@ channelOpenzSSHSession.channelOpenys? (477)5)* 7  %%3SA&A II* + 9   I 75>'':J O  $ $ & 8 WW%5DO!--AN!ZZAN3%%a(  ;  II ! !$ fii @R6S T Y u~zz&) B C --e4$88wK  %%dJ C foot/B/BC II ! !$79;M1N O7#zz&) B C --e4$88wK  %%dJ C foot/B/BC II ! !$# 6rBc `|dvrd|_|j|y|jdk(r|tdk(rd|_y|jdk(rFd|_|dk(r tjdt y|dk(rd}t jd |y|d k(r:tjd |jjjy|d k(r|jjd |jjj}|j|D]M}|jjtdj!||jj|Oy|jd|zyd |_|j|y)N)  r7rr6.zdisconnecting from escapecttjjtjjt j t jtjtyr) _leaveRawModer<rtflushrzrkillgetpidrSIGTSTPrrarBr@_z!SSHSession.handleInput.._sB!OJJ$$&IIOO%GGBIIK8!OrBrRzrekeying connection#s' The following connections are open: z #{} {} ~)rrrorrrrrhrr sendKexInitrrkeyssortrr)r>charr;r channelIds r@rzSSHSession.handleInputsh > !DO JJt  __ !dgh.?&?DO __ !DOt|34 $!!!Q'-. ##//1   !OP99--224 !)IJJ$$%*11 )499+=+=i+H JJtd{ #DO JJt rBc:|jj|yr)rrr>rs r@rzSSHSession.dataReceiveds rBcB|tjk(rtjdt |dt t jtk(r*t jjj|yt jj|yy)Nzgot z stderr data) r EXTENDED_DATA_STDERRrrr9rr<rvstrbufferr)r>r#rs r@ extReceivedzSSHSession.extReceivedsi // / GGd3t9+\2 3cjj!S( !!''-   & 0rBcbtjd|jjy)Nzgot eof)rrrloseWriteConnectionrs r@ eofReceivedzSSHSession.eofReceiveds   &&(rBcjtjd||jj|y)Nzremote side closed )rrr sendClosers r@ closeReceivedzSSHSession.closeReceiveds( %dV,- D!rBctjd|tjt|jjy)Nzclosed )rrrrrrs r@closedzSSHSession.closeds0 '$ ! TYY''()rBcttjd|dat j dty)Nz>Lrz exit status: )rFr%r&rrrrEs r@request_exit_statuszSSHSession.request_exit_statuss/tT2156  - |,-rBc:|jj|yr)rrrs r@rzSSHSession.sendEOFs $rBc8|jjyr)rpauseProducingrs r@ stopWritingzSSHSession.stopWritings !!#rBc8|jjyr)rresumeProducingrs r@ startWritingzSSHSession.startWritings ""$rBctjdtjd}t j d|}|d|d|d|df}|j j|dt jdg|y) Nrrrr7r6rs window-changez!4L) r"r#r"r$r%r&rrpack)r>rr,r-newSizes r@r(zSSHSession._windowResizedsk As~~z:--e,!*gaj'!*gaj@ d$4fkk%6R'6RSrBN)rUrVrWnamer/rrrJrMrPrRrTrrXr[r(rarBr@rrvsF D'7V+Z')"* .  $%TrBrc eZdZy)rNrUrVrWrarBr@rrrBrc eZdZy)rNrararBr@rrrbrBrctsytjj}t j |tj tdayrg) _inRawModer<rzr{r"rr _savedRawMode)rs r@r6r6s3     BMM"ckk=1JrBctrytjj} t j |}|dd}|dtj z|d<|dtjtjztjztjztjztjztjzz|d<ttdr|dtjz|d<|dtj tj"ztj$ztj$ztj&ztj(ztj*zz|d<ttdr|dtj,z|d<|dtj.z|d<d|dtj0<d|dtj2<|at j6|tj8|day#t:$rt=j>dYywxYw)NrIUCLCrIEXTENr7znot a typewriter!) rer<rzr{r"r|IGNPARISTRIPINLCRIGNCRICRNLIXONIXANYIXOFFrrhISIGICANONECHOECHOEECHOKECHONLriOPOSTVMINVTIMErfrrr~rr)rr}news r@rrs    B*mmB!f Q#**$AQ JJii ii ii hh   ii   ii    A 3 Vsyyj(CFQ HHjj hh hh ii   ii   jj    A 3 !Vszzk)CFQ399*$AAsxxAsyy  b#++s+ O % #$%sHH?>H?__main__):r"rrrr%r<r"typingrrtwisted.conch.clientrrtwisted.conch.client.optionsrtwisted.conch.errorrtwisted.conch.sshr r r r r twisted.internetrrrrrrtwisted.python.compatrrrrorrr}rerfrrrryrrrirrrr SSHChannelrrrr6rrUrarBr@rs  15*NN11%7R,LR,l        9x  G*) !H. 0- 112AEJ,,AEHET##ETP z'R'R  *"H"H /d zErB