o
    Òó·iÙ\  ã                   @   s”  d 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Zddl	m
Z ddl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mZmZmZ ddlm Z  ddl!m"Z"m#Z#m$Z$m%Z% dd	l&m'Z'm(Z( G d
d„ dej)ƒZ*G dd„ de(j+ƒZ,da-da.da/da0dd„ Z1dd„ Z2dd„ Z3G dd„ de#j4ƒZ5G dd„ dej6ƒZ6G dd„ dej7ƒZ7G dd„ dej8ƒZ8G dd„ dej9ƒZ:e;dkrÈe2ƒ  dS dS )z2
Implementation module for the `tkconch` command.
é    N)ÚListÚTuple)Úerror)ÚisInKnownHosts)ÚchannelÚcommonÚ
connectionÚ
forwardingÚkeysÚsessionÚ	transportÚuserauth)Útkvt100)ÚdeferÚprotocolÚreactorÚ	tksupport)ÚlogÚusagec                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚTkConchMenuc                 O   sø  t jj| g|¢R i |¤Ž | j d¡ t  ¡ | _| j d¡ t j| dddd�j	dddd� t  
| ¡| _| jj	d	d	dd
d� t j| dddd�j	dd	dd� t  
| ¡| _| jj	d	d	d	d
d� t j| dddd�j	dddd� t  
| ¡| _| jj	d	d	dd
d� t j| dddd�j	dddd� t  
| ¡| _| jj	d	d	dd
d� t j| dddd�j	dddd� t  
| ¡| _| jj	d	dd
d� t j| | jdd�j	ddd
d� t j| dd�j	dddd� t j| ddd�| _| jj	d	d	dd
d� t j| d| jd�j	ddd� t j| d| jd�j	ddd� t  
| ¡| _| jj	d	dd
d� t j| dd�j	ddd
d� t  
| ¡| _| jj	d	dd
d� t j| d d�j	ddd
d� t j| d!| jdd"�| _| jj	d	d#d� t j| d$| jd%d"�| _| jj	dd#d� t j| d&d�j	ddd'd
d� t j| ddd(d�j	dd)dd� t j
| d*d+�| _| jj	d	d	d)d
d� t j| ddd,d�j	dd-dd� t j
| d.d+�| _| jj	d	d	d-d
d� t j| ddd/d�j	dd0dd� t j
| d1d+�| _| jj	d	d	d0d
d� t j| d2| jd�j	ddd3d
d� | jddd4d5� | j d	dd	d5� | j !d6t"j#¡ d S )7NÚTkConchÚlocalÚwÚleftZHostname)ÚanchorZjustifyÚtexté   )ÚcolumnÚrowÚstickyé   Znesw)r   Z
columnspanr   r   ZPortZUsernameé   ÚCommandé   ZIdentityé   ZBrowse)Úcommandr   zPort Forwarding)r   é   r   )ÚheightÚwidthÚAdd)r   r%   é   )r   r   ZRemoveé   ÚHostZLocal)r   ÚvariableÚvalueé	   ZRemoteÚremotezAdvanced Optionsé
   ZCipheré   Úcipher)ÚnameZMACé   ÚmaczEscape Charé   ÚescapezConnect!é   é@   )ZweightZminsizeZWM_DELETE_WINDOW)$ÚTkinterÚFrameÚ__init__ÚmasterÚtitleZ	StringVarÚlocalRemoteVarÚsetZLabelZgridZEntryÚhostÚportÚuserr%   ÚidentityZButtonÚgetIdentityFileZListboxÚforwardsÚ
addForwardÚremoveForwardÚforwardPortÚforwardHostZRadiobuttonZlocalForwardZremoteForwardr3   r6   r8   Ú	doConnectZgrid_rowconfigureZgrid_columnconfigurer   ÚsysÚexit)ÚselfÚargsÚparams© rR   úcC:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\twisted/conch/scripts/tkconch.pyr=   '   sš   
ÿÿÿÿÿÿÿ
ÿ
ÿÿÿÿÿÿzTkConchMenu.__init__c                 C   s4   t  ¡ }|r| j dtj¡ | j tj|¡ d S d S ©Nr   )ÚtkFileDialogZaskopenfilenamerE   Údeleter;   ÚENDÚinsert)rO   ÚrrR   rR   rS   rF   …   s
   þzTkConchMenu.getIdentityFilec                 C   s‚   | j  ¡ }| j  dtj¡ | j ¡ }| j dtj¡ | j ¡ dkr1| j tjd|› d|› �¡ d S | j tjd|› d|› �¡ d S )Nr   r   úL:ú:úR:)	rJ   ÚgetrV   r;   rW   rK   r@   rG   rX   )rO   rC   rB   rR   rR   rS   rH   ‹   s   

  zTkConchMenu.addForwardc                 C   s&   | j  ¡ }|r| j  |d ¡ d S d S rT   )rG   ZcurselectionÚremove)rO   ÚcurrR   rR   rS   rI   •   s   
ÿzTkConchMenu.removeForwardc           	      C   s   d}| j  ¡ td< | j ¡ td< | j ¡ td< | j ¡ td< | j ¡ }| j ¡ }| j ¡ }|rA|t	j
v r9|gt	_
nt dd¡ d}|rW|t	jv rM|gt	_n
|rWt dd	¡ d}|r’|d
krbd td< n0|d dkr{t|ƒdkr{tt|d ƒd ƒtd< nt|ƒdkr†|td< n|r’t dd| ¡ d}| j ¡ r tj | j ¡ ¡ | j dtj¡D ]}|d dkrºt |dd … ¡ q¨t |dd … ¡ q¨dtd v rØtd  dd¡\td< td< td ràtd sê|rêt dd¡ d}|�rJ| j ¡  | j ¡  td �r	tj}t  tj!¡ |t_nt "¡  t#t_$tj�sddgt_td }t%td �p$dƒ}t &||f¡ t' (||t)ƒ ¡ t*j +¡  t*j ,d -td td ¡¡ d S |  .¡  d S )Nr   rB   rC   rD   r%   r   zBad cipher.r   zBad MAC.Únoner8   ú^r    r:   zBad escape character '%s'.ÚLú@zMissing host or username.r   z~/.ssh/id_rsaz~/.ssh/id_dsaé   z{}@{} - TkConch)/rB   r]   ÚoptionsrC   rD   r%   r3   r6   r8   ÚSSHClientTransportÚsupportedCiphersÚtkMessageBoxZ	showerrorÚsupportedMACsÚlenÚchrÚordrE   Ú	identitysÚappendrG   r;   rW   Úopt_localforwardÚopt_remoteforwardÚsplitr>   ÚquitÚdestroyrM   Ústdoutr   ZstartLoggingÚstderrZdiscardLogsÚhandleErrorÚdeferrÚintÚmsgr   Z
connectTCPÚSSHClientFactoryÚframeZ	deiconifyr?   ÚformatZfocus)	rO   Úfinishedr3   r6   r8   ÚlineZrealoutrB   rC   rR   rR   rS   rL   š   sx   














ÿzTkConchMenu.doConnectN)Ú__name__Ú
__module__Ú__qualname__r=   rF   rH   rI   rL   rR   rR   rR   rS   r   &   s    ^
r   c                	   @   sj  e Zd ZU dZg d¢g d¢g d¢g d¢g d¢g d¢g d¢g d	¢gZg d
¢g d¢g d¢g d¢g d¢g d¢g d¢g d¢gZejjZ	ejj
Zejdge dd„ e	D ƒ¡e dd„ eD ƒ¡ejdd�ejdd�dœe ¡ ejdd�ejddd�gd�Zg Zee ed< 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!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+S ),ÚGeneralOptionsz,Usage:    tkconch [options] host [command]
 )rD   ÚlNzLog in using this user name.)rE   Úiz~/.ssh/identityz&Identity for public key authentication)r8   Úeú~z(Set escape character; ``none'' = disable)r3   ÚcNzSelect encryption algorithm.)ÚmacsÚmNz.Specify MAC algorithms for protocol version 2.)rC   ÚpNz7Connect to this port.  Server must be on the same port.)Úlocalforwardrb   Nz<listen-port:host:port   Forward local port to remote address)ÚremoteforwardÚRNz<listen-port:host:port   Forward remote port to local address)ÚttyÚtz-Tty; allocate a tty even if command is given.)ÚnottyÚTzDo not allocate a tty.)ÚversionÚVzDisplay version number only.)ÚcompressÚCzEnable compression.)ÚnoshellÚNz"Do not execute a shell or command.)Ú	subsystemÚsz-Invoke command (mandatory) as SSH2 subsystem.)r   ÚvzLog to stderr)ÚansilogÚaz!Print the received data to stdout)rŽ   r�   c                 C   ó   g | ]}|  ¡ ‘qS rR   ©Údecode©Ú.0rš   rR   rR   rS   Ú
