
    ϪfG                     
   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZm	Z	 d dl
mZmZ d dlmZ d dlmZ d dlmZmZmZmZmZ d dlmZmZmZ d dlmZmZ d d	lmZm Z   G d
 de      Z!da"da#d a$da%d a&da'd Z(d Z)d Z*d Z+d Z,d Z-d Z.d Z/d Z0 G d d      Z1 G d dejd                        Z2 G d dejf                        Z4 G d dejj                        Z5 G d dejl                        Z6d Z7d  Z8e9d!k(  r e(        yy)"    N)ListTuple)connectdefault)ConchOptions)
ConchError)channelcommon
connection
forwardingsession)reactorstdiotask)logusage)ioTypenetworkStringc            
          e Zd ZU dZdZg dg dg dgZg dg dg dg d	g d
g dgZ ej                  dg ej                  d       ej                  d      d ej                          ej                  d       ej                  dd      g      Zg Zeeeeeef   f      ed<   g Zeeeeeef   f      ed<   d Zd Zd Zd Zy)ClientOptionsz(Usage:   conch [options] host [command]
zYconch is a SSHv2 client that allows logging into a remote machine and executing commands.)escapee~)localforwardLNz<listen-port:host:port   Forward local port to remote address)remoteforwardRNz<listen-port:host:port   Forward remote port to local address)nullnzRedirect input from /dev/null.)forkfz(Fork to background after authentication.)ttytz-Tty; allocate a tty even if command is given.)nottyTzDo not allocate a tty.)noshellNz"Do not execute a shell or command.)	subsystemsz-Invoke command (mandatory) as SSH2 subsystem.)r"   r$   zlisten-port:host:port)descr)r   r   commandargumentT)r*   repeat)mutuallyExclusive
optActionsextraActionslocalForwardsremoteForwardsc                     |dk(  rd| d<   y|d   dk(  r,t        |      dk(  rt        t        |d         dz
        | d<   yt        |      dk(  r|| d<   yt        j                  d	| d
       y)z:
        Set escape character; ``none'' = disable
        noneNr   r   ^      @   zBad escape character 'z'.)lenchrordsysexit)selfescs     =/usr/lib/python3/dist-packages/twisted/conch/scripts/conch.py
opt_escapezClientOptions.opt_escapeO   sn     &=!DNVs]s3x1} SVr!12DNX] DNHH-cU"56    c                     |j                  d      \  }}}t        |      }t        |      }| j                  j                  |||ff       y)zH
        Forward local port to remote address (lport:host:port)
        :N)splitintr1   append)r>   r!   	localPort
remoteHost
remotePorts        r@   opt_localforwardzClientOptions.opt_localforward\   sH     -.GGCL)	:z	N	_
!!9z:.F"GHrB   c                     |j                  d      \  }}}t        |      }t        |      }| j                  j                  |||ff       y)zH
        Forward remote port to local address (rport:host:port)
        rD   N)rE   rF   r2   rG   )r>   r!   rJ   connHostconnPorts        r@   opt_remoteforwardzClientOptions.opt_remoteforwarde   sH     *+&
Hh_
x=""J80D#EFrB   c                 6    || d<   dj                  |      | d<   y )Nhost r+   )join)r>   rQ   r+   s      r@   	parseArgszClientOptions.parseArgsn   s    V((7+YrB   N)__name__
__module____qualname__synopsislongdescoptParametersoptFlagsr   Completions	CompleterCompleteUserAtHostcompDatar1   r   r   rF   __annotations__r2   rA   rK   rO   rT    rB   r@   r   r      s   H	*  		
	
M" 	8AE0>KH !u  +,+EOO2IJ,U__3JK

 %E$$&EOO),EOO*T:
H 8:M4c5c?23498:NDsE#s(O345:7IG,rB   r   c                     t         j                  dd  } d| v r'| j                  d      }| ||dz    | z   } | |dz   |dz   = | d d  D ]2  }	 | j                  |      }|d d dk(  r| |dz      d   dk7  rg | ||dz    4 t	               a	 t
        j                  |        t
        d	   r{t
        d
   r1t
        d
   dk(  rt         j                  }n$t        t
        d
   d      }nt         j                  }t         j                  }t        j                   |       |t         _        nt        j"                          t%                t         j&                  j)                         }	 t+        j,                  |      a	 t3        j2                  t2        j4                  d       }	 t7        j8                          t.        r)t+        j:                  |t*        j<                  t.               |r$t3        j2                  t2        j4                  |       t
        d   r	t
        d   s	t
        d   s3t3        j2                  t2        j>                  t2        j@                         	 t         j                  jC                         r*t
        d   s!t        djE                  t
        d                t        j                  tF               y # t        $ r Y ww xY w# t        j                  $ rB}t        d|        t
        j                          t        j                  d       Y d }~vd }~ww xY w# t0        $ r d aY w xY w# t0        $ r d }Y w xY w# t.        r)t+        j:                  |t*        j<                  t.               |r$t3        j2                  t2        j4                  |       t
        d   r	t
        d   s	t
        d   s3t3        j2                  t2        j>                  t2        j@                         w w xY w)Nr7   z-lr6      z-or   -zERROR: r   logfileza+c                  6    t        j                  dt              S Nr   )r   	callLater	reConnect)as    r@   <lambda>zrun.<locals>.<lambda>   s    w'8'8I'F rB   r+   r"   r$   zConnection to {} closed.rQ   )$r<   argvindex
ValueErrorr   optionsparseOptionsr   
UsageErrorprintopt_helpr=   stdoutopenstderrr   startLoggingdiscardLogs	doConnectstdinfilenor"   	tcgetattroldBaseExceptionsignalSIGUSR1r   run	tcsetattrTCSANOWSIGWINCHSIG_DFLisattyformat
exitStatus)argsiargur!   realoutfdoldUSR1s           r@   r   r   |   s   88AB<Dt|JJtAA%QQAw 	

3A2Aw$4A;q>S#8"$QQ	 oGT"
 u~9y!S(JJ+T2

A**
K				BmmB--NNF

;MM"ckk3/MM&..'2I75>'':JMM&//6>>:
zz79#5(//@AHHZ[  		
  sm*    
 MM"ckk3/MM&..'2I75>'':JMM&//6>>: ;Ks[   /J/J? L 0%L) L; /	J<;J<?L7LLL&%L&)L87L8;B%O c                      ddl m}  dat        j                  dt
               t        j                  | j                                 )Nr   failurer6   g{Gz?)	twisted.pythonr   r   r   rh   _stopReactorr   errFailurer   s    r@   handleErrorr      s2    & JdL)GGGOO	rB   c                  L    	 t        j                          y # t        $ r Y y w xY wN)r   stopr~   ra   rB   r@   r   r      s"     s    	##c                     dt         d   v r*t         d   j                  dd      \  t         d<   t         d<   t         j                  sddgt         _        t         d   } t         d   st        j                         t         d<   t         d   s
dt         d<   nt        t         d         t         d<   t         d   } t         d   }t        j                  }t         d	   s!t        j                  | t               t         d	<   t        j                  t         d   t         t                     }t        j                  | |t         ||      j                  t               y )
N@rQ   r7   userz~/.ssh/id_rsaz~/.ssh/id_dsaport   zhost-key-algorithms)ro   rE   	identitysgetpassgetuserrF   r   verifyHostKeygetHostKeyAlgorithmsSSHUserAuthClientSSHConnectionr   
addErrback_ebExit)rQ   r   vhkuaos       r@   ry   ry      s    
gfo+26?+@+@a+H(,o>6?D6?!//+6?gfo.6?D6?D


C())0)E)EdG)T%&

