获取使用SSH.NET库在sftp上复制文件的时间

时间:2015-10-06 06:44:09

标签: c# ssh sftp

我需要花时间使用SSH.NET库在sftp上复制文件。但SftpFile类仅在访问和修改文件时返回(还可以选择以UTC格式返回时间戳)。但是我需要在sftp上复制文件时获取时间戳。这是我尝试过的:

using (var ssh = new SshClient(this.connectionInfo))
{    
    ssh.Connect();
    string comm = "ls -al " + @"/" + remotePath + " | awk '{print $6,$7,$8,$9}'";
    var cmd = ssh.RunCommand(comm);
    var output = cmd.Result;
}

但上面的代码崩溃,但“指定的参数超出了有效值的范围。\ r \ nParameter name:length”在行ssh.RunCommand(comm)处。有没有其他方法可以使用这个库实现这一目标?

此致

1 个答案:

答案 0 :(得分:0)

我想这有点取决于远程端使用的系统。如果你看看这篇文章: https://unix.stackexchange.com/questions/50177/birth-is-empty-on-ext4

我假设在远程端有某种Unix,但指定它会有所帮助。

您看到的错误可能不是来自SSH.NET库本身,而是来自您生成的命令。您是否可以为出现此错误的运行打印comm变量?引用参数可能是一个问题,例如: remotepath包含空格。

我拿了你的例子并在Mono上运行它,它工作正常。正如aboth文章中所讨论的,文件的出生时间可能不会暴露给您系统上的stat命令,它不是我的Ubuntu 14.04.3 LTS。如果您的系统是这种情况,并且您可以在远程系统上存放脚本,请从引用的帖子中获取get_crtime脚本并通过ssh触发它。在具有ext4fs stat的较新系统上似乎将返回创建日期。

修改时间的工作示例:

using System;

using Renci.SshNet; 
using System.IO;
namespace testssh
{
    class MainClass
    {
        public static void Main (string[] args)
        {
            var privkey=new PrivateKeyFile (new FileStream ("/home/ukeller/.ssh/id_rsa", FileMode.Open));
            var authmethod=new PrivateKeyAuthenticationMethod ("ukeller", new PrivateKeyFile[] { privkey});
            var connectionInfo = new ConnectionInfo("localhost", "ukeller", new AuthenticationMethod[]{authmethod});
            var remotePath = "/etc/passwd";
            using (var ssh = new SshClient(connectionInfo))
            {    
                ssh.Connect();
                // Birth, depending on your Linux/unix variant, prints '-' on mine
                // string comm = "stat -c %w " + @"/" + remotePath;

                // modification time
                string comm = "stat -c %y " + @"/" + remotePath;
                var cmd = ssh.RunCommand(comm);
                var output = cmd.Result;
                Console.Out.WriteLine (output);
            }
        }
    }
}