通过c#返回不需要的字符

本文关键字:字符 不需要 返回 通过 | 更新日期: 2023-09-27 18:05:50

当我通过c#使用Plink时,在我的结果之前和之后得到不需要的字符:

命令:

ls -l */informatica/tgtdynamicparams*.out | grep vaulttest| grep 'Sep  1'|awk '{print $9}' | sort
Linux结果:

aaco/informatica/tgtdynamicparams2269885_CHECK_REF_COMPANY.out
cdph/informatica/tgtdynamicparams2225704_CDPHDRUGRECON.out
cdph/informatica/tgtdynamicparams2225704_CDPHELIGRECON.out
merh/informatica/tgtdynamicparams3454321_OPEN_TEST.out
merh/informatica/tgtdynamicparams3454322_OPEN_TEST2.out

c# via Plink result:

[01;32mcdph/informatica/tgtdynamicparams2225704_CDPHDRUGRECON.out[0m
[01;32mcdph/informatica/tgtdynamicparams2225704_CDPHELIGRECON.out[0m
[01;32mmerh/informatica/tgtdynamicparams3454321_OPEN_TEST.out[0m
[01;32mmerh/informatica/tgtdynamicparams3454322_OPEN_TEST2.out[0m
[0m[01;32maaco/informatica/tgtdynamicparams2269885_CHECK_REF_COMPANY.out[0m

我试过以下方法,但没有成功:

StandardOutputEncoding = Encoding.UTF8
StandardOutputEncoding = Encoding.ASCII
StandardOutputEncoding = Encoding.DEFAULT

这是我使用的代码。我已经看到了类似问题的回复,建议使用ssh.net,但我不允许使用它必须是Plink。

private string GetFileNames = @"ls -l */informatica/tgtdynamicparams*.out 
                             | grep vaulttest| grep 'Sep  1'
                             | awk '{print $9}' 
                             | sort";
GetProcessesCommands = new [] {
                               @"cd /src/trs/runjobs",
                               GetFileNames
                              };
Request(ServerName, UserName, Password, GetProcessesCommands);

调用:

private void Request(string remoteHost, string userName, string password, IEnumerable<string> lstCommands)
{
    try
    {
        var psi = new ProcessStartInfo
        {
            FileName = FormInformatiKill.PropFile.Plink,
            Arguments = string.Format("-ssh {0}@{1} -pw {2}", userName, remoteHost, password),
            RedirectStandardError = true,
            RedirectStandardOutput = true,
            RedirectStandardInput = true,
            UseShellExecute = false,
            CreateNoWindow = true,
            StandardOutputEncoding = Encoding.UTF8
        };
        var p = Process.Start(psi);
        _mObjLock = new object();
        _mBlnDoRead = true;
        if( p == null ) return;
        AsyncReadFeedback(p.StandardOutput); // start the async read of stdout
        var strw = p.StandardInput;
        foreach( var cmd in lstCommands )
        {
            strw.WriteLine( cmd ); // send commands 
        }
        strw.WriteLine("exit"); // send exit command at the end
        p.WaitForExit(); // block thread until remote operations are done  
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
        Console.WriteLine(e.StackTrace);
    }
}
private void AsyncReadFeedback(StreamReader strr)
{
    var trdr = new Thread(ReadFeedback);
    trdr.Start(strr);
}
private void ReadFeedback(object objStreamReader)
{
    var strr = (StreamReader) objStreamReader;
    while (!strr.EndOfStream && _mBlnDoRead)
    {
        var line = strr.ReadLine();
        // lock the feedback buffer (since we don't want some messy stdout/err mix string in the end)
        lock (_mObjLock)
        {
            if( line != null ) ListOfFilesResults.Add(line.Trim());
        }
    }
}

我试过Trim()。我甚至花了很多时间去删除我不想要的角色,但似乎有更多的可能性超出了我的编码能力。

通过c#返回不需要的字符

谢谢user2864740 !我添加了——color=never,那些该死的字符就消失了。

            private const string GetFileNames = "ls --color=never -l */informatica/tgtdynamicparams*.out  " +
                                        "| grep vaulttest " +
                                        "| grep 'Sep  1' " +
                                        "| awk '{print $9}' " +
                                        "| sort";

这些是ANSI转义码。

虽然使用--color=never可能有所帮助,但根本问题在于,您运行Plink的方式(使用标准输入提供命令)使其使用交互式会话。现在的大多数系统都被配置为使用一种奇特的格式来列出目录(和其他东西),以便交互式会话更加人性化。

而在您的情况下,没有人参与,所以您应该使用非交互式会话。

有两种方法:

  • 在Plink命令行中提供命令(而不是使用标准输入),如:

    plink.exe -ssh username@example.com -pw password "ls -l ... | grep ... | sort"
    
  • 或者使用-T开关显式强制非交互模式:

    plink.exe -ssh username@example.com -pw password -T
    

    此语法允许您使用标准输入继续提供命令

使用非交互式会话(在正确配置的系统上)可以避免交互式会话的所有麻烦(不仅仅是--color)。所以这是一个更通用的解决方案。


如果这不能为您工作,那一定是因为您的服务器配置错误,并且将ls别名为使用--color,即使是非交互式会话。

如果你不能修复服务器,我建议你同时使用非交互式会话(以避免其他可能的麻烦)和--color=never开关。可能比使用--color=never更好的解决方案是使用unalias ls