<listcomp>  ó    zGeneralOptions.<listcomp>c                 C   r�   rR   rž   r    rR   rR   rS   r¢     r£   zlisten-port:host:port)Údescr)r3   rˆ   r‹   rŒ   r%   ZargumentT)r¤   Úrepeat)ZmutuallyExclusiveZ
optActionsZextraActionsrm   ÚlocalForwardsÚremoteForwardsc                 C   s   | j  |¡ d S ©N)rm   rn   )rO   r„   rR   rR   rS   Úopt_identity  ó   zGeneralOptions.opt_identityc                 C   ó8   |  d¡\}}}t|ƒ}t|ƒ}| j |||ff¡ d S ©Nr[   )rq   rx   r¦   rn   )rO   ÚfÚ	localPortZ
remoteHostÚ
remotePortrR   rR   rS   ro      ó   zGeneralOptions.opt_localforwardc                 C   r«   r¬   )rq   rx   r§   rn   )rO   r­   r¯   ZconnHostZconnPortrR   rR   rS   rp   &  r°   z GeneralOptions.opt_remoteforwardc                 C   s   dgt jdd…< d S )NÚzlibr   r   )rf   ZsupportedCompressions©rO   rR   rR   rS   Úopt_compress,  s   zGeneralOptions.opt_compressc                 G   s>   |r|d | d< d  |dd … ¡| d< d S d| d< d| d< d S )Nr   rB   ú r   r%   Ú )Újoin)rO   rP   rR   rR   rS   Ú	parseArgs/  s
   zGeneralOptions.parseArgsN)r   r€   r�   ZsynopsisZoptParametersZoptFlagsr   rf   rg   Z_ciphersri   Z_macsr   ZCompletionsZCompleteListZ	CompleterZCompleteUserAtHostZcompDatarm   r   ÚstrÚ__annotations__r¦   r   rx   r§   r©   ro   rp   r³   r·   rR   rR   rR   rS   r‚   ã   sT   
 óø

ü
ýø  r‚   c                    sJ   t jrtdƒ‚t ¡ ‰ g }|f‡ ‡fdd„	}|t _t  | ¡ t j ¡  ˆ S )Nzcan't ask 2 questions at once!c                    s¸   | sd S | dkrt  ¡  | dkr%t d¡ d |¡}~d t_ˆ  |¡ d S dt| ƒ  kr1dk rCn n| | ¡ ˆrAt | ¡ d S d S t| ƒdkrX|rZˆrRt d¡ | ¡  d S d S d S )	Núúz
rµ   é    é   r+   z )	r   Ústopr{   Úwriter¶   Úcallbackrl   rn   Úpop)ÚchÚrespZstresp©ÚdÚechorR   rS   ÚgotCharE  s*   



ÿ
ýz!deferredAskFrame.<locals>.gotChar)r{   rÀ   Ú
ValueErrorr   ZDeferredr¿   ÚcanvasÚfocus_force)ZquestionrÆ   rÃ   rÇ   rR   rÄ   rS   ÚdeferredAskFrame?  s   

rË   c               
   C   sˆ  t jdd … } d| v r#|  d¡}| ||d … |  } | |d |d …= | d d … D ],}z!|  |¡}|d d… dkrK| |d  d dkrKg | ||d …< W q) tyU   Y q)w t ¡ }| ¡  t ¡ }t|ƒa	t	j
tjtjdd� tƒ azt | ¡ W n" tjyœ } ztd	| ƒ t ¡  t  d¡ W Y d }~nd }~ww t ¡ D ]\}}|r¶tt	|ƒr¶tt	|ƒ tj|¡ q¡tjD ]\}\}	}
t	j tjd
|› d|	› d|
› �¡ qºg t_tjD ]\}\}	}
t	j tjd|› d|	› d|
› �¡ qØg t_tj|d d�a|  dtj!tj" d tj#tj$ d f ¡ tj
tjd� t% &|¡ | ¡  td �r)td �s0dtd v �r5t	 '¡  n| (¡  t) *¡  t  t+¡ d S )Nr   z-lr    r#   z-or   ú-)ÚsideÚfillÚexpandz	ERROR: %srZ   r[   r\   )rÀ   z%dx%dr!   )rÍ   rB   rD   rc   ),rM   ÚargvÚindexrÈ   r;   ZTkZwithdrawZToplevelr   ÚmenuÚpackZTOPZBOTHr‚   re   ZparseOptionsr   Z
UsageErrorÚprintZopt_helprN   ÚitemsÚhasattrÚgetattrrX   rW   r¦   rG   r§   r   Z
VT100Framer{   ZgeometryZ	fontWidthr(   Z
fontHeightr'   r   ÚinstallrL   Zmainloopr   ÚrunÚ
exitStatus)rP   r„   ÚargÚrootÚtopÚuÚkrš   rŠ   ZrhÚrprR   rR   rS   rÙ   `  sh   

$€ÿ€ý€$$ÿÿ
"
rÙ   c                  C   s(   ddl m}  dat |  ¡ ¡ t ¡  ‚ )Nr   ©Úfailurer    )Útwisted.pythonrâ   rÚ   r   ÚerrZFailurer   r¾   rá   rR   rR   rS   rv   “  s
   rv   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	rz   Tc                 C   s   t  ¡  d S r¨   )r   r¾   r²   rR   rR   rS   ÚstopFactory   s   zSSHClientFactory.stopFactoryc                 C   s   t ƒ S r¨   )rf   )rO   ÚaddrrR   rR   rS   ÚbuildProtocol£  s   zSSHClientFactory.buildProtocolc                 C   s    t  dd|j› d|j› �¡ d S )Nr   zConnection Failed, Reason:
 z: )rh   ÚshowwarningÚtyper.   )rO   Z	connectorÚreasonrR   rR   rS   ÚclientConnectionFailed¦  s   þz'SSHClientFactory.clientConnectionFailedN)r   r€   r�   Znoisyrå   rç   rë   rR   rR   rR   rS   rz   �  s
    rz   c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )rf   c                 C   s   d||f a d S )NzDconch:	Remote side disconnected with error code %i
conch:	reason: %s)rÚ   )rO   ÚcodeÚdescrR   rR   rS   ÚreceiveError®  s   ÿÿzSSHClientTransport.receiveErrorc                 C   s    d||f a tj | ||¡ d S )Nz>conch:	Sending disconnect with error code %i
conch:	reason: %s)rÚ   r   rf   ÚsendDisconnect)rO   rì   rê   rR   rR   rS   rï   µ  s
   ÿÿz!SSHClientTransport.sendDisconnectc                 C   s"   |st d rt d| ¡ d S d S )Nr   zReceived Debug Message: %s)re   r   ry   )rO   ZalwaysDisplayÚmessageÚlangrR   rR   rS   ÚreceiveDebug½  s   ÿzSSHClientTransport.receiveDebugc                 C   sÚ   t td |dd iƒ}|dkrt d¡S |dkrt t d¡¡S td | j ¡ j	kr2td }td }nd 
td | j ¡ j	¡}d 
td | j ¡ j	¡}t |¡d }d	 
|d
ddœ| |¡}|d7 }t|dƒ | j|||¡S )NrB   zknown-hostsr   r    úbad host keyz{} ({})z{},{}r   zNThe authenticity of host '{}' can't be established.
{} key fingerprint is {}.ÚDSAÚRSA©s   ssh-dsss   ssh-rsaz9
Are you sure you want to continue connecting (yes/no)? )r   re   r   ÚsucceedZfailr   Ú
ConchErrorr   ZgetPeerrB   r|   r   ZgetNSrË   ÚaddCallbackÚ_cbVerifyHostKey)rO   ÚpubKeyÚfingerprintZgoodKeyrB   ÚkhHostÚkeyTypeZquesrR   rR   rS   ÚverifyHostKeyÂ  s,   

ýÿ

ÿz SSHClientTransport.verifyHostKeyc              	   C   sà   |  ¡ dvrtddƒ | j|||¡S |  ¡ dkr"t d¡ t d¡‚z?t d|dd	d
œ| f ¡ tt	j
 d¡dƒ�}t |¡}| d|› d|› d|› �¡ W d   ƒ W d S 1 sZw   Y  W d S  tyo   t ¡  tj‚w )N)ÚyesÚnozPlease type  'yes' or 'no': r   r  zHost key verification failed.
ró   zBWarning: Permanently added '%s' (%s) to the list of known hosts.
rô   rõ   rö   z~/.ssh/known_hostsrœ   Ú
r´   )ÚlowerrË   rù   rú   r{   r¿   r   rø   ÚopenÚosÚpathÚ
expanduserÚbase64Ú	b64encodeÚBaseExceptionr   rw   )rO   Úansrû   rý   rþ   Zknown_hostsZ
encodedKeyrR   rR   rS   rú   ß  s*   

ÿ

þÿ
&þþz#SSHClientTransport._cbVerifyHostKeyc                 C   s0   t d r	t d }nt ¡ }|  t|tƒ ƒ¡ d S )NrD   )re   ÚgetpassÚgetuserZrequestServiceÚSSHUserAuthClientÚSSHConnection)rO   rD   rR   rR   rS   ÚconnectionSecureô  s   
z#SSHClientTransport.connectionSecureN)	r   r€   r�   rî   rï   rò   rÿ   rú   r  rR   rR   rR   rS   rf   ­  s    rf   c                   @   s@   e Zd ZU g Zee ed< ddd„Zdd„ Zdd„ Z	d	d
„ Z
dS )r  Ú	usedFilesNc                 C   s    |sd  | jtd ¡}t|dƒS )Nz{}@{}'s password: rB   r   )r|   rD   re   rË   )rO   ÚpromptrR   rR   rS   ÚgetPasswordÿ  s   
zSSHUserAuthClient.getPasswordc                    sŒ   ‡ fdd„t jD ƒ}|sd S |d }t |¡ ˆ j |¡ tj |¡}|d7 }tj 	|¡s/d S z	t
j |¡ ¡ W S  tyE   ˆ  ¡  Y S w )Nc                    s   g | ]	}|ˆ j vr|‘qS rR   )r  )r¡   Úxr²   rR   rS   r¢     s    z2SSHUserAuthClient.getPublicKey.<locals>.<listcomp>r   z.pub)re   rm   r   ry   r  rn   r  r  r  Úexistsr
   ÚKeyÚfromFileZblobr
  ÚgetPublicKey)rO   ÚfilesÚfilerR   r²   rS   r    s   
ÿzSSHUserAuthClient.getPublicKeyc              
   C   sž   t j | jd ¡}t j |¡sd S zt tj 	|¡j
¡W S  tjyN } z%|jd dkrCd| jd  }t|dƒ | jd¡W  Y d }~S W Y d }~d S d }~ww )Néÿÿÿÿr   zencrypted key with no passwordúEnter passphrase for key '%s': )r  r  r  r  r  r   r÷   r
   r  r  Ú	keyObjectÚBadKeyErrorrP   rË   rù   Ú_cbGetPrivateKey)rO   r  r…   r  rR   rR   rS   ÚgetPrivateKey  s    þ€ÿzSSHUserAuthClient.getPrivateKeyc                 C   sl   t j | jd ¡}z
tjj||d�jW S  tjy5   |dkr ‚ d| jd  }t	|dƒ 
| j|d ¡ Y S w )Nr  )Úpasswordr    r  r   r   )r  r  r  r  r
   r  r  r  r  rË   rù   r  )rO   r  Úcountr  r  rR   rR   rS   r    s   

ÿüz"SSHUserAuthClient._cbGetPrivateKeyr¨   )r   r€   r�   r  r   r¸   r¹   r  r  r   r  rR   rR   rR   rS   r  ü  s   
 
r  c                   @   s   e Zd Zdd„ ZdS )r  c              	   C   s–   t d s
|  tƒ ¡ t jr!t jD ]\}}t |t | |tj¡¡ qt j	rGt j	D ]!\}}t
 d ||¡¡ t d|f¡}|  d|¡ || j	|< q'd S d S )Nr–   z&asking for remote forwarding for {}:{}z0.0.0.0ztcpip-forward)re   ZopenChannelÚ
SSHSessionr¦   r   Z	listenTCPr	   ZSSHListenForwardingFactoryZ SSHListenClientForwardingChannelr§   r   ry   r|   ZpackGlobal_tcpip_forwardZsendGlobalRequest)rO   r®   Úhostportr¯   ÚdatarR   rR   rS   ÚserviceStarted-  s,   ÿþÿÿ÷zSSHConnection.serviceStartedN)r   r€   r�   r&  rR   rR   rR   rS   r  ,  s    r  c                   @   sP   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ ZdS )r#  s   sessionc                 C   s  d| _ t ¡ }td r| j|_n| j|_| j|_|jt	_
t	j ¡  td r3| j | dt td ¡¡ nRtd ratd rStj dd¡}d	}t ||d
¡}| j | d|¡ | j | dt td ¡¡ n$td s}tj dd¡}d	}t ||d
¡}| j | d|¡ | j | dd¡ | jjj d¡ d S )Nr   r8   r˜   s	   subsystemr%   rŽ   ÚTERMZxterm)é   éP   r   r   rµ   s   pty-reqÚexecr�   s   shelló    )Ú
escapeModer   ZSSHSessionClientre   ÚhandleInputÚdataReceivedr¿   ÚsendEOFZconnectionLostr{   rÀ   rÉ   rÊ   ÚconnZsendRequestr   ZNSr  Úenvironr]   ZpackRequest_pty_reqr   ZsetTcpNoDelay)rO   Zfoor‡   ZtermZwinSizeZ
ptyReqDatarR   rR   rS   ÚchannelOpenG  s0   

zSSHSession.channelOpenc                 C   sÐ   |dv rd| _ |  |¡ d S | j dkr|td krd| _ d S | j dkr^d| _ |dkr5t d¡ t ¡  d S |dkrDt t 	¡ t
j¡ d S |dkrUt d	¡ | jj ¡  d S |  d
| ¡ d S d| _ |  |¡ d S )N)r  r»   r   r8   r    Ú.zdisconnecting from escapeúr�   zrekeying connectionr†   r   )r,  r¿   re   r   ry   r   r¾   r  ÚkillÚgetpidÚsignalZSIGSTOPr0  r   ZsendKexInit)rO   ÚcharrR   rR   rS   r-  h  s*   



zSSHSession.handleInputc                 C   s,   |  d¡}td rtt|ƒƒ t |¡ d S )Nzutf-8r›   )rŸ   re   rÔ   Úreprr{   r¿   ©rO   r%  rR   rR   rS   r.  ‚  s   
zSSHSession.dataReceivedc                 C   s:   |t jkrt dt|ƒ ¡ tj |¡ tj ¡  d S d S )Nzgot %s stderr data)	r   ZEXTENDED_DATA_STDERRr   ry   rj   rM   ru   r¿   Úflush)rO   r�   r%  rR   rR   rS   ÚextReceivedˆ  s
   
ýzSSHSession.extReceivedc                 C   s   t  d¡ tj ¡  d S )Nzgot eof)r   ry   rM   ÚstdinÚcloser²   rR   rR   rS   ÚeofReceivedŽ  s   
zSSHSession.eofReceivedc                 C   s.   t  d|  ¡ t| jjƒdkrt ¡  d S d S )Nz	closed %sr   )r   ry   rj   r0  Zchannelsr   r¾   r²   rR   rR   rS   Úclosed’  s   ÿzSSHSession.closedc                 C   s&   t t d|¡d ƒat dt ¡ d S )Nz>Lr   zexit status: %s)rx   ÚstructÚunpackrÚ   r   ry   r:  rR   rR   rS   Úrequest_exit_status—  s   zSSHSession.request_exit_statusc                 C   s   | j  | ¡ d S r¨   )r0  r/  r²   rR   rR   rS   r/  œ  rª   zSSHSession.sendEOFN)r   r€   r�   r4   r2  r-  r.  r<  r?  r@  rC  r/  rR   rR   rR   rS   r#  D  s    !r#  Ú__main__)<Ú__doc__r  r  r  r7  rA  rM   Útkinterr;   Ztkinter.filedialogZ
filedialogrU   Ztkinter.messageboxZ
messageboxrh   Útypingr   r   Ztwisted.conchr   Ztwisted.conch.client.defaultr   Ztwisted.conch.sshr   r   r   r	   r
   r   r   r   Ztwisted.conch.uir   Ztwisted.internetr   r   r   r   rã   r   r   r<   r   ÚOptionsr‚   re   rÒ   rÚ   r{   rË   rÙ   rv   ZClientFactoryrz   rf   r  r  Z
SSHChannelr#  r   rR   rR   rR   rS   Ú<module>   sF   (
 >V!3
O0\
ÿ