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

C# 获取使用SSH.NET库在sftp上复制文件的时间,c#,ssh,sftp,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 $

我需要获得使用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\n参数名称:ssh.RunCommandcomm行的长度。使用此库是否有其他方法实现此目的


关于

我想这取决于远程端使用的系统。如果你看这篇文章:

我假设在远程端存在某种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);
            }
        }
    }
}

你的代码对我有用。remotePath的确切值是多少?向我们展示异常调用堆栈。您正在使用哪个版本的SSH.NET?嗨,Martin,它崩溃了,因为我使用的用户没有运行SSH命令的权限。在我在sftp服务器上更改了这个设置之后,代码对我也起了作用。它崩溃了,因为我使用的用户没有运行ssh命令的权限。在我在sftp服务器上更改此设置后,代码也适用于我。因此,我不能依赖此实现,因为客户端可能随时更改此设置,因此我建议使用创建/访问时间。谢谢