2012-02-29 15:44:22 +0000 2012-02-29 15:44:22 +0000
60
60

scp não funciona mas ssh funciona

Se eu quiser enviar algo via scp para o servidor:

$ scp file server:
                   __________  _____
$

, então três linhas são impressas e o ficheiro não é copiado. Contudo, posso ligar-me ao servidor via ssh sem problemas:

$ ssh server

Como fazer o scp funcionar?

Respostas (6)

72
72
72
2012-03-04 02:57:22 +0000

Uma causa possível deste tipo de comportamento é ter qualquer mensagem impressa durante o processo de login no servidor. O scp depende do ssh para fornecer um túnel encriptado totalmente transparente entre o cliente e o servidor.

Verifique todos os scripts de login no servidor, e tente também usar um utilizador diferente. Outro método para identificar a fonte do erro é usar o -v no comando, para rastrear o progresso da transacção, e ver onde esta falha. 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 no post pelo InChargeOfIT.

scp, debaixo do capô, monta um túnel usando ssh, e depois transfere o ficheiro sobre esse túnel, com um comando ssh na extremidade mais afastada para apanhar o ficheiro à medida que este chega. Isto é ilustrado pela utilização de alcatrão e ssh para copiar uma estrutura de directório preservando a propriedade e os tempos de criação com os seguintes comandos:

tar czf - ./* | ssh jf@otherserver.com tar xzf - -C ~/saved_tree

para o enviar, e

ssh jf@otherserver.com "tar czf - ~/saved_tree" | tar xzvf - -C ./

para o recuperar.

61
61
61
2014-06-03 18:20:48 +0000

Verificar o ficheiro .bashrc ou equivalente do utilizador alvo. ~/.bashrc é obtido para logins não-interactivos. Se houver um eco ou comando que produza alguma coisa, este quebrará o protocolo SCP.

15
15
15
2012-02-29 17:21:01 +0000

Edit: Tem a certeza de estar a entrar num caminho válido no comando scp? Por exemplo:

scp test.txt username@remoteserver.com

falhará (de facto, apenas imprimirá o comando como está a ver). Neste caso, terá de fornecer um caminho válido para o servidor remoto… por exemplo: scp test.txt username@remoteserver.com:~/

Exemplo de utilizações:

Enviar um ficheiro:

scp /path/to/local/file yourremoteusername@servername.com:/path/to/remote/directory

Obter um ficheiro:

scp yourremoteusername@servername.com:/path/to/remote/file /path/to/local/directory

Exemplos:

Enviar um ficheiro do meu Desktop para a minha pasta de casa num servidor remoto:

scp ~/Desktop/myfile.txt john_doe@10.1.1.10:~/

Lembre-se que o ~ é um atalho para o seu directório home… por exemplo, /home/

Envie um ficheiro para a raiz da web:

scp ~/Documents/working/index.html john_doe@johndoe.com:/var/www/index.html

Neste exemplo, o utilizador john_doe precisaria de privilégios de escrita no directório /var/www remoto.

5
5
5
2018-12-02 14:21:35 +0000

Nalguns hospedeiros, eles não fornecem correctamente .bash_profile para logins não-interactivos como o scp. As mensagens que são impressas no terminal podem possivelmente fazer com que o scp não funcione correctamente. Se tiver mensagens no seu .bash_profile, esta pode ser a causa.

Para ainda ter as suas mensagens de login, banner, etc. exibidas nos logins interactivos e ainda poder utilizar scp através de um login não interactivo adicione o seguinte antes de qualquer mensagem que imprima no seu ficheiro .bash_profile.

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

[-z "$PS1"] && return

código alternativo é:

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

E outro código alternativo:

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

Que creio ser a versão mais longa do primeiro código alternativo. Encontrei em alguns anfitriões o primeiro código não funciona correctamente, mas o segundo funciona.

Durante um login scp não-interactivo, abortará a execução de .bash_profile e permitirá que o scp funcione, mas exibirá as suas mensagens de login quando iniciar sessão via ssh.

Nota: Isto também pode ser utilizado no seu ficheiro .bashrc se o obtiver de .bash_profile (por $PATH), pelo que apenas parte dele é obtido durante os logins não interactivos.

0
0
0
2018-10-14 14:34:43 +0000

Estava a ligar exec /bin/bash em .cshrc. em Removendo isto resolvi o problema para mim.

0
0
0
2018-10-02 14:01:50 +0000

Isto não responde directamente à pergunta, mas pode ser útil para pessoas como eu, à procura de uma solução com um scp de congelamento ao transferir ficheiros entre 2 anfitriões remotos.

Se scp pendurar por causa de mensagens do ssh, pode ajudar a suprimi-las:

scp -o "StrictHostKeyChecking no"

e / ou

scp -B

Do scp man:

-B Selecciona o modo de lote (evita pedir palavras-passe ou frases-passe).

& > -o ssh_option Pode ser utilizado para passar opções ao ssh no formato utilizado no ssh não existe uma bandeira de linha de comando scp separada. Para detalhes completos das opções listadas abaixo, e os seus possíveis valores, ver ssh_config(5).

No meu caso, isso parecia ajudar, mas não resolveu toda a questão. Não conseguimos descobrir porque é que o scp fica pendurado quando se transfere de remoto para remoto. Ficou pendurado no meio do ficheiro. 9 vezes funcionou, a tentativa número 10 não funcionou. Suspeitámos que poderia ser que pendurasse quando a nossa ligação VPN recebesse um pico de tráfego por um momento e depois o scp não recuperasse. Fica realmente pendurado para sempre e nem sequer dá uma mensagem de erro.

Contudo, desisti e mudei para sftp. Isto é razoavelmente mais rápido, pois utiliza uma ligação directa entre os anfitriões remotos. Tem de activar

Host example.com
    AgentForward yes

no ficheiro ~/.shh/config da máquina que está a executar o script. Claro que isto só é uma solução se as máquinas remotas estiverem ambas dentro da sua rede de confiança.