Por que estou recebendo um erro de "Sink" ao usar um comando SCP?

0

Estou tentando copiar um arquivo do meu host local para o host remoto usando o comando SCP:

scp -v [email protected]:/local/file/path /destination/path

Surpreendentemente, o comando SCP falha no final após a autenticação por senha. Eu sou capaz de fazer o SSH para o sistema remoto, mas o SCP falha. Aqui está o erro que recebi no final.

debug1: rekey after 4294967296 blocks
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: rekey after 4294967296 blocks
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: password
debug1: Next authentication method: password
[email protected]'s password:
debug1: Authentication succeeded (password).
Authenticated to 192.168.1.12 ([192.168.1.12]:22).
debug1: channel 0: new [client-session]
debug1: Entering interactive session.
debug1: pledge: network
debug1: Sending command: scp -v -f /home/random/sample.txt
Sink: C0777 630 /home/random/sample.txt
error: unexpected filename: /home/random/sample.txt

Qual é a causa da falha, verifiquei que o arquivo de origem existe. Não consigo entender o que é essa mensagem de erro Sink: C0777 630

    
por user7345878 23.01.2018 / 15:27

2 respostas

2

A resposta curta é que o software scp no sistema remoto parece estar enviando uma mensagem de protocolo inválida. Você deve entrar em contato com o fornecedor do software para obter suporte.

Sink: C0777 630 /home/random/sample.txt
error: unexpected filename: /home/random/sample.txt

A mensagem "sink" não é um erro. É apenas uma mensagem dando um comando do protocolo SCP recebido do sistema remoto. Você está recebendo a mensagem "sink" porque está executando scp no modo detalhado. Essa mensagem específica indica que o sistema remoto está enviando um arquivo ('C') com permissões 0777, tamanho 630 bytes e nome do arquivo "/home/random/sample.txt".

A mensagem "error" está indicando um problema com o comando do protocolo SCP. O problema é que o programa OpenSSH scp , que você está usando para o fim local, não aceita um nome de arquivo contendo um caractere '/'.

Veja o que acontece quando eu executo um comando scp similar:

$ scp -v localhost:/etc/services .
...
debug1: Sending command: scp -v -f /etc/services
Sending file modes: C0644 677972 services
Sink: C0644 677972 services

Observe que a parte do nome do arquivo na linha "sink" não é um nome de caminho completo, apenas o nome base do arquivo que está sendo enviado.

Você indicou que o sistema remoto está executando o software SSH de InterNiche . Você deve entrar em contato com esta empresa para obter suporte. Não há um padrão formal para o protocolo SCP que eu conheça, e é difícil até encontrar uma boa descrição do protocolo na Internet. Eu acho que é justo dizer que a maioria das pessoas consideraria a versão OpenSSH de scp como o padrão de fato, e esperaria que outras implementações scp interoperassem com o OpenSSH.

    
por 23.01.2018 / 18:08
1

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.

    
por 23.01.2018 / 16:20