Sourcing arquivo bashrc falha com ssh -t

1
ssh -vvv -F /home/me/.ssh/config serva -t "source ~/.bashrc"

Esta é a saída que recebo quando uso -vvv flag:

debug1: Authentication succeeded (publickey).                    
debug1: channel 0: new [client-session]                          
debug3: ssh_session2_open: channel_new: 0                        
debug2: channel 0: send open                                     
debug1: Requesting [email protected]                  
debug1: Entering interactive session.                            
debug3: Wrote 128 bytes for a total of 2413                      
debug2: callback start                                           
debug2: client_session2_setup: id 0                              
debug2: channel 0: request pty-req confirm 1                     
debug1: Sending command: source ~/.bashrc                        
debug2: channel 0: request exec confirm 1                        
debug2: fd 3 setting TCP_NODELAY                                 
debug2: callback done                                            
debug2: channel 0: open confirm rwindow 0 rmax 32768             
debug3: Wrote 400 bytes for a total of 2813                      
debug2: channel_input_status_confirm: type 99 id 0               
debug2: PTY allocation request accepted on channel 0             
debug2: channel 0: rcvd adjust 2097152                           
debug2: channel_input_status_confirm: type 99 id 0               
debug2: exec request accepted on channel 0                       
debug1: client_input_channel_req: channel 0 rtype exit-status rep
ly 0                                                             
debug1: client_input_channel_req: channel 0 rtype [email protected]
 reply 0                                                         
debug2: channel 0: rcvd eow                                      
debug2: channel 0: close_read                                    
debug2: channel 0: input open -> closed                          
debug2: channel 0: rcvd eof                                      
debug2: channel 0: output open -> drain                          
debug2: channel 0: obuf empty                                    
debug2: channel 0: close_write                                   
debug2: channel 0: output drain -> closed                        
debug2: channel 0: rcvd close                                    
debug3: channel 0: will not send data after close                
debug2: channel 0: almost dead                                   
debug2: channel 0: gc: notify user                               
debug2: channel 0: output drain -> closed                     
debug2: channel 0: rcvd close                                 
debug3: channel 0: will not send data after close             
debug2: channel 0: almost dead                                
debug2: channel 0: gc: notify user                            
debug2: channel 0: gc: user detached                          
debug2: channel 0: send close                                 
debug2: channel 0: is dead                                    
debug2: channel 0: garbage collecting                         
debug1: channel 0: free: client-session, nchannels 1          
debug3: channel 0: status: The following connections are open:
  #0 client-session (t4 r0 i3/0 o3/0 fd -1/-1 cfd -1)         

debug3: channel 0: close_fds r -1 w -1 e 6 c -1               
debug3: Wrote 32 bytes for a total of 2845                    
debug3: Wrote 64 bytes for a total of 2909                         

O log do lado do servidor tem a seguinte mensagem: sshd[18763]: Received disconnect from ...

Estou usando o CentOS 6.4

Editar

Minha pergunta original foi falho. Me desculpe por isso. O que eu queria executar o shell bash com o arquivo rc que eu queria (~ / .bashrc_temp) e, em seguida, executar outra coisa. Eu acho que PROMPT_COMMAND é a opção recomendada que parece, ou ter o comando executado dentro do próprio ~ / .bashrc_temp, que é menos que ideal, mas eu provavelmente posso colocar algumas declarações condicionais.

    
por Forethinker 27.08.2014 / 23:19

1 resposta

1

Quando você faz:

ssh serva -t "source ~/.bashrc"

ssh diz a sshd para invocar o shell de login do usuário remoto como:

the-shell -c 'source ~/.bashrc'

Isso diz ao shell para executar esse comando e sair.

Provavelmente, o que você deseja é executar um shell interativo e ter esse shell interativo para executar o comando source ~/.bashrc e depois para emitir um prompt e ler mais comandos para executar de você.

Primeiro, observe que, no caso de source ~/.bashrc , isso não é necessário, pois bash já origina seu ~/.bashrc quando interativo (na verdade, acima de ssh , até quando não é interativo). Então:

ssh serva

É o suficiente.

Agora, se você quiser executar um comando e, em seguida, um shell interativo, faça o seguinte:

ssh -t serva 'cmd; bash'

(lá, o -t é necessário porque ssh não inicia um pseudo-terminal por padrão quando passou um comando para executar)

cmd não seria executado por esse bash (seria executado pelo shell (seu shell de login) iniciado por sshd para interpretar esse cmd; bash linha de comando).

Se você queria que o bash interativo executasse esse comando. Um truque é usar a variável bash do PROMPT_COMMAND . bash interpreta o conteúdo dessa variável como código shell a ser executado antes de cada prompt. Então você pode fazer:

ssh -t serva 'PROMPT_COMMAND="cmd; unset PROMPT_COMMAND" bash'
    
por 27.08.2014 / 23:40

Tags