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