O sftp dá um erro: “Mensagem recebida muito longa” e qual o motivo?

26

sftpOntem consegui fazer uma caixa RHEL 5.4 (RedHat) e hoje não posso.

A mensagem é "Received message too long 778199411"e, após alguma investigação, foi devido ao fato de minha caixa RHEL .bashrcter uma linha echo "running .bashrc"- ou ecoar qualquer coisa, eu acho.

Então, por que a impressão de uma linha afetaria sftp? Parecia um problema de design, imprimir uma linha em .bashrctrabalhos em outras situações, como logon ou, sshe é meio difícil rastrear quando sftpfalha por um motivo tão estranho.

Portanto, a pergunta é: por que imprimir uma linha causa esse erro e se ainda gostamos de imprimir alguma coisa .bashrc? (principalmente para ver quando esse arquivo é originado / executado).

nopole
fonte

Respostas:

26

Este é um problema de longa data. Eu o encontrei há dez anos quando tive que misturar SSH comercial no trabalho e SSH aberto em casa. Encontrei-o novamente hoje e encontrei este post.

Se eu tivesse pesquisado "sftp / scp falha, mas ssh está OK", teria sido lembrada da solução mais cedo!

Simplificando, .bashrc e .bash_profile etc devem ser silenciosos ou interferem no protocolo de conexão sftp / scp.

Veja o FAQ open-SSH:

2.9 - sftp / scp falha na conexão, mas ssh está OK.

Peter Scott
fonte
Os utilitários de shell com atualização automática são bons culpados para esse problema. Para mim, muitas vezes tem sido o gerente de Ruby Version interferindo no deploy-over-ssh de Jenkins.
Eric P.
Obrigado por isso, a remoção de algumas instruções de eco de depuração que eu tinha no meu bashrc e bash_profile resolveu isso para mim.
SgtPooki
3
.Bashrc incorreto precisa ficar em silêncio, .bash_profile pode ecoar sem problemas.
Kbanczyk
2
Para qualquer pessoa que desembarque aqui: Como sugerido em serverfault.com/a/630714 , você pode usar ssh yourhost /usr/bin/truepara analisar a saída do seu ssh. No meu caso, encontrei algum comando no ~ / .bashrc que começou a produzir erros.
Yuval Atzmon
16

Pelo menos para SFTP, isso pode ser corrigido usando o internal-sftpsubsistema, pois ele não lê .bashrcou /etc/motd.

Simplesmente altere o /etc/ssh/sshd_configarquivo e o subsistema SFTP:

#Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp

E o erro se foi.

Kenneth
fonte
Eu gosto deste .. só me pergunto se isso tem implicações de segurança?
RoyM 8/17/17
internal-sftpé, na IMO, a melhor maneira de oferecer suporte a SFTP. Você pode ver este post relacionado: serverfault.com/questions/660160/...
Kenneth
Após sua sugestão de alteração do sshd_config, matei o sshd e o sftp (não tenho certeza se havia um demônio). A primeira vez que recebi o erro Mensagem Recebida foi muito longa, mas estava logada de qualquer maneira. Então, de volta ao mesmo problema
clearlight
2

Todas as respostas que eu já vi em qualquer lugar afirmam que é muita saída impressa via /etc/motd, ou .bashrcetc. Nem sempre é verdade. Se você possui uma conta que não possui .bashrc, a /etc/motdestá vazia e o padrão .bashrcé mínimo, sem saída impressa. AINDA PODE AINDA ter o problema. Se você tiver uma conta de usuário com um shell /sbin/nologinou /bin/falseesse erro ainda ocorrerá.

Por que você faria isso??? Se você estava tentando conceder a alguém preso na raiz sftp, sem acesso seguro ao shell, isso acontecerá.

Solução alternativa: permita sshe coloque-os em uma prisão raiz também. Esse é um problema que precisa ser resolvido ssh, e demora demais para chegar.

TekOps
fonte
Eu tive esse problema exatamente por causa da saída personalizada muito longa no meu .bashrc (eu tenho busca de tela lá). Mas eu ainda tentando descobrir como fazê-lo ignorar isso
vladkras
Sim, poderia ser o caso. Você precisa modificar o ssh. No nosso caso, houve um problema com o shell. Na verdade, usamos um cliente sftp especificamente para a prisão raiz, portanto não precisamos fazer todo o material da prisão raiz.
TekOps
O ponto é que não quero modificar meu .bashrc. Quero me conectar ao servidor com qualquer tamanho de primeira mensagem. Então eu tenho que modificar as configurações do meu IDE provavelmente
vladkras
2

basta colocar o seguinte no topo de ~ / .bashrc no nome de usuário do id na máquina remota se esse ID usar o bash

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

que simplesmente sai mais cedo do ~ / .bashrc, em vez de buscar o arquivo inteiro ... isso resolve silenciar o .bashrc quando você não está efetuando login nesse ID e está executando seu scp ou sftp com esse nome de usuário como o ID remoto ... para citar Peter Scott em outra resposta: "Simplificando, .bashrc e .bash_profile etc precisam ficar em silêncio ou interferem no protocolo de conexão sftp / scp."

Como alternativa, se esse ID remoto usar zsh, coloque o seguinte no topo de seu ~ / .zshrc

# If not running interactively, don't do anything and return early
[[ -o interactive ]] || exit 0

Se o shell em sua máquina remota não usa ~ / .bashrc, faça a edição acima no arquivo ~ / .bashrc_profile ou ~ / .profile ou similar para se adequar ao shell nessa caixa remota

Scott Stensland
fonte
1

Pode haver mais um motivo. No RHEL 6, com o openssh-5.3p1-122.el6.x86_64, descobrimos que ele se comporta errado quando LOCALE permanece em "C". Quando alterado com:

export LC_ALL="en_US.UTF-8"

Então o sftp se comporta corretamente. No openssh-5.3p1-118 anterior, não experimentamos esse comportamento, portanto é provavelmente um bug menor nesta compilação.

Jaroslav Kucera
fonte
11
Essa sugestão aparentemente estranha foi o que funcionou para a minha situação. Obrigado!
jwd630
0

No meu caso, para fazê-lo funcionar, eu precisava desativar a mensagem de boas-vindas do Ubuntu.

Walty Yeung
fonte