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

10

我有两个服务器 A 和 B。我想要从服务器 A 发送一个图片文件到另一个服务器 B,但在发送之前,我想要检查一下服务器 B 上是否已经有了一个类似的文件。我尝试使用 os.path.exists(),但并没有成功。

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

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


“服务器”是什么意思?它是一个SSH服务器吗?我非常确定os.path模块不理解任何网络协议。当然,如果网络路径在文件系统中的某个位置被挂载,那么您可以通过其路径访问它。 - DaveP
1个回答

23

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毫秒。


6
return subprocess.call(['ssh', host, 'test -e ' + pipes.quote(path)]) == 0 - jfs
以下是几个选项:test -e 用于查看是否存在任何文件(目录或常规文件),test -f 用于查看它是否存在并且是一个常规文件,或者 test -d 用于查看它是否存在并且是一个目录。 - jvriesem
因为没有名为 $HOME 的目录,也没有名为 ~ 的目录。原来 $HOME/test 实际上不是文件路径。相反,你必须用 HOME 环境变量的值替换 $HOME,一旦你这样做了,你就得到了一个文件路径。操作系统不会为你完成这个任务。 - Dietrich Epp
1
问题在于,如果您正在测试远程计算机上的文件,则需要该计算机上HOME环境变量的值。您可以通过允许shell扩展来实现此操作,但是允许shell扩展存在潜在的重大安全风险 - Dietrich Epp
1
@jvriesem: 你可能想针对这个问题发起一个单独的提问,因为它比较复杂。其要点是,你可以改变引号的方式,将 test -f '~/abc def' 改为 test -f ~/'abc def',或者只使用 test -f 'abc def'。如果你希望以这种方式工作,你的 Python 代码必须正确解析路径并进行转换。如果 SSH 可用,则通常可以使用类似SFTP的协议。 - Dietrich Epp
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接