Como verificar se existe um arquivo no Windows remoto a partir do script local do Linux?

1

Estou escrevendo um script sh para baixar um arquivo de um servidor SFTP do Windows. No entanto, antes de fazer isso, quero verificar se o arquivo existe.

Houve muitas perguntas por aí sugerindo o download do winexe ou o ssh host@host test -f file e outras alternativas, mas nem todas funcionam no meu caso. Não tenho permissão para instalar nada e usar utilitários prontos para uso.

    
por drum 08.12.2014 / 23:05

1 resposta

0

O cliente SFTP padrão (OpenSSH) não oferece uma função para testar a existência de um arquivo ou algo próximo a ele.

Estou assumindo que sua única interface é o protocolo SFTP para tornar a solução independente de plataforma (conforme você está se conectando ao Windows). Portanto, soluções como executar test em um terminal SSH não são viáveis (como você mesmo confirmou).

Você pode solucionar isso usando um comando SFTP com uma pequena sobrecarga que falha quando o arquivo não existe. E teste para o código de saída sftp (1 para erro, 0 para ok).

Você pode abusar do comando df (disk free) para isso.

echo "df myfile.txt" | sftp -b - example.com
if [ $? -eq 0 ]
then
    echo "File exists"
else
    echo "File does not exist"
fi

Embora o comando df use uma extensão proprietária do OpenSSH do protocolo SFTP internamente ( [email protected] ). Então você tem que testar primeiro, se o seu servidor SFTP do Windows suportar isso. Obviamente, se você usar o OpenSSH (MS Win32 build ou Cygwin), você está bem.

Se o df não funcionar, a única outra opção é tentar baixar o arquivo.

O ideal é mover seu código de download antes de todos os "processos pré-existentes já configurados que exijam a existência do arquivo" .

Se isso não for possível, você precisará fazer o download do arquivo duas vezes. Primeiro para testar sua existência. E mais tarde novamente para baixá-lo.

Download falso para testar a existência de arquivos:

echo "get myfile.txt /dev/null" | sftp -b - example.com
if [ $? -eq 0 ]
then
    echo "File exists"
else
    echo "File does not exist"
fi

Substitua o /dev/null por um caminho real, se você puder mesclar as etapas de teste e download em uma.

O protocolo SFTP, como tal, pode testar a existência de arquivos. Portanto, se você tiver outro cliente SFTP do que o OpenSSH à mão, poderá fazer isso com mais facilidade.

Por exemplo, o lftp tem o Comando find :

lftp -c "open sftp://example.com ; find myfile.txt"
if [ $? -eq 0 ]
then
    echo "File exists"
else
    echo "File does not exist"
fi
    
por 09.12.2014 / 09:29