scp não funciona, mas ssh

56

Se eu quiser enviar algo via scp para o servidor:

$ scp file server:
                   _____  _____  _____
$

, três linhas são impressas e o arquivo não é copiado. No entanto, eu posso conectar ao servidor via ssh sem problemas:

$ ssh server

Como fazer o scp funcionar?

scdmb
fonte
Fornecer mais informações, tais como o sistema operacional, arquivo de configuração ssh, etc.
qroberts
E quais são essas três linhas que são impressas?
jjlin
No caso normal, quando você executa scp file server:(assumindo que "servidor" seja um nome de host válido), o arquivo é copiado para o diretório da sua conta.
31512 dan_linder
3
Você pode fornecer a saída ao executar "scp -v file server:".
31512 dan_linder
Você pode tentar scpum local diferente no servidor e depois cpou mvdepoisssh
Jesse W. Collins

Respostas:

68

Uma causa possível desse tipo de comportamento é a impressão de qualquer mensagem durante o processo de login no servidor. O Scp depende do ssh para fornecer um túnel criptografado totalmente transparente entre o cliente e o servidor.

Verifique todos os scripts de logon no servidor e tente usar um usuário diferente. Outro método para identificar a origem do erro é usar o -v no comando, para rastrear o andamento da transação e ver onde ela falha. Você pode usar até -vvv para aumentar a verbosidade, se necessário. A verificação das várias formas de scp também pode ser instrutiva, conforme listado na postagem do InChargeOfIT.

