U
    ¸~HjG  ã                   @   s¾  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„ deƒZ"da#ee$d< da%d a&da'd a(da)dd„ Z*dd„ Z+dd„ Z,ddœdd„Z-dd„ Z.dd„ Z/dd„ Z0dd„ Z1dd„ Z2G d d!„ d!ƒZ3G d"d#„ d#ej4ƒZ4G d$d%„ d%ej5ƒZ6G d&d'„ d'ej7ƒZ7G d(d)„ d)ej8ƒZ8d*d+„ Z9d,d-„ Z:e;d.k�rºe*ƒ  dS )/é    N)ÚAnyÚListÚTuple)ÚconnectÚdefault)ÚConchOptions)Ú
ConchError)ÚchannelÚcommonÚ
connectionÚ
forwardingÚsession)ÚreactorÚstdioÚtask)ÚlogÚusage)ÚioTypeÚnetworkStringc                	   @   s  e Zd ZU dZdZdddgdddd	gd
dddggZdddgdddgdddgdddgdddgdddggZejdg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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d0d1„ ZdS )2Ú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ÚRz<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)ZmutuallyExclusiveZ
optActionsZextraActionsÚlocalForwardsÚremoteForwardsc                 C   sp   |dkrd| d< nZ|d dkrDt |ƒdkrDtt|d ƒd ƒ| d< n(t |ƒdkrZ|| d< nt d	|› d
�¡ dS )z:
        Set escape character; ``none'' = disable
        ÚnoneNr   r   ú^é   é   é@   zBad escape character 'z'.)ÚlenÚchrÚordÚsysÚexit)ÚselfÚesc© r;   ú?/tmp/pip-unpacked-wheel-ewod1tgb/twisted/conch/scripts/conch.pyÚ
opt_escapeO   s    

zClientOptions.opt_escapec                 C   s8   |  d¡\}}}t|ƒ}t|ƒ}| j |||ff¡ dS )zH
        Forward local port to remote address (lport:host:port)
        ú:N)ÚsplitÚintr-   Úappend)r9   r    Ú	localPortZ
remoteHostÚ
remotePortr;   r;   r<   Úopt_localforward\   s    zClientOptions.opt_localforwardc                 C   s8   |  d¡\}}}t|ƒ}t|ƒ}| j |||ff¡ dS )zH
        Forward remote port to local address (rport:host:port)
        r>   N)r?   r@   r.   rA   )r9   r    rC   ZconnHostZconnPortr;   r;   r<   Úopt_remoteforwarde   s    zClientOptions.opt_remoteforwardc                 G   s   || d< d  |¡| d< d S )NÚhostú r*   )Újoin)r9   rF   r*   r;   r;   r<   Ú	parseArgsn   s    zClientOptions.parseArgs)Ú__name__Ú
__module__Ú__qualname__ZsynopsisZlongdescZoptParametersZoptFlagsr   ZCompletionsZ	CompleterZCompleteUserAtHostZcompDatar-   r   r   r@   Ú__annotations__r.   r=   rD   rE   rI   r;   r;   r;   r<   r      sL   
ÿüüøú	

þ
ýú  		r   Úoptionsc                  C   sv  t jdd … } d| krF|  d¡}| ||d … |  } | |d |d …= | d d … D ]\}zB|  |¡}|d d… dkr–| |d  d dkr–g | ||d …< W qR tk
r¬   Y qRX qRtƒ azt | ¡ W nF tjk
�r
 } z$t	d|› �ƒ t 
¡  t  d¡ W 5 d }~X Y nX td	 �rdtd
 �rFtd
 dk�r6t j}nttd
 dƒ}nt j}t j}t |¡ |t _nt ¡  tƒ  t j ¡ }zt |¡aW n tk
�r¤   d aY nX zt tjdd„ ¡}W n tk
�rÖ   d }Y nX zt  ¡  W 5 t�rüt |tjt¡ |�rt tj|¡ td �r$td �s.td �s>t tjtj¡ X t j !¡ �rhtd �sht	d "td ¡ƒ t  t#¡ d S )Nr2   z-lr1   é   z-or   ú-zERROR: r   Úlogfileza+c                  W   s   t  dt¡S ©Nr   )r   Ú	callLaterÚ	reConnect)Úar;   r;   r<   Ú<lambda>¦   ó    zrun.<locals>.<lambda>r*   r!   r#   zConnection to {} closed.rF   )$r7   ÚargvÚindexÚ
ValueErrorr   rN   ZparseOptionsr   Z
UsageErrorÚprintZopt_helpr8   ÚstdoutÚopenÚstderrr   ZstartLoggingZdiscardLogsÚ	doConnectÚstdinÚfilenor!   Ú	tcgetattrÚoldÚBaseExceptionÚsignalÚSIGUSR1Ú	tcsetattrÚTCSANOWÚSIGWINCHÚSIG_DFLr   ÚrunÚisattyÚformatÚ
exitStatus)ÚargsÚiÚargÚur    ZrealoutÚfdZoldUSR1r;   r;   r<   rk   |   sj    

$




 ÿ
rk   c                  C   s0   ddl m}  dat dt¡ t |  ¡ ¡ ‚ d S )Nr   ©Úfailurer1   g{®Gáz„?)	Útwisted.pythonru   rn   r   rS   Ú_stopReactorr   ÚerrZFailurert   r;   r;   r<   ÚhandleError¸   s
    ry   c                   C   s&   zt  ¡  W n tk
r    Y nX d S ©N)r   Ústoprd   r;   r;   r;   r<   rw   Â   s    rw   )Úreturnc                  C   sÌ   dt d kr(t d  dd¡\t d< t d< t js8ddgt _t d sLt ¡ t d< t d s^dt d< ntt d ƒt d< t d } t d }tj}t d	 sœt | t ¡t d	< t 	t d t t
ƒ ¡}t | |t ||¡ t¡ d S )
Nú@rF   r2   Úuserz~/.ssh/id_rsaz~/.ssh/id_dsaÚporté   zhost-key-algorithms)rN   r?   Z	identitysÚgetpassÚgetuserr@   r   ZverifyHostKeyZgetHostKeyAlgorithmsZSSHUserAuthClientÚSSHConnectionr   Ú
addErrbackÚ_ebExit)rF   r   ZvhkZuaor;   r;   r<   r_   É   s     

