1

Я пишу сценарий sh для загрузки файла с SFTP-сервера Windows. Однако, прежде чем сделать это, я хочу проверить, существует ли файл.

Было много вопросов, которые предлагали скачать winexe или выполнить ssh host@host test -f file и другие альтернативы, но все они не будут работать в моем случае. Мне не разрешено устанавливать что-либо и я должен использовать готовые утилиты.

1 ответ1

0

Стандартный (OpenSSH) SFTP-клиент не предлагает функции для проверки существования файла или чего-либо близкого к нему.


Я предполагаю, что ваш единственный интерфейс - это протокол SFTP, который делает решение независимым от платформы (когда вы подключаетесь к Windows). Таким образом, такие решения, как выполнение test через терминал SSH, нежизнеспособны (как вы сами подтвердили).


Вы можете обойти это, используя команду SFTP с небольшими издержками, которые не выполняются, когда файл не существует. И проверьте код выхода sftp (1 - ошибка, 0 - нормально).

Вы можете использовать для этого команду df (без диска).

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

Хотя команда df внутренне использует собственное расширение OpenSSH протокола SFTP (statvfs@openssh.com). Поэтому сначала нужно проверить, поддерживает ли это ваш SFTP-сервер Windows. Очевидно, что если вы используете OpenSSH (сборка MS Win32 или Cygwin), все в порядке.


Если df не будет работать, единственный другой вариант - попытаться загрузить файл.

В идеале переместите код загрузки до того, как все «уже существующие процессы уже настроены, и для этого требуется файл».

Если это невозможно, вам нужно скачать файл дважды. Сначала проверить его существование. А потом снова на самом деле скачать его.

Поддельная загрузка, чтобы проверить существование файла:

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

Замените /dev/null реальным путем, если вы можете объединить тест и загрузить шаги в один.


Протокол SFTP как таковой может проверять существование файла. Так что, если у вас есть другой клиент SFTP, отличный от OpenSSH, вы можете сделать это проще.

Например, lftp имеет команду find :

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .