我需要花时间使用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)
处。有没有其他方法可以使用这个库实现这一目标?
此致
答案 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);
}
}
}
}