如何从本地 Linux 脚本检查远程 SFTP 服务器中是否存在文件?

dru*_*rum 5 windows linux ssh sftp

我正在编写一个sh脚本来从 Windows SFTP 服务器下载文件。但是,在这样做之前我想检查该文件是否存在。

有很多问题建议下载 winexe,或者做ssh host@host test -f file其他替代方案,但所有这些都不适用于我的情况。我不允许安装任何东西,并且必须使用开箱即用的实用程序。

我需要在实际下载之前进行测试的原因是,已经设置了许多预先存在的进程,要求文件在到达下载部分之前存在。不要问我为什么会这样。我进来的时候就已经是这个样子了。

Mar*_*ryl 5

标准 (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
Run Code Online (Sandbox Code Playgroud)

尽管df命令在内部使用 SFTP 协议的专有 OpenSSH 扩展 ( statvfs@openssh.com)。因此,您必须首先测试您的 Windows SFTP 服务器是否支持。显然,如果您使用 OpenSSH(MS Win32 版本或 Cygwin),那就没问题。


如果df不起作用,唯一的其他选择是尝试下载该文件。

理想情况下,将下载代码移至所有“已设置且需要文件存在的现有进程”之前。这是我认为最好的解决方案。正如@Kenster 评论的那样:该文件可能会在您检查和下载之间消失。或者该文件可能存在,但您可能缺乏读取它的权限。检查文件是否存在,与尝试下载文件分开,可能没有您想象的那么有用。

如果不可能,您需要下载该文件两次。首先测试它的存在。稍后再次实际下载它。

虚假下载来测试文件是否存在:

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

/dev/null如果您可以将测试和下载步骤合并为一个,请将 替换为实际路径。


SFTP 协议本身可以测试文件是否存在。因此,如果您有除 OpenSSH 之外的其他 SFTP 客户端,您可能可以更轻松地完成此操作。

例如lftpfind命令:

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

对于类似的问题,请参阅测试是否使用 SFTP 命令下载了任何文件