#
#GFOWmo
NCOOD$c2==gFrB   c                 B    d|  a t        j                  dt               y )Nzconch: exiting with error 皙?)r   r   rh   r   )r!   s    r@   r   r      s    -aS1Jc<(rB   c            	         t        t        j                  d      rt        t               t        j
                  rjt        j
                  D ]W  \  } }t        j                  | t        j                  t        |t                    }t        j
                  j                  |       Y t        j                  rdt        j                  D ]6  \  }}t        j                  d| d|        t        j                  ||       8 t        j                   ddt"               t        d   r	t        d   rt        j%                  t'                      t        d   rdt)        j*                         rt)        j,                  d	       t)        j.                          t1        d
      D ]  }	 t)        j2                  |        y y # t4        $ r(}d	d l}|j6                  |j8                  k7  r Y d }~Id }~ww xY w)N
sendIgnorez!asking for remote forwarding for rD   beforeshutdownr&   agentr    r      )hasattrconn	transport
_KeepAlivero   r1   r   	listenTCPr   SSHListenForwardingFactory SSHListenClientForwardingChannelrG   r2   r   msgrequestRemoteForwardingaddSystemEventTriggerbeforeShutdownopenChannel
SSHSessionosr    _exitsetsidrangecloseOSErrorerrnoEBADF)rH   hostportr)   rJ   r   r   r   s          r@   	onConnectr      sw    t~~|,4#*#8#8 	)Ix!!55($DA %%a(	) $+$:$: 	? JGG7
|1XJOP((X>	? 	%%h
NK9!1&v779HHQK
		q 	A		   77ekk) *s   F55	G&>G!!G&c                  h    t                t        j                  j                  j                          y r   )r   r   r   loseConnectionra   rB   r@   ri   ri     s    NN++-rB   c                      t         j                  } | D ]5  \  }}t        j                  d| d|        t        j                  |       7 y )Nzcancelling rD   )ro   r2   r   r   r   cancelRemoteForwarding)r2   rJ   r   s      r@   r   r     sH    ++N . 0
H+j\8*56##J/0rB   c                  L    t         d   st        j                  dt               y y )N	reconnectr   )ro   r   rh   r   ra   rB   r@   stopConnectionr     s    ;#|,  rB   c                   $    e Zd Zd Zd Zd Zd Zy)r   c                     || _         d | _        t        j                  | j                        | _        | j
                  j                  d       y )Ni,  )r   globalTimeoutr   LoopingCall
