
    VhG                        U 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	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#ee$d<   da%d a&da'd a(da)d Z*d Z+d Z,d#dZ-d Z.d Z/d Z0d Z1d Z2 G d d      Z3 G d dejh                        Z4 G d dejj                        Z6 G d dejn                        Z7 G d dejp                        Z8d  Z9d! Z:e;d"k(  r e*        yy)$    N)Any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     K/home/dcms/DCMS/lib/python3.12/site-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intr2   append)r?   r"   	localPort
remoteHost
remotePorts        rA   opt_localforwardzClientOptions.opt_localforward\   sH     -.GGCL)	:z	N	_
!!9z:.F"GHrC   c                     |j                  d      \  }}}t        |      }t        |      }| j                  j                  |||ff       y)zH
        Forward remote port to local address (rport:host:port)
        rE   N)rF   rG   r3   rH   )r?   r"   rK   connHostconnPorts        rA   opt_remoteforwardzClientOptions.opt_remoteforwarde   sH     *+&
Hh_
x=""J80D#EFrC   c                 6    || d<   dj                  |      | d<   y )Nhost r,   )join)r?   rR   r,   s      rA   	parseArgszClientOptions.parseArgsn   s    V((7+YrC   N)__name__
__module____qualname__synopsislongdescoptParametersoptFlagsr   Completions	CompleterCompleteUserAtHostcompDatar2   r   r   rG   __annotations__r3   rB   rL   rP   rU    rC   rA   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,rC   r   optionsc                     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)Nr8   z-lr7      z-or   -zERROR: r   logfileza+c                  6    t        j                  dt              S Nr   )r   	callLater	reConnect)as    rA   <lambda>zrun.<locals>.<lambda>   s    w'8'8I'F rC   r,   r#   r%   zConnection to {} closed.rR   )$r=   argvindex
ValueErrorr   rc   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           rA   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   failurer7   g{Gz?)	twisted.pythonr   r   r   rj   _stopReactorr   errFailurer   s    rA   handleErrorr      s2    & JdL)GGGOO	rC   c                  L    	 t        j                          y # t        $ r Y y w xY wN)r   stopr   rb   rC   rA   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   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@rR   r8   userz~/.ssh/id_rsaz~/.ssh/id_dsaport   zhost-key-algorithms)rc   rF   	identitysgetpassgetuserrG   r   verifyHostKeygetHostKeyAlgorithmsSSHUserAuthClientSSHConnectionr   
addErrback_ebExit)rR   r   vhkuaos       rA   rz   rz      s    
gfo+26?+@+@a+H(,o>6?!//+6?gfo.DD


C())0)E)EdG)T%&

