【问题标题】:JSch, lock file while session is openJSch,会话打开时锁定文件
【发布时间】:2015-03-29 15:47:41
【问题描述】:

有什么方法可以锁定我正在使用 JSch sftp 通道读取的文件,以防止其他应用程序在会话打开时对其进行修改?

我遇到的问题:当我读/写文件时,其他一些应用程序更改了文件并导致错误。

目前我正在以这种方式读取文件:

ChannelSftp sftp = (ChannelSftp) session.openChannel("sftp");

InputStream stream = sftp.get("/some/file");
try {
    BufferedReader br = new BufferedReader(new InputStreamReader(stream));
    // read from br
} finally {
    stream.close();
}

【问题讨论】:

标签: java ssh jsch


【解决方案1】:

而不是锁定文件(这可能会对您建议更改文件的任何应用程序产生不利影响),并假设您具有 ssh 访问权限和权限,因此您可以使用 ssh 命令将文件复制到临时文件中(如果'nix 系统:'cp /some/file/ /some/temp/file/'),这很可能比通过 scp 传输要快得多。 (有关执行示例,请参阅http://www.jcraft.com/jsch/examples/Exec.java.html)。从那里,scp-get 临时文件。最后,如有必要,通过其他 JSch exec 命令删除临时文件。

【讨论】:

  • 这不是一个非常通用的解决方案。 OP 可能没有对远程服务器的普通 ssh 访问权限。远程服务器可能不是基于 unix 的,因此运行什么命令来制作副本并不明显。他可能无法访问可以创建文件的远程目录。
  • 感谢您的澄清。我更新了我的答案以考虑您的观点
【解决方案2】:

此时的 Jsch supports version 3 of the SFTP protocolThe wikipedia page 包含指向不同版本协议的链接。版本 3 是 here,其中任何地方都没有出现“锁定”一词。也就是说,协议不支持加锁,所以 Jsch 没有什么可以支持的。

SFTP 版本 56 确实支持锁定远程文件。但是,Jsch 不支持这些协议版本。

我补充一下OpenSSH,最广泛使用的 SSH/SFTP 服务器,仅支持 SFTP 版本 3。您必须使用其他一些服务器软件才有希望进行文件锁定。

【讨论】:

    猜你喜欢
    • 2018-06-28
    • 1970-01-01
    • 2016-05-02
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 2014-10-20
    相关资源
    最近更新 更多