sendGloballcstart)r>   r   s     r@   __init__z_KeepAlive.__init__  s7    	!""4??3crB   c                     | j                   j                  ddd      }|j                  | j                         t	        j
                  d| j                        | _        y )Ns"   conch-keep-alive@twistedmatrix.comrB   r7   	wantReply   )r   sendGlobalRequestaddBoth	_cbGlobalr   rh   	_ebGlobalr   )r>   ds     r@   r   z_KeepAlive.sendGlobal   sM    II''13! ( 
 	
		$..!$..r4>>BrB   c                 `    | j                   r"| j                   j                          d | _         y y r   )r   cancel)r>   ress     r@   r   z_KeepAlive._cbGlobal'  s*    %%'!%D rB   c                 t    | j                   r,d | _         | j                  j                  j                          y y r   )r   r   r   r   r>   s    r@   r   z_KeepAlive._ebGlobal,  s.    !%DII..0 rB   N)rU   rV   rW   r   r   r   r   ra   rB   r@   r   r     s    C&
1rB   r   c                   <    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
y	)
r   c                 8    | a g | _        i | _        t                y r   )r   r1   r2   r   r   s    r@   serviceStartedzSSHConnection.serviceStarted3  s     rB   c                 l    | j                   }g | _         |D ]  }|j                           t                y r   )r1   r   r   )r>   lfr)   s      r@   serviceStoppedzSSHConnection.serviceStopped:  s6     	A	rB   c                    t        j                  d|f      }| j                  d|d      }t        j                  d| d|        |j                  | j                  ||       |j                  | j                  ||       y )N0.0.0.0s   tcpip-forwardr7   r   zrequesting remote forwarding rD   )	r   packGlobal_tcpip_forwardr   r   r   addCallback_cbRemoteForwardingr   _ebRemoteForwarding)r>   rJ   r   datar   s        r@   r   z%SSHConnection.requestRemoteForwardingA  su    22Iz3JK""#3TQ"G/
|1XJGH	d..
HE	T--z8DrB   c                     t        j                  d| d|        || j                  |<   t        j                  t        | j                               y )Nzaccepted remote forwarding rD   )r   r   r2   repr)r>   resultrJ   r   s       r@   r   z!SSHConnection._cbRemoteForwardingH  sC    -j\8*EF*2J'T(()*rB   c                 f    t        j                  d| d| d       t        j                  |       y )Nzremote forwarding rD   z failedr   r   )r>   r!   rJ   r   s       r@   r   z!SSHConnection._ebRemoteForwardingM  s)    $ZL(7CD
rB   c                    t        j                  d|f      }| j                  d|       t        j                  d|        	 | j
                  |= t        j                  t        | j
                               y # t        $ r Y 4w xY w)Nr   s   cancel-tcpip-forwardzcancelling remote forwarding )r   r   r   r   r   r2   	Exceptionr   )r>   rJ   r   s      r@   r   z$SSHConnection.cancelRemoteForwardingQ  s|    22Iz3JK6=/
|<=	##J/ 	T(()*  		s   A9 9	BBc                    t        j                  d|       t        j                  |      \  }}t        j                  | j                         t        j                  |       |d   | j                  v r9| j                  |d      }t        j                  d|        t        ||||       S t        t        j                  d      )NzFTCP r7   zconnect forwarding )remoteWindowremoteMaxPacketr   zdon't know about that port)	r   r   r   unpackOpen_forwarded_tcpipr2   SSHConnectForwardingChannelr   r   OPEN_CONNECT_FAILED)r>   
windowSize	maxPacketr   remoteHPorigHP	connectHPs          r@   channel_forwarded_tcpipz%SSHConnection.channel_forwarded_tcpip[  s    %x !%@@F&##$A;$---++HQK8IGG))56.
ITX  ..0L rB   c                 4   t        j                  d|        t        j                  | j                         t        | j                        dk(  r t        j                  d       t	                y | j
                  j                  d   j                  | |       y )Nzconnection closing r7   zstopping connectionr   )r   r   channelsr9   r   	__class__	__bases__channelClosed)r>   r	   s     r@   r  zSSHConnection.channelClosedk  sk    %gY/0t}}"GG)* NN$$Q'55dGDrB   N)rU   rV   rW   r   r   r   r   r   r   r  r  ra   rB   r@   r   r   2  s,    E+
+ ErB   r   c                   X    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zy)r   s   sessionc                 ,    t        j                  d j                   d       t        d   r1 j                  j                   ddd      }|j                  d        t        d	   ry t        d
   r	t        d   s	t        d   s
t                t        j                         }t        d   r"t        d   sd _
         j                  |_        n j                  |_         fd|_        t        j                   |       _        d}t        d   r8 j                  j                   dt#        j$                  t        d
                y t        d
   rt        d   rt&        j(                  d   }t+        j,                  |t.        j0                  d      }t3        j4                  d|      }t        j6                  ||d      } j                  j                   d|       t9        j8                  t8        j:                   j<                          j                  j                   dt#        j$                  t        d
                y t        d   st&        j(                  d   }t+        j,                  |t.        j0                  d      }t3        j4                  d|      }t        j6                  ||d      } j                  j                   d|       t9        j8                  t8        j:                   j<                          j                  j                   dd       y )Nzsession z openr   s   auth-agent-req@openssh.comrB   r7   r   c                 ,    t        j                  |       S r   r   )xs    r@   rk   z(SSHSession.channelOpen.<locals>.<lambda>  s    
 rB   r&   r+   r"   r$   r   c                 $    j                         S r   )sendEOF)r  r>   s    r@   rk   z(SSHSession.channelOpen.<locals>.<lambda>  s    T\\^ rB   r   r(   s	   subsystemTERM123456784H s   pty-reqs   execs   shell)r   r   idro   r   sendRequestr   _enterRawModer   SSHSessionClient
escapeModehandleInputdataReceivedwriteconnectionLostr   
StandardIOr
   NSr   environfcntlioctlr"   
TIOCGWINSZstructunpackpackRequest_pty_reqr   r   _windowResized)	r>   foor   cr   termwinszwinSize
ptyReqDatas	   `        r@   channelOpenzSSHSession.channelOpeny  s?   (477)5)*7		%%3SA & A II*+9I75>'':JO$$&8WW%5DO!--AN!ZZAN3%%a(
;II!!$fii	@R6STYu~zz&)B
C --e4$88wK
		%%dJ
