O MOTD criado pelo usuário impede que o SCP funcione

2

Eu criei MOTDs personalizados para serem exibidos no login via SSH, fazendo o seguinte:

  1. crie um arquivo de texto em /etc/usermotd/<username> com a mensagem dentro
  2. Edite o arquivo .bashrc do usuário e coloque o seguinte código:
if [ -f /etc/usermotd/'whoami' ]; then
cat /etc/usermotd/<username>;
fi

Funciona como eu quero. No entanto ...

Acabei de descobrir que quando tento SCP alguma coisa, não funciona. Eu faço o comando scp e sai sem dar qualquer tipo de barra de progresso ou dizendo que ele foi transferido. Quando eu faço scv -vvv, recebo

debug1: Authentication succeeded (publickey).
debug2: fd 4 setting O_NONBLOCK
debug2: fd 5 setting O_NONBLOCK
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.
debug2: callback start
debug2: client_session2_setup: id 0
debug1: Sending command: scp -v -t ~
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
debug2: channel 0: rcvd adjust 2097152
debug2: channel_input_status_confirm: type 99 id 0
debug2: exec request accepted on channel 0

WELCOME
debug2: channel 0: read<=0 rfd 4 len 0
debug2: channel 0: read failed
debug2: channel 0: close_read
debug2: channel 0: input open -> drain
debug2: channel 0: ibuf empty
debug2: channel 0: send eof
debug2: channel 0: input drain -> closed
BigBoss ~/.ssh:-$ debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
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: 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 
debug1: fd 0 clearing O_NONBLOCK
debug1: fd 1 clearing O_NONBLOCK 
Transferred: sent 2208, received 3352 bytes, in 0.2 seconds
Bytes per second: sent 13207.5, received 20050.5
debug1: Exit status 0

Alguma idéia porque não está enviando? Ou há outra maneira de fazer isso?

    
por Safado 14.09.2011 / 17:29

2 respostas

5

Ele não está funcionando porque o scp espera que o lado remoto se comporte exatamente como "exatamente", e não grite BEM-VINDO de volta para ele. (Seria bom se daria uma mensagem de erro, mas ...).

Use sftp (que não gera um shell de login) em vez de scp ou tenha seu .bashrc detectado se estiver em uma sessão interativa ou não. Parece haver algumas maneiras de fazer isso:

if [ -n "$PS1" ]; then
  echo WELCOME
fi;

O outro método usado para verificar se "$ -" contém "i" parece estar quebrado, pois [ não faz * em comparações de strings. Isso deve funcionar embora (verifica se $ - está definido, então verifica se $ - com "i" removido é o mesmo que $ -. Há provavelmente uma maneira melhor, mas não consigo pensar nisso no segundo )

if [ -n "$-" -a "${-/i}" != "$-" ]; then
  echo WELCOME
fi; 
    
por 14.09.2011 / 19:00
1

Você não pode gerar saída de terminal se quiser que o scp funcione corretamente. O que você tem que fazer é colocar entre colchetes qualquer saída gerando coisas no meu caso, o .cshrc, da seguinte forma:

 if ($?prompt != 0) then
      cat /etc/motd
      endif

Assim, você só gera saída se houver um terminal para recebê-la (por exemplo, um login ssh).

    
por 14.09.2011 / 17:55