使用 Python 检查远程 SSH 服务器上的文件是不是存在

Posted

技术标签:

【中文标题】使用 Python 检查远程 SSH 服务器上的文件是不是存在【英文标题】:Checking a file existence on a remote SSH server using Python使用 Python 检查远程 SSH 服务器上的文件是否存在 【发布时间】:2013-01-01 18:43:31 【问题描述】:

我有两台服务器 A 和 B。我想发送一个图像文件,从服务器 A 到另一台服务器 B。但是在服务器 A 可以发送文件之前,我想检查是否有类似的文件存在于服务器 B。我尝试使用 os.path.exists() 但它不起作用。

print os.path.exists('ubuntu@serverB.com:b.jpeg')

即使我在服务器 B 上放了一个确切的文件,结果也会返回 false。我不确定是我的语法错误还是有更好的解决方案来解决这个问题。谢谢

【问题讨论】:

“服务器”是什么意思?它是 ssh 服务器吗?我很确定os.path 模块不理解任何网络协议。当然,如果网络路径安装在文件系统的某个位置,那么您可以通过它的路径访问它。 【参考方案1】:

os.path 函数仅适用于同一台计算机上的文件。它们在路径上运行,而ubuntu@serverB.com:b.jpeg 不是路径。

为了实现这一点,您需要远程执行一个脚本。这样的事情通常会起作用:

def exists_remote(host, path):
    """Test if a file exists at path on a host accessible with SSH."""
    status = subprocess.call(
        ['ssh', host, 'test -f '.format(pipes.quote(path))])
    if status == 0:
        return True
    if status == 1:
        return False
    raise Exception('SSH failed')

因此您可以通过以下方式获取文件是否存在于另一台服务器上:

if exists_remote('ubuntu@serverB.com', 'b.jpeg'):
    # it exists...

请注意,这可能会难以置信缓慢,甚至可能超过 100 毫秒。

【讨论】:

return subprocess.call(['ssh', host, 'test -e ' + pipes.quote(path)]) == 0 这里有几个选项:test -e查看是否存在任何文件(目录或常规文件),test -f查看它是否存在并且是常规文件,或test -d查看如果它存在并且是一个目录。 这似乎对包括$HOME/test~/test 在内的路径中断。你知道为什么吗? 复杂之处在于,如果您在远程计算机上测试文件,则需要该计算机上的HOME 环境变量的值。您可以这样做允许 shell 扩展,但允许 shell 扩展存在潜在的重大安全风险 @jvriesem:您可能想为此打开一个单独的问题,因为它很复杂。它的要点是,您可以更改引用使其变为test -f ~/'abc def',或者只是test -f 'abc def',而不是运行test -f '~/abc def'。如果您希望它以这种方式工作,您的 Python 代码必须解析路径并正确转换它。您可能还更喜欢使用 SFTP 之类的协议,如果 SSH 可用,通常可以使用该协议。

以上是关于使用 Python 检查远程 SSH 服务器上的文件是不是存在的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu环境下SSH服务安装SSH远程登录以及SSH数据传输

如何使用Paramiko Python通过SSH从远程服务器复制文件? FileNotFoundError:[WinError 3]系统找不到指定的路径

在 Ubuntu 上配置 SFTP 服务器以使用 PhpStorm 远程访问

Windows 上的 SSH?使用 PowerShell Remoting 远程管理 Windows 服务器

如何使用python实现远程登录到linux再远程登录到另一个linux

使用 SSH 隧道将本地 SQL 文件导入远程服务器上的 MySQL