#
#GFOWmo
NCOOD$c2==gFrC   c                 B    d|  a t        j                  dt               y )Nzconch: exiting with error 皙?)r   r   rj   r   )r"   s    rA   r   r      s    -aS1Jc<(rC   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 rE   beforeshutdownr'   agentr!   r      )hasattrconn	transport
_KeepAliverc   r2   r   	listenTCPr   SSHListenForwardingFactory SSHListenClientForwardingChannelrH   r3   r   msgrequestRemoteForwardingaddSystemEventTriggerbeforeShutdownopenChannel
SSHSessionosr!   _exitsetsidrangecloseOSErrorerrnoEBADF)rI   hostportr*   rK   r   r   r   s          rA   	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   loseConnectionrb   rC   rA   rk   rk   	  s    NN++-rC   c                      t         j                  } | D ]5  \  }}t        j                  d| d|        t        j                  |       7 y )Nzcancelling rE   )rc   r3   r   r   r   cancelRemoteForwarding)r3   rK   r   s      rA   r   r     sH    ++N . 0
H+j\8*56##J/0rC   c                  L    t         d   st        j                  dt               y y )N	reconnectr   )rc   r   rj   r   rb   rC   rA   stopConnectionr     s    ;#|,  rC   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     rA   __init__z_KeepAlive.__init__  s7    	!""4??3crC   c                     | j                   j                  ddd      }|j                  | j                         t	        j
                  d| j                        | _        y )Ns"   conch-keep-alive@twistedmatrix.comrC   r8   	wantReply   )r   sendGlobalRequestaddBoth	_cbGlobalr   rj   	_ebGlobalr   )r?   ds     rA   r   z_KeepAlive.sendGlobal!  sM    II''13! ( 
 	
		$..!$..r4>>BrC   c                 `    | j                   r"| j                   j                          d | _         y y r   )r   cancel)r?   ress     rA   r   z_KeepAlive._cbGlobal(  s*    %%'!%D rC   c                 t    | j                   r,d | _         | j                  j                  j                          y y r   )r   r   r   r   r?   s    rA   r   z_KeepAlive._ebGlobal-  s.    !%DII..0 rC   N)rV   rW   rX   r   r   r   r   rb   rC   rA   r   r     s    C&
1rC   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   r2   r3   r   r   s    rA   serviceStartedzSSHConnection.serviceStarted4  s     rC   c                 l    | j                   }g | _         |D ]  }|j                           t                y r   )r2   r   r   )r?   lfr*   s      rA   serviceStoppedzSSHConnection.serviceStopped;  s6     	A	rC   c                    t        j                  d|f      }| j                  d|d      }t        j                  d| d|        |j                  | j                  ||       |j                  | j                  ||       y )N0.0.0.0s   tcpip-forwardr8   r   zrequesting remote forwarding rE   )	r   packGlobal_tcpip_forwardr   r   r   addCallback_cbRemoteForwardingr   _ebRemoteForwarding)r?   rK   r   datar   s        rA   r   z%SSHConnection.requestRemoteForwardingB  su    22Iz3JK""#3TQ"G/
|1XJGH	d..
HE	T--z8DrC   c                     t        j                  d| d|        || j                  |<   t        j                  t        | j                               y )Nzaccepted remote forwarding rE   )r   r   r3   repr)r?   resultrK   r   s       rA   r   z!SSHConnection._cbRemoteForwardingI  sC    -j\8*EF*2J'T(()*rC   c                 f    t        j                  d| d| d       t        j                  |       y )Nzremote forwarding rE   z failedr   r   )r?   r"   rK   r   s       rA   r   z!SSHConnection._ebRemoteForwardingN  s)    $ZL(7CD
rC   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   r3   	Exceptionr   )r?   rK   r   s      rA   r   z$SSHConnection.cancelRemoteForwardingR  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 r8   zconnect forwarding )remoteWindowremoteMaxPacketr   zdon't know about that port)	r   r   r   unpackOpen_forwarded_tcpipr3   SSHConnectForwardingChannelr	   r   OPEN_CONNECT_FAILED)r?   
windowSize	maxPacketr   remoteHPorigHP	connectHPs          rA   channel_forwarded_tcpipz%SSHConnection.channel_forwarded_tcpip\  s    %x !%@@F&##$A;$---++HQK8IGG))56.
ITX  ..0L rC   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 r8   zstopping connectionr   )r   r   channelsr:   r   	__class__	__bases__channelClosed)r?   r
   s     rA   r  zSSHConnection.channelClosedl  sk    %gY/0t}}"GG)* NN$$Q'55dGDrC   N)rV   rW   rX   r   r   r   r   r   r   r  r  rb   rC   rA   r   r   3  s,    E+
+ ErC   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.comrC   r8   r   c                 ,    t        j                  |       S r   r   )xs    rA   rm   z(SSHSession.channelOpen.<locals>.<lambda>  s    
 rC   r'   r,   r#   r%   r   c                 $    j                         S r   )sendEOF)r  r?   s    rA   rm   z(SSHSession.channelOpen.<locals>.<lambda>  s    T\\^ rC   r   r)   s	   subsystemTERM123456784H s   pty-reqs   execs   shell)r   r   idrc   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	   `        rA   channelOpenzSSHSession.channelOpenz  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!!$#6rC   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)   
   r8   r   r7      .zdisconnecting from escape   c                     t                t        j                  j                          t        j                  j                          t        j                  t        j                         t        j                         t                y r   )_leaveRawModer=   ru   flushr{   r   killgetpidr   SIGTSTPr  rb   rC   rA   _z!SSHSession.handleInput.<locals>._  sB    !OJJ$$&IIOO%GGBIIK8!OrC   r      Rzrekeying connection   #s'   
The following connections are open:
z
  #{} {}
   ~)r  r  rc   r   r   r   r   rj   r   r   sendKexInitr   r	  keyssortr   r   )r?   charr<  r	  	channelIds        rA   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rC   c                 :    | j                   j                  |       y r   )r   r  r?   r   s     rA   r  zSSHSession.dataReceived  s    

rC   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   r:   r   r=   rw   strbufferr  )r?   r$   r   s      rA   extReceivedzSSHSession.extReceived  si    
///GGd3t9+\23cjj!S(

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

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

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

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

""$rC   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  r8   r7   r   s   window-changez!4L)	r#  r$  r#   r%  r&  r'  r   r  pack)r?   r   r-  r.  newSizes        rA   r)  zSSHSession._windowResized  sk    As~~z:--e,!*gaj'!*gaj@		d$4fkk%6R'6RSrC   N)rV   rW   rX   namer0  r  r  rK  rN  rQ  rS  rU  r  rY  r\  r)  rb   rC   rA   r   r   w  sF    D'7V+Z')"*
.
 $%TrC   r   c                       e Zd Zy)r   NrV   rW   rX   rb   rC   rA   r   r         rC   r   c                       e Zd Zy)r   Nrb  rb   rC   rA   r   r     rc  rC   r   c                      t         sy t        j                  j                         } t	        j
                  | t        j                  t               da y ri   )
_inRawModer=   r{   r|   r#   r   r   _savedRawMode)r   s    rA   r7  r7    s3    				BMM"ckk=1JrC   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   IEXTENr8      znot a typewriter!) rf  r=   r{   r|   r#   r}   IGNPARISTRIPINLCRIGNCRICRNLIXONIXANYIXOFFr   ri  ISIGICANONECHOECHOEECHOKECHONLrj  OPOSTVMINVTIMErg  r   r   r   r   r   )r   r~   news      rA   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__)returnN)<r#  r   r   r   r&  r=   r#   typingr   r   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   rc   ra   r   r   r~   rf  rg  r   r   r   rz   r   r   rk   r   r   r   r   
SSHChannelr   r   r   r7  r  rV   rb   rC   rA   <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 rC   