Cfoot/B/BCII!!$79;M1NO7#zz&)B
C --e4$88wK
		%%dJ
Cfoot/B/BCII!!$#6rB   c           
      `   |dv rd| _         | j                  |       y | j                   dk(  r|t        d   k(  rd| _         y | j                   dk(  rFd| _         |dk(  r t        j                  d       t                y |dk(  rd }t        j                  d	|       y |d
k(  r:t        j                  d       | j                  j                  j                          y |dk(  r| j                  j                  d       | j                  j                  j                         }|j                          |D ]M  }| j                  j                  t        dj!                  || j                  j                  |                      O y | j                  d|z          y d	| _         | j                  |       y )N)   
   r7   r   r6      .zdisconnecting from escape   c                     t                t        j                  j                          t        j                  j                          t        j                  t        j                         t        j                         t                y r   )_leaveRawModer<   rt   flushrz   r   killgetpidr   SIGTSTPr  ra   rB   r@   _z!SSHSession.handleInput.<locals>._  sB    !OJJ$$&IIOO%GGBIIK8!OrB   r      Rzrekeying connection   #s'   
The following connections are open:
z
  #{} {}
   ~)r  r  ro   r   r   r   r   rh   r   r   sendKexInitr   r  keyssortr   r   )r>   charr;  r  	channelIds        r@   r  zSSHSession.handleInput  sh   >!DOJJt__!dgh.?&?DO__!DOt|34 $ !!!Q'-.		##//1

  !OP99--224!) IJJ$$%*11 )499+=+=i+H JJtd{#DOJJtrB   c                 :    | j                   j                  |       y r   )r   r  r>   r   s     r@   r  zSSHSession.dataReceived  s    

rB   c                 B   |t         j                  k(  rt        j                  dt	        |       d       t        t        j                        t        k(  r*t        j                  j                  j                  |       y t        j                  j                  |       y y )Nzgot z stderr data)r   EXTENDED_DATA_STDERRr   r   r9   r   r<   rv   strbufferr  )r>   r#   r   s      r@   extReceivedzSSHSession.extReceived  si    
///GGd3t9+\23cjj!S(

!!''-

  & 0rB   c                 b    t        j                  d       | j                  j                          y )Nzgot eof)r   r   r   loseWriteConnectionr   s    r@   eofReceivedzSSHSession.eofReceived  s    	

&&(rB   c                 j    t        j                  d|         | j                  j                  |        y )Nzremote side closed )r   r   r   	sendCloser   s    r@   closeReceivedzSSHSession.closeReceived  s(    %dV,-		D!rB   c                     t        j                  d|         t        j                  t        | j                  j                               y )Nzclosed )r   r   r   r   r  r   s    r@   closedzSSHSession.closed  s0    '$ !TYY''()rB   c                     t        t        j                  d|      d         at	        j
                  dt                y )Nz>Lr   zexit status: )rF   r%  r&  r   r   r   rE  s     r@   request_exit_statuszSSHSession.request_exit_status  s/    tT2156
-
|,-rB   c                 :    | j                   j                  |        y r   )r   r  r   s    r@   r  zSSHSession.sendEOF  s    		$rB   c                 8    | j                   j                          y r   )r   pauseProducingr   s    r@   stopWritingzSSHSession.stopWriting  s    

!!#rB   c                 8    | j                   j                          y r   )r   resumeProducingr   s    r@   startWritingzSSHSession.startWriting  s    

""$rB   c                     t        j                  dt        j                  d      }t	        j
                  d|      }|d   |d   |d   |d   f}| j                  j                  | dt	        j                  dg|        y )	Nr   r  r  r7   r6   r   s   window-changez!4L)	r"  r#  r"   r$  r%  r&  r   r  pack)r>   r   r,  r-  newSizes        r@   r(  zSSHSession._windowResized  sk    As~~z:--e,!*gaj'!*gaj@		d$4fkk%6R'6RSrB   N)rU   rV   rW   namer/  r  r  rJ  rM  rP  rR  rT  r  rX  r[  r(  ra   rB   r@   r   r   v  sF    D'7V+Z')"*
.
 $%TrB   r   c                       e Zd Zy)r   NrU   rV   rW   ra   rB   r@   r   r         rB   r   c                       e Zd Zy)r   Nra  ra   rB   r@   r   r     rb  rB   r   c                      t         sy t        j                  j                         } t	        j
                  | t        j                  t               da y rg   )
_inRawModer<   rz   r{   r"   r   r   _savedRawMode)r   s    r@   r6  r6    s3    				BMM"ckk=1JrB   c                     t         ry t        j                  j                         } 	 t	        j
                  |       }|d d  }|d   t        j                  z  |d<   |d   t        j                  t        j                  z  t        j                  z  t        j                  z  t        j                  z  t        j                  z  t        j                  z   z  |d<   t        t        d      r|d   t        j                   z  |d<   |d   t        j                   t        j"                  z  t        j$                  z  t        j$                  z  t        j&                  z  t        j(                  z  t        j*                  z   z  |d<   t        t        d      r|d   t        j,                   z  |d<   |d   t        j.                   z  |d<   d|d   t        j0                  <   d|d   t        j2                  <   |at	        j6                  | t        j8                  |       da y # t:        $ r t=        j>                  d       Y y w xY w)Nr   IUCLCr   IEXTENr7      znot a typewriter!) re  r<   rz   r{   r"   r|   IGNPARISTRIPINLCRIGNCRICRNLIXONIXANYIXOFFr   rh  ISIGICANONECHOECHOEECHOKECHONLri  OPOSTVMINVTIMErf  r   r   r~   r   r   )r   r}   news      r@   r  r    s   				B*mmB!f
 Q#**$AQJJiiii ii hh	
 ii ii
 
A 3 Vsyyj(CF QHHjjhh hh ii	
 ii jj
 
A 3!Vszzk)CF Q399*$AAsxxAsyyb#++s+
O  %#$%s   H H?>H?__main__):r"  r   r   r   r%  r<   r"   typingr   r   twisted.conch.clientr   r   twisted.conch.client.optionsr   twisted.conch.errorr   twisted.conch.sshr	   r
   r   r   r   twisted.internetr   r   r   r   r   r   twisted.python.compatr   r   r   ro   r   r   r}   re  rf  r   r   r   ry   r   r   ri   r   r   r   r   
SSHChannelr   r   r   r6  r  rU   ra   rB   r@   <module>r     s     	   
 
  1 5 * N N 1 1 % 7R,L R,l 


9x
G*)!H.
0-
1 12AEJ,, AEHET## ETP	z'R'R 		*"H"H 	/d zE rB   