Стандартный (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