使用SshNet从远程服务器检索文件夹列表(SSH交互式客户端)

时间:2015-04-30 14:40:04

标签: c# ssh

我正在尝试在C#中创建交互式SSH客户端会话。我正在使用Renci.SshNet库来实现这一目标。为了获得概念证明,我只对连接到服务器,运行“ls”命令以及检索当前目录中的文件夹列表感兴趣。

我已经能够做到这一点,但是,我得到(我相信)我的输出中的服务器域以及文件名。我在底部提供了一张图片,以准确显示我的内容。我不知道如何解析这个....或者我甚至以正确的方式做到这一点?我提供了我的代码,输出图片以及我希望输出的内容。

// using....
using Renci.SshNet;

class Program
{
    private const String NEWLINE = "\n";
    private bool connected = false;
    static void Main(string[] args)
    {
        Console.Write("Enter hostname: ");
        String hostname = Console.ReadLine();
        Console.Write("Enter username: ");
        String username = Console.ReadLine();
        Console.Write("Enter password: ");
        String password = Console.ReadLine();


        PasswordAuthenticationMethod pw = new PasswordAuthenticationMethod(username, password);
        ConnectionInfo ci = new ConnectionInfo(hostname, username, pw);
        SshClient ssh = new SshClient(ci);

        Console.Write("-Connecting...\n");
        ssh.Connect();

        IDictionary<Renci.SshNet.Common.TerminalModes, uint> termkvp = new Dictionary<Renci.SshNet.Common.TerminalModes, uint>();
        termkvp.Add(Renci.SshNet.Common.TerminalModes.ECHO, 53);
        ShellStream shellStream = ssh.CreateShellStream("xterm", 80, 24, 800, 600, 1024, termkvp);

        String line = null;
        String s = null;

        TimeSpan timeout = new TimeSpan(0, 0, 1);
        while ((s = shellStream.ReadLine(timeout)) != null)
        {
            Console.WriteLine(s);
        }
        shellStream.Flush();

        while((line = Console.ReadLine()) != "exit")
        {
            shellStream.Write(line);
            shellStream.Write(NEWLINE);

            while ((s = shellStream.ReadLine(timeout)) != null)
            {
                Console.WriteLine(s);
            }
            shellStream.Flush();
        }
        Console.Write("Press any key to continue...");
        Console.ReadLine();
    }
}

输出:

(我已经突出了我有兴趣获得的部分)

enter image description here

预期产出:

- Connecting...
Last login: Thu Apr 30 10:28:12 2015 from ...
ls     (user input)
    2015-03-18_0
    First_HFSS_Test
    First_Test
    ...

修改

当我使用“dir”而不是“ls”时,我得到了没有其他信息的目录列表。我相信“ls”给了我带有颜色信息的列表。也许目录列表之外的信息是已翻译的颜色数据???

1 个答案:

答案 0 :(得分:1)

那些是ANSI Escape Sequences,不仅用于编码颜色指令,还用于指定光标移动和绘制区域。

您正在获取交互式控制代码,因为a terminal is not a shell。 shell会根据输出决策考虑终端,而您的解决方案可能是禁用别名(实际上是它们的参数)。 This answer建议使用/ bin / ls的完整路径,引用“ls”'ls',反斜杠\ ls或使用命令替换:$(which ls)。

还要注意链接答案上方的注释:可能需要输出重定向,以便命令不会截断其输出,因为它们适应封闭终端的窗口尺寸。这有点令人费解,但也应该完成工作。