Rust ssh2 使用 scp 下载

问题描述 投票:0回答:1

我花了一天时间尝试使用 ssh2 通过 scp 下载文件。为了测试这一点,我在本地主机的端口 22 上设置了一个 OpenSSH 服务器,并为程序创建了一些虚拟文件,以便从一个位置复制到另一个位置。我在 Windows 10 上运行此程序,自从今天早上安装 OpenSSH 功能以来,我没有更改 ssh 配置文件中的任何内容。

当我在 cmd 中执行以下操作时它起作用:

scp username@localhost:c/users/username/logs/from.log c:/users/username/logs/to.log

但是由于某种原因,当我运行程序时,它退出并出现以下错误:

Error: Error { code: Session(-28), msg: "Failed to recv file" }

这是我尝试运行的代码,在第 10 行(在调用 sess.scp_recv 时)是我收到错误的地方:

pub fn test_download() -> Result<(), Box<dyn Error>> {
    let conn = TcpStream::connect("localhost:22")?;
    let mut sess = ssh2::Session::new()?;
    sess.set_tcp_stream(conn);
    sess.set_timeout(5_000);
    sess.handshake()?;
    sess.userauth_password("username", "password")?;

    let (mut remote_file, _) = sess.scp_recv(Path::new(r"c:\users\username\logs\from.log"))?;
    let mut content = String::new();
    remote_file.read_to_string(&mut content)?;

    remote_file.send_eof()?;
    remote_file.wait_eof()?;
    remote_file.close()?;
    remote_file.wait_close()?;

    std::fs::write(r"c:\users\username\logs\to.log", &content)?;

    Ok(())
}

我像疯子一样用谷歌搜索,但找不到对此的解释,所以我来了。请注意,我对 Rust 和 ssh 都是新手。

更新

我运行 sshd.exe -d 并使用我的程序进行连接,日志记录直到最后看起来都很好:

debug1: userauth-request for user user service ssh-connection method password [preauth]
debug1: attempt 0 failures 0 [preauth]
debug1: user domain\\user matched group list administrators at line 87
Accepted password for user from 127.0.0.1 port 52813 ssh2
debug1: monitor_child_preauth: user has been authenticated by privileged process
debug1: monitor_read_log: child log fd closed
debug1: Not running as SYSTEM: skipping loading user profile
**CreateProcessAsUserW failed error:1314**
fork of unprivileged child failed
debug1: do_cleanup

因此,Windows 似乎存在某种特权情况。

已解决

我最终通过使用 std::process::Command crate 并提供路径和密码运行 pscp -pw password -scp Remote local 来解决这个问题,而不是使用 scp_recv 函数

windows rust scp ssh2
1个回答
0
投票

对于那些可能仍然遇到问题的人。 -28 表示 LIBSSH2_ERROR_SCP_PROTOCOL 这并没有真正的帮助。 但是,按照@Caesar 提示,我设法通过确保路径存在来使其正常工作。

let (mut remote_file, stat) = session.scp_recv(&Path::new("/").join("folder").join("file"))?;

希望这有帮助

© www.soinside.com 2019 - 2024. All rights reserved.