faça o scp se comportar como deveria (programa de cópia de arquivos remotos) [fechado]

8

Eu quero copiar o arquivo local para um servidor remoto usando scp .

scp -rp local-file my.server.com:/tmp/

Às vezes eu esqueço de especificar onde no servidor remoto o arquivo deve ser copiado:

scp -rp local-file my.server.com

ou, outras vezes, eu mistipo : para um ; :

scp -rp local-file my.server.com;/tmp/

em ambos os casos, scp deve falhar. Mas, em vez disso, ele se comporta de maneira completamente idiota e copia o arquivo local localmente, como faria o cp .

cp local-file my.server.com

Mesmo man scp diz que scp é remote file copy program . Então, por que está falhando silenciosamente e se comportando como cp ?

Qualquer maneira de corrigir isso?

Minha versão de openssh-client é 1:6.0p1-4+deb7u6

    
por Martin Vegter 25.07.2017 / 13:17

5 respostas

7

No bash, você poderia escrever uma função de wrapper como essa.

function scp { 
  if grep -q ':[^ $]' <<< "$*" ; then
    command "${FUNCNAME[0]}" "$@"
  else
    echo "missing or invalid hostname:path in scp command"
    return 1
  fi
}

Este é um exemplo muito grosseiro, tudo o que ele faz é verificar se há um : seguido por pelo menos um caractere não espacial na linha de comando (isso é bom o suficiente para um exemplo de prova de conceito, mas inadequado para uso no mundo real). Se houver, ele executará o comando scp . Caso contrário, imprime uma mensagem de erro e retorna com o código de saída 1.

Ou você pode escrever como um script - isso faz pouca diferença de qualquer forma.

BTW, eu disse "In bash" acima, porque eu só testei a função acima no bash. Não é para implicar que apenas bash pode fazer isso.  A maioria das outras implementações sh permite que você faça o mesmo ou similar. A sintaxe pode variar um pouco, e você pode ter que codificar command scp ... em vez do genérico command "${FUNCNAME[0]} ..." .

PS: Eu não faço nenhum julgamento sobre se o scp "deveria" se comportar assim ou não. Isso é para você decidir sobre seu próprio sistema. No entanto, tornar-se dependente de coisas como essa o coloca em uma desvantagem severa quando você tem que trabalhar no sistema sem todos os seus hacks / muletas.

    
por 25.07.2017 / 14:09
7

resposta curta é que você não pode.

observe que man scp menciona o host remoto como opcional:

scp (scp options removed) [[user@]host1:]file1 ... [[user@]host2:]file2

agora, quando você emitir o comando

scp arg1 arg2

scp decidirá onde é o host remoto procurando por : em arg1 ou arg2 (e dois hosts remotos podem ser permitidos (solaris, ubuntu) embora isso nem sempre tenha sido o caso).

Se nem arg1 nem arg2 tiverem dois pontos, scp simplesmente se comportará como cp .

    
por 25.07.2017 / 14:00
3

Além de outras respostas, observe que scp não é um protocolo separado per se , mas é simplesmente o antigo rcp usando ssh para transporte, em vez de TCP não criptografado. Ele foi planejado como uma substituição imediata em que qualquer rcp com script ou não-script pode ser substituído pelo scp mais seguro sem nenhuma alteração. E rcp permitiu a cópia remota ou local analisando o : .

    
por 25.07.2017 / 15:50
0

Por que não experimentar o sftp ? Você pode cd no servidor remoto e lcd no sistema de arquivos local, em seguida, put para usar um arquivo local no remoto.

    
por 25.07.2017 / 13:26
0

Embora seja chamado de programa de cópia de arquivos remoto, acredito que ele foi projetado para atender às necessidades locais de cópia, juntamente com as necessidades remotas. Esse comportamento foi espelhado no meu ambiente ao testar.

Também vale notar que ao recuperar o valor da variável de ambiente $? depois de executá-lo localmente, um código de retorno de 0 foi observado. Isso indica que ele se comportou como esperado e não gerou um código de erro.

Não tenho certeza se existe uma maneira de contornar esse comportamento padrão, infelizmente. Usar outra ferramenta pode ser a única outra opção.

    
por 25.07.2017 / 13:33

Tags