SCP falha sem erro

42

Eu tenho experimentado um comportamento muito estranho do SCP por algum tempo: sempre que eu tento copiar um arquivo, a saída do SCP contém muitos underscores e o arquivo não é copiado.

$ scp test.txt 192.168.0.2:~
[email protected]'s password: 
 ________________________________________

Quando eu crio uma conexão SSH usando o Midnight Commander e copio os arquivos, ele funciona.

Algumas informações sobre minha máquina:

$ ssh -V
OpenSSH_5.8p1 Debian-1ubuntu3, OpenSSL 0.9.8o 01 Jun 2010

$ uname -a
Linux squatpc 2.6.38-10-generic #46-Ubuntu SMP Tue Jun 28 15:05:41 UTC 2011 i686 i686 i386 GNU/Linux

Estou executando o Kubuntu 11.04.

Editar: Mais algumas informações solicitadas pelos comentários:

$ scp -v test.txt 192.168.0.2:~
Executing: program /usr/bin/ssh host 192.168.0.2, user (unspecified), command scp -v -t -- ~
OpenSSH_5.8p1 Debian-1ubuntu3, OpenSSL 0.9.8o 01 Jun 2010
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug1: Connecting to 192.168.0.2 [192.168.0.2] port 22.
debug1: Connection established.
debug1: identity file /home/job/.ssh/id_rsa type 1
debug1: Checking blacklist file /usr/share/ssh/blacklist.RSA-2048
debug1: Checking blacklist file /etc/ssh/blacklist.RSA-2048
debug1: identity file /home/job/.ssh/id_rsa-cert type -1
debug1: identity file /home/job/.ssh/id_dsa type -1
debug1: identity file /home/job/.ssh/id_dsa-cert type -1
debug1: identity file /home/job/.ssh/id_ecdsa type -1
debug1: identity file /home/job/.ssh/id_ecdsa-cert type -1
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.8p1 Debian-1ubuntu3
debug1: match: OpenSSH_5.8p1 Debian-1ubuntu3 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.8p1 Debian-1ubuntu3
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: sending SSH2_MSG_KEX_ECDH_INIT
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: Server host key: ECDSA 28:f3:2b:31:36:43:9b:07:d8:33:ca:43:4f:ca:6c:4c
debug1: Host '192.168.0.2' is known and matches the ECDSA host key.
debug1: Found key in /home/job/.ssh/known_hosts:20
debug1: ssh_ecdsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: Roaming not allowed by server
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /home/job/.ssh/id_rsa
debug1: Authentications that can continue: publickey,password
debug1: Trying private key: /home/job/.ssh/id_dsa
debug1: Trying private key: /home/job/.ssh/id_ecdsa
debug1: Next authentication method: password
[email protected]'s password: 
debug1: Authentication succeeded (password).
Authenticated to 192.168.0.2 ([192.168.0.2]:22).
debug1: channel 0: new [client-session]
debug1: Requesting [email protected]
debug1: Entering interactive session.
debug1: Sending environment.
debug1: Sending env LANG = en_US.UTF-8
debug1: Sending command: scp -v -t -- ~
 ________________________________________
debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: channel 0: free: client-session, nchannels 1
debug1: fd 0 clearing O_NONBLOCK
debug1: fd 1 clearing O_NONBLOCK
Transferred: sent 2120, received 1872 bytes, in 0.3 seconds
Bytes per second: sent 7783.1, received 6872.6
debug1: Exit status 0

e

$ type scp
scp is hashed (/usr/bin/scp)
    
por Job 07.08.2011 / 14:19

2 respostas

71

Ok, LOL, acabei de descobrir qual é o problema.

Como gosto muito de vacas, coloquei fortune | cowsay no topo do meu arquivo .bashrc , o que produz uma saída como a seguinte ao iniciar o bash :

 _______________________________________
< You will lose an important disk file. >
 ---------------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

Está tudo bem (e às vezes engraçado) ao executar bash interativamente. No entanto, o bash lê ~/.bashrc quando é interativo e não um shell de login, ou quando é um shell de login e seu processo pai é rshd ou sshd . Quando você executa scp , o servidor inicia um shell que inicia uma instância scp remota. A saída de .bashrc confunde scp porque é enviada da mesma forma que os dados do protocolo scp são enviados. Este é aparentemente um bug conhecido, veja aqui para mais detalhes.

Observe também que os sublinhados que mencionei na pergunta são os da linha superior do balão de texto.

Portanto, a solução era simples: coloquei o seguinte na parte superior de .bashrc na máquina remota (destino):

# If not running interactively, don't do anything
[[ $- == *i* ]] || return

Esta linha está presente no padrão .bashrc , mas foi desativada devido a minhas muitas edições (aparentemente descuidadas).

    
por 12.08.2011 / 19:06
5

AFAIK, o caminho certo para ativar scp sem impedimentos é menos sobre qual condicional para stdout no script ~/.bashrc e mais sobre simplesmente restringir a saída da tela ao script ~/.bash_profile . Pelo menos é assim que funciona para a minha distro (CentOS).

Edite para maior clareza:

  1. Coloque apenas as linhas no seu arquivo ~ / .bashrc, conforme exigido por "todas" as conexões remotas (ou seja, a configuração de determinados ENV vars é OK, mas a reprodução de texto legível por humanos não é.)
  2. YMMV
por 25.02.2014 / 23:37

Tags