r_   c                 C   s   d| › �a t dt¡ d S )Nzconch: exiting with error çš™™™™™¹?)rn   r   rS   rw   )r    r;   r;   r<   r…   ß   s    
r…   c                  C   s0  t tjdƒrttƒ tjrLtjD ]*\} }t | t 	t|t
¡¡}tj |¡ q tjr’tjD ]*\}}t d|› d|› �¡ t ||¡ qXt ddt¡ td r¢td r®t tƒ ¡ td �r,t ¡ rÊt d	¡ t ¡  td
ƒD ]P}zt |¡ W qÚ tk
�r( } zd	d l}|j|jk�r‚ W 5 d }~X Y qÚX qÚd S )NZ
sendIgnorez!asking for remote forwarding for r>   ÚbeforeÚshutdownr%   Úagentr   r   é   )ÚhasattrÚconnÚ	transportÚ
_KeepAliverN   r-   r   Z	listenTCPr   ZSSHListenForwardingFactoryÚ SSHListenClientForwardingChannelrA   r.   r   ÚmsgÚrequestRemoteForwardingZaddSystemEventTriggerÚbeforeShutdownZopenChannelÚ
SSHSessionÚosr   Ú_exitÚsetsidÚrangeÚcloseÚOSErrorÚerrnoÚEBADF)rB   Úhostportr(   rC   rp   r   rš   r;   r;   r<   Ú	onConnectå   s>      ÿþ

r�   c                   C   s   t ƒ  tjj ¡  d S rz   )r’   rŒ   r�   ÚloseConnectionr;   r;   r;   r<   rT   	  s    rT   c                  C   s8   t j} | D ](\}}t d|› d|› �¡ t |¡ q
d S )Nzcancelling r>   )rN   r.   r   r�   rŒ   ÚcancelRemoteForwarding)r.   rC   rœ   r;   r;   r<   r’     s    r’   c                   C   s   t d st dt¡ d S )NZ	reconnectr†   )rN   r   rS   rw   r;   r;   r;   r<   ÚstopConnection  s    r    c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
rŽ   c                 C   s*   || _ d | _t | j¡| _| j d¡ d S )Ni,  )rŒ   ÚglobalTimeoutr   ZLoopingCallÚ
sendGlobalÚlcÚstart)r9   rŒ   r;   r;   r<   Ú__init__  s    z_KeepAlive.__init__c                 C   s2   | j jdddd�}| | j¡ t d| j¡| _d S )Ns"   conch-keep-alive@twistedmatrix.comrW   r2   ©Z	wantReplyé   )rŒ   ÚsendGlobalRequestÚaddBothÚ	_cbGlobalr   rS   Ú	_ebGlobalr¡   )r9   Údr;   r;   r<   r¢   !  s      ÿz_KeepAlive.sendGlobalc                 C   s   | j r| j  ¡  d | _ d S rz   )r¡   Úcancel)r9   Úresr;   r;   r<   rª   (  s    
z_KeepAlive._cbGlobalc                 C   s   | j rd | _ | jj ¡  d S rz   )r¡   rŒ   r�   rž   ©r9   r;   r;   r<   r«   -  s    z_KeepAlive._ebGlobalN)rJ   rK   rL   r¥   r¢   rª   r«   r;   r;   r;   r<   rŽ     s   rŽ   c                   @   sL   e 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ƒ   c                 C   s   | a g | _i | _tƒ  d S rz   )rŒ   r-   r.   r�   r¯   r;   r;   r<   ÚserviceStarted4  s    zSSHConnection.serviceStartedc                 C   s(   | j }g | _ |D ]}| ¡  qtƒ  d S rz   )r-   rž   r    )r9   Úlfr(   r;   r;   r<   ÚserviceStopped;  s
    
zSSHConnection.serviceStoppedc                 C   sX   t  d|f¡}| jd|dd�}t d|› d|› �¡ | | j||¡ | | j||¡ d S )Nú0.0.0.0s   tcpip-forwardr2   r¦   zrequesting remote forwarding r>   )	r   ÚpackGlobal_tcpip_forwardr¨   r   r�   ZaddCallbackÚ_cbRemoteForwardingr„   Ú_ebRemoteForwarding)r9   rC   rœ   Údatar¬   r;   r;   r<   r‘   B  s
    z%SSHConnection.requestRemoteForwardingc                 C   s4   t  d|› d|› �¡ || j|< t  t| jƒ¡ d S )Nzaccepted remote forwarding r>   )r   r�   r.   Úrepr)r9   ÚresultrC   rœ   r;   r;   r<   rµ   I  s    
