transfere um arquivo para o diretório remoto somente se não existir sem substituir

3

Estou usando o CentOS linux.

Em uma linha cmd, que retorna 0 se tiver sucesso, não 0 se falhar, preciso:

  1. Transfer a file to a remote server.
  2. Don't transfer the file if filename exists in remote server (return non-0)

Eu pensei em usar rsync , mas ele retorna 0 se o nome do arquivo existir. scp substitui o arquivo existente, então não me ajuda também.

Uma diferença : o usuário que executa este comando é não root, os arquivos são de propriedade desse usuário. O destino é de propriedade do mesmo usuário. Existe uma ssh de confiança para raiz. Mas não para esse usuário. Não pode ser solicitado por senha, porque esse comando faz parte de um script automático. Etapas de configuração preliminares são possíveis. Eu posso adicioná-los como uma configuração única. Alguém pode ajudar?

    
por csny 21.07.2014 / 17:38

2 respostas

1

Veja uma maneira simples que não preserva os metadados:

ssh server.example.com 'set -C; cat >/path/to/remote/file' </path/to/local/file

Você pode fazer isso com o rsync com as opções certas. O código de retorno será 0 se o arquivo existir, mas você poderá descobrir a partir da saída detalhada.

changes=$(rsync -a --ignore-existing --itemize-changes \
                /path/to/local/file server.example.com:/path/to/remote/file)
if [ $? -ne 0 ]; then
  echo >&2 "Some error occured"
  return 2
elif [ -n "$changes" ]; then
  echo "The file was copied"
  return 0
else
  echo "The file already existed"
  return 1
fi
    
por 22.07.2014 / 01:24
-1

Verifique se o arquivo existe no host remoto primeiro:

if ! ssh remotehost [ -f incoming/DB1026910.sql ]; then
    scp DB1026910.sql remotehost:incoming/
fi
    
por 21.07.2014 / 17:58