O seu lado remoto implementa o "protocolo" do SCP de uma forma, o que não é compatível com a implementação do scp
do OpenSSH, que você normalmente encontrará em uma máquina Linux ou BSD.
Depois de ler o código do OpenSSH scp
, o BSD rcp
e o Putty pscp
(veja abaixo), parece normal que se percorra as fontes para entender o SCP. Esta página da web arquivada diz:
Have you ever wondered how the scp and rcp commands worked? The first time I did I haven't found any documentation on the subject. There is no RFC, no draft, not even README file describing it. After reading the source code I tried again and realized that old version of rcp.c might be really the only original documentation available.
(Jan Pechanec's weblog: "How the SCP protocol works", copy from Februay 15, 2017)
Usando a explicação da página acima e seu comando
scp -v [email protected]:/local/file/path /destination/path
Isso significa que você copia material do sistema remoto ( InterNiche scp
, que está em " fonte "modo")
para o seu sistema (provável OpenSSH scp
, no modo "sink").
No entanto, o sistema remoto fornece caminhos sobre vários diretórios durante a troca no protocolo SCP:
C0777 630 /home/random/sample.txt
<data of sample.txt>
enquanto seu scp
só pode lidar com algo como:
D0755 0 home
D0755 0 random
C0777 630 sample.txt
<data of sample.txt>
E
E
A solução é verificar se há uma implementação scp
diferente em seu sistema local ou tente sftp
:
sftp -q [email protected]:/remote/file/path /local/destination/path
Minha resposta inicial, atualizada posteriormente:
Sink: C0777 630 /home/random/sample.txt
Parece originar de scp
.
Por exemplo você pode dar uma olhada na linha 969 , que é uma versão recente de OpenSSH usado pelo FreeBSD .
if (verbose_mode)
fmprintf(stderr, "Sink: %s", buf);
Tradução: Se no modo verbose, em seguida, exibir a mensagem "Sink:", com a seqüência apontada por buf
Você forneceu a opção -v.
Parece exibir o buffer restante. C0777
parece ser um comando BSD rcp
, consulte o cabeçalho
* scp - secure remote copy. This is basically patched BSD rcp which
* uses ssh to do the data transfer (instead of using rcmd).
e linha 1023 .
Este aqui
error: unexpected filename: /home/random/sample.txt
é escrito pela linha 1051 :
if ((strchr(cp, '/') != NULL) || (strcmp(cp, "..") == 0)) {
run_err("error: unexpected filename: %s", cp);
exit(1);
Tradução: se a seqüência apontada por cp
contiver um caractere de barra ( /
) ou for igual à sequência ..
, imprima a mensagem de erro. Sua sequência apresenta uma barra .
Parece que scp
não está recebendo o que espera de sua conversa com o controle remoto ssh
instance.
Atualização:
Sink
é a parte contrária da chamada Source
. Aqui temos o outro lado da implementação do OpenSSH:
snprintf(buf, sizeof buf, "C%04o %lld %s\n",
(u_int) (stb.st_mode & FILEMODEMASK),
(long long)stb.st_size, last);
Do código antes de ficar claro que esses três argumentos são o modo de arquivo (bits de permissão), o tamanho do arquivo e o nome do arquivo. Novamente, o nome do arquivo não pode conter uma barra, caso contrário, é ignorado .
Parece que uma árvore de diretórios é percorrida recursivamente e apenas o nome do nível percorrido é tratado.
A propósito, o código em OpenSSH scp
parece muito antigo, o material citado já está na implementação do BSD 4.x rcp
. Consulte aqui .
Olhando para a implementação pscp
(Putty scp) aqui podemos reconhecer o material BSD (ver ao redor da linha 1524), mas o tratamento do nome do arquivo é diferente. É por isso que funciona.