z!SSHConnection._cbRemoteForwardingc                 C   s&   t  d|› d|› d�¡ t  |¡ d S )Nzremote forwarding r>   z failed©r   r�   )r9   r    rC   rœ   r;   r;   r<   r¶   N  s    z!SSHConnection._ebRemoteForwardingc                 C   s`   t  d|f¡}|  d|¡ t d|› �¡ z| j|= W n tk
rJ   Y nX t t| jƒ¡ d S )Nr³   s   cancel-tcpip-forwardzcancelling remote forwarding )r   r´   r¨   r   r�   r.   Ú	Exceptionr¸   )r9   rC   r·   r;   r;   r<   rŸ   R  s    z$SSHConnection.cancelRemoteForwardingc                 C   s€   t  d|›�¡ t |¡\}}t  | j¡ t  |¡ |d | jkrp| j|d  }t  d|› �¡ t|||| d�S ttjdƒ‚d S )NzFTCP r2   zconnect forwarding )ZremoteWindowZremoteMaxPacketrŒ   zdon't know about that port)	r   r�   r   ZunpackOpen_forwarded_tcpipr.   ÚSSHConnectForwardingChannelr   r   ZOPEN_CONNECT_FAILED)r9   Z
windowSizeZ	maxPacketr·   ZremoteHPZorigHPZ	connectHPr;   r;   r<   Úchannel_forwarded_tcpip\  s"    
   ÿ ÿz%SSHConnection.channel_forwarded_tcpipc                 C   sT   t  d|› �¡ t  | j¡ t| jƒdkr<t  d¡ tƒ  n| jjd  | |¡ d S )Nzconnection closing r2   zstopping connectionr   )r   r�   Úchannelsr4   r    Ú	__class__Ú	__bases__ÚchannelClosed)r9   r	   r;   r;   r<   rÁ   l  s    
zSSHConnection.channelClosedN)rJ   rK   rL   r°   r²   r‘   rµ   r¶   rŸ   r½   rÁ   r;   r;   r;   r<   rƒ   3  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d„ Zdd„ Zdd„ Zdd„ ZdS )r“   s   sessionc           	         sÐ  t  dˆ j› d�¡ td r>ˆ jjˆ dddd�}| dd	„ ¡ td
 rJd S td rZtd sbtd shtƒ  t 	¡ }td r�td s�dˆ _
ˆ j|_nˆ j|_‡ fdd	„|_t |¡ˆ _d}td rÚˆ j ˆ dt td ¡¡ nòtd �r^td �rBtjd }t |tjd¡}t d|¡}t ||d¡}ˆ j ˆ d|¡ t tjˆ j¡ ˆ j ˆ dt td ¡¡ nntd �s¼tjd }t |tjd¡}t d|¡}t ||d¡}ˆ j ˆ d|¡ t tjˆ j¡ ˆ j ˆ dd¡ d S )Nzsession z openr‰   s   auth-agent-req@openssh.comrW   r2   r¦   c                 S   s
   t  | ¡S rz   rº   ©Úxr;   r;   r<   rV   €  rW   z(SSHSession.channelOpen.<locals>.<lambda>r%   r*   r!   r#   r   c                    s   ˆ   ¡ S rz   )ÚsendEOFrÂ   r¯   r;   r<   rV   ‹  rW   r   r'   s	   subsystemÚTERMÚ12345678Ú4HÚ s   pty-reqs   execs   shell)r   r�   ÚidrN   rŒ   ÚsendRequestr©   Ú_enterRawModer   ZSSHSessionClientÚ
escapeModeÚhandleInputÚdataReceivedÚwriteZconnectionLostr   Z
StandardIOr
   ZNSr”   ÚenvironÚfcntlÚioctlr!   Ú
TIOCGWINSZÚstructÚunpackZpackRequest_pty_reqre   ri   Ú_windowResized)	r9   Zfoor¬   Úcrs   ZtermÚwinszÚwinSizeZ
ptyReqDatar;   r¯   r<   ÚchannelOpenz  sP       ÿ





zSSHSession.channelOpenc              	   C   s&  |dkrd| _ |  |¡ �n| j dkr:|td kr:d| _ nè| j dk�rd| _ |dkrht d¡ tƒ  d S |dkrˆdd	„ }t d
|¡ d S |dkrªt d¡ | jj	 
¡  d S |dk�r| j d¡ | jj ¡ }| ¡  |D ]$}| j td || jj| ¡ƒ¡ qØd S |  d| ¡ nd
| _ |  |¡ d S )N)ó   
ó   r2   r   r1   ó   .zdisconnecting from escapeó   c                   S   s6   t ƒ  tj ¡  tj ¡  t t ¡ tj	¡ t
ƒ  d S rz   )Ú_leaveRawModer7   r\   Úflushr`   r”   ÚkillÚgetpidre   ÚSIGTSTPrË   r;   r;   r;   r<   Ú_³  s
    

z!SSHSession.handleInput.<locals>._r   ó   Rzrekeying connectionó   #s'   
The following connections are open:
z
  #{} {}
ó   ~)rÌ   rÏ   rN   r   r�   r    r   rS   rŒ   r�   ZsendKexInitr   r¾   ÚkeysÚsortr   rm   )r9   Úcharrä   r¾   Z	channelIdr;   r;   r<   rÍ   ¥  sH    


 
ÿÿÿzSSHSession.handleInputc                 C   s   | j  |¡ d S rz   )r   rÏ   ©r9   r·   r;   r;   r<   rÎ   Ò  s    zSSHSession.dataReceivedc                 C   sN   |t jkrJt dt|ƒ› d�¡ ttjƒtkr>tjj	 
|¡ ntj 
|¡ d S )Nzgot z stderr data)r   ZEXTENDED_DATA_STDERRr   r�   r4   r   r7   r^   ÚstrÚbufferrÏ   )r9   r"   r·   r;   r;   r<   ÚextReceivedÕ  s
    
zSSHSession.extReceivedc                 C   s   t  d¡ | j ¡  d S )Nzgot eof)r   r�   r   ZloseWriteConnectionr¯   r;   r;   r<   ÚeofReceivedÝ  s    
zSSHSession.eofReceivedc                 C   s    t  d| › �¡ | j | ¡ d S )Nzremote side closed )r   r�   rŒ   Z	sendCloser¯   r;   r;   r<   ÚcloseReceivedá  s    zSSHSession.closeReceivedc                 C   s&   t  d| › �¡ t  t| jjƒ¡ d S )Nzclosed )r   r�   r¸   rŒ   r¾   r¯   r;   r;   r<   Úclosedå  s    zSSHSession.closedc                 C   s(   t t d|¡d ƒat dt› �¡ d S )Nz>Lr   zexit status: )r@   rÔ   rÕ   rn   r   r�   rë   r;   r;   r<   Úrequest_exit_statusê  s    zSSHSession.request_exit_statusc                 C   s   | j  | ¡ d S rz   )rŒ   rÄ   r¯   r;   r;   r<   rÄ   ï  s    zSSHSession.sendEOFc                 C   s   | j  ¡  d S rz   )r   ZpauseProducingr¯   r;   r;   r<   ÚstopWritingò  s    zSSHSession.stopWritingc                 C   s   | j  ¡  d S rz   )r   ZresumeProducingr¯   r;   r;   r<   ÚstartWritingõ  s    zSSHSession.startWritingc                 G   sV   t  dtjd¡}t d|¡}|d |d |d |d f}| j | dtjd	|žŽ ¡ d S )
Nr   rÆ   rÇ   r2   r1   rŠ   s   window-changeú!4L)rõ   )	rÑ   rÒ   r!   rÓ   rÔ   rÕ   rŒ   rÊ   Úpack)r9   ro   rØ   rÙ   ZnewSizer;   r;   r<   rÖ   ø  s    zSSHSession._windowResizedN)rJ   rK   rL   ÚnamerÚ   rÍ   rÎ   rî   rï   rð   rñ   rò   rÄ   ró   rô   rÖ   r;   r;   r;   r<   r“   w  s   +-r“   c                   @   s   e Zd ZdS )r�   N©rJ   rK   rL   r;   r;   r;   r<   r�   ÿ  s   r�   c                   @   s   e Zd ZdS )r¼   Nrø   r;   r;   r;   r<   r¼     s   r¼   c                  C   s*   t sd S tj ¡ } t | tjt¡ da d S rR   )Ú
_inRawModer7   r`   ra   r!   rg   rh   Ú_savedRawMode)rs   r;   r;   r<   rß     s
    
rß   c                  C   sZ  t rd S tj ¡ } zt | ¡}|d d … }W n  tk
rL   t d¡ Y �n
X |d tj	B |d< |d tj
tjB tjB tjB tjB tjB tjB  @ |d< ttdƒr¶|d tj @ |d< |d tjtjB tjB tjB tjB tjB tjB  @ |d< ttdƒ�r|d tj @ |d< |d tj @ |d< d|d tj< d|d tj< |at | tj|¡ da d S )Nznot a typewriter!r   ÚIUCLCrŠ   ÚIEXTENr2   é   ) rù   r7   r`   ra   r!   rb   rd   r   r�   ÚIGNPARÚISTRIPÚINLCRÚIGNCRÚICRNLÚIXONÚIXANYÚIXOFFr‹   rû   ÚISIGÚICANONÚECHOÚECHOEÚECHOKÚECHONLrü   ÚOPOSTÚVMINÚVTIMErú   rg   rh   )rs   rc   Únewr;   r;   r<   rË     sb    

ÿþýüûúÿ
	
ÿþýüûúÿ
	rË   Ú__main__)<rÑ   r�   r”   re   rÔ   r7   r!   Útypingr   r   r   Ztwisted.conch.clientr   r   Ztwisted.conch.client.optionsr   Ztwisted.conch.errorr   Ztwisted.conch.sshr	   r
   r   r   r   Ztwisted.internetr   r   r   rv   r   r   Ztwisted.python.compatr   r   r   rN   rM   rŒ   rn   rc   rù   rú   rk   ry   rw   r_   r…   r�   rT   r’   r    rŽ   rƒ   Z
SSHChannelr“   r�   r¼   rß   rË   rJ   r;   r;   r;   r<   Ú<module>   sR    V<
$D 		2