O scp, sob o capô, configura um túnel usando ssh e depois transfere o arquivo sobre esse túnel, com um comando ssh na extremidade oposta para capturar o arquivo à medida que ele se aproxima. Isso é ilustrado pelo uso de tar e ssh para copiar uma estrutura de diretório, preservando os tempos de propriedade e criação com os seguintes comandos:

  tar czf - ./* | ssh [email protected] tar xzf - -C ~/saved_tree

enviá-lo e

ssh [email protected] "tar czf - ~/saved_tree" | tar xzvf - -C ./

recuperá-lo.

faitjx
fonte
É realmente útil
bordo
É possível detectar scp dentro de .bashrc? Para que você possa verificar e imprimir apenas a saída quando o shell não for um scp?
Alexandros
O usuário também precisa ter o nível de privilégio 15. Se o usuário não tiver o nível de privilégio 15, o ASA fechará a conexão após a autenticação sem nenhuma mensagem de erro indicando um problema de privilégio. Além disso, o fato de o usuário digitar enablee digitar uma senha não significa que ele é privado 15. Se você não vê o "privilégio 15" em algum lugar show run | inc USERNAME, ele não poderá scp.
precisa
Eu basicamente removi o "zsh" do meu .bashrc no servidor remoto e o scp começou a funcionar!
21718 Geek
Também quebra se você alterar a variável SHELL (por exemplo export SHELL=/bin/zsh) em ~/.bashrc. Isso às vezes está sendo usado na ausência de chsh.
Suuuehgi
58

Verifique o arquivo .bashrc ou equivalente do usuário de destino. ~ / .bashrc é fornecido para logins não interativos. Se houver um eco ou comando que produza alguma coisa, ele quebrará o protocolo SCP.

Spoulson
fonte
10
EUREKA! Este foi o meu problema porque eu tinha uma fortuna | cowsay em cada login no meu .bashrc remoto. Agora trabalhando perfeitamente.
Thomas Browne
3
Você senhor, é um salva-vidas. :)
Gaurav Manchanda
4
Se você ainda deseja o seu fortune | cowsay, basta colocá-lo em .bash_profile. Isso é apenas para logons interativos e não deve ser originado durante a sessão do SCP.
Spoulson 15/05
Meu problema era que eu estava procurando outro arquivo no meu .bashrc, que não existiria na outra máquina. Você pode usar a lógica nesta resposta para pular ~/.bashrcquando não interativo (que é o caso scp).
wisbucky 16/09
15

Edit: Você está certo de que está inserindo um caminho válido no comando scp? Por exemplo:

scp test.txt [email protected]

falhará (na verdade, apenas imprimirá o comando como você está vendo). Nesse caso, você precisará fornecer um caminho válido para o servidor remoto.scp test.txt [email protected]:~/

Exemplos de usos:

Envie um arquivo:

scp /path/to/local/file [email protected]:/path/to/remote/directory

Obtenha um arquivo:

scp [email protected]:/path/to/remote/file /path/to/local/directory

Exemplos:

Envie um arquivo da minha área de trabalho para minha pasta pessoal em um servidor remoto:

scp ~/Desktop/myfile.txt [email protected]:~/

Lembre-se de que ~é um atalho para o seu diretório pessoal ... por exemplo, / home /

Envie um arquivo para o webroot:

scp ~/Documents/working/index.html [email protected]:/var/www/index.html

Neste exemplo, o usuário john_doe precisaria de privilégios de gravação no diretório remoto / var / www.

InChargeOfIT
fonte
2
você não está respondendo a pergunta. a linha de comando dada pelo OP parece razoavelmente correta, a parte interessante é a ------... nenhum dos seus exemplos se relaciona a isso.
akira
@akira talvez, talvez não. Não fornecer caminhos válidos fará com que o comando scp falhe. Por exemplo, scp somefile [email protected]:além disso, não ter as permissões corretas no diretório remoto também causaria problemas. Editou minha resposta para torná-la um pouco mais clara
InChargeOfIT
1
nenhum dos seus exemplos cobrir "arquivo não existe", nenhum dos seus exemplos cobrir "permissões errado no lado do servidor" ...
akira
4

Em alguns hosts, eles originam incorretamente .bash_profilelogins não interativos como o scp. As mensagens impressas no terminal podem scpnão funcionar corretamente. Se você tiver mensagens no seu, .bash_profileisso pode ser a causa.

Para ainda exibir suas mensagens de login, banner etc. em logins interativos e ainda poder usá-lo scppor meio de um logon não interativo, adicione o seguinte antes de qualquer mensagem que seja impressa em seu .bash_profilearquivo.

# ********** If not running interactively, don't do anything more! ***********

[ -z "$PS1" ] && return

O código alternativo é:

[[ $- == *i* ]] || return

E outro código alternativo:

case $- in
    *i*) ;;
      *) return;;
esac

Acredito que seja a versão mais longa do primeiro código alternativo. Eu encontrei em alguns hosts o primeiro código não funciona corretamente, mas o segundo.

Durante um login scp não interativo, ele interromperá a execução de .bash_profile e permitirá que o scp funcione, mas exibirá suas mensagens de login quando você fizer login via ssh.

Nota: Isso também pode ser usado no seu .bashrcarquivo se você o .bash_profileoriginar (por $ PATH), portanto apenas parte dele é originada durante logins não interativos.

frederickjh
fonte
obrigado trabalha como um encanto ........
somethingSomething
0

Isso não responde diretamente à pergunta, mas pode ser útil para pessoas como eu, procurando uma solução com um scp congelante ao transferir arquivos entre 2 hosts remotos.

Se scptravar por causa das mensagens do ssh, isso pode ajudar a suprimi-las:

scp -o "StrictHostKeyChecking no"

e / ou

scp -B

Do homem scp:

-B Seleciona o modo em lote (impede a solicitação de senhas ou frases secretas).

-o ssh_option Pode ser usado para passar opções para ssh no formato usado, pois não há sinalizador de linha de comando scp separado. Para detalhes completos das opções listadas abaixo e seus possíveis valores, consulte ssh_config (5).

No meu caso, isso pareceu ajudar, mas não resolveu todo o problema. Não foi possível descobrir por que o scp trava ao transferir de remoto para remoto. Ele ficou no meio do arquivo. 9 vezes funcionou, a tentativa número 10 não. Suspeitamos que isso ocorra quando nossa conexão VPN receber um pico de tráfego por um momento e o scp não se recuperar. Ele realmente trava para sempre e nem sequer dá uma mensagem de erro.

No entanto, desisti e mudei para o sftp. Isso é razoavelmente mais rápido, pois usa uma conexão direta entre os hosts remotos. Você precisa habilitar

Host example.com
    AgentForward yes

no arquivo ~ / .shh / config da máquina que está executando o script. Obviamente, isso é apenas uma solução se as máquinas remotas estiverem dentro da sua rede confiável.

anarchist912
fonte
0

Eu estava chamando exec /bin/bashno .cshrc.

Remover isso resolveu o problema para mim.

mergulhos
fonte