C# Plink通过C返回不需要的字符#

C# Plink通过C返回不需要的字符#,c#,linux,plink,C#,Linux,Plink,通过C#使用Plink时,我在结果前后都会收到不需要的字符: 命令: ls-l*/informatica/tgtdynamicparams*.out | grep vaulttest | grep'Sep 1 | awk{print$9}| sort Linux结果: aaco/informatica/tgtdynamicparams269885\u CHECK\u REF\u COMPANY.out cdph/informatica/TGTDDynamicParams225704_CDPHD

通过C#使用Plink时,我在结果前后都会收到不需要的字符:

命令:

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

aaco/informatica/tgtdynamicparams269885\u CHECK\u REF\u COMPANY.out
cdph/informatica/TGTDDynamicParams225704_CDPHDRUGRECON.out
cdph/informatica/TGTDynamics225704_CDPHELIGRECON.out
merh/informatica/TGTDDynamicParams3454321\u OPEN\u TEST.out
merh/informatica/tgtdynamicparams3454322\u OPEN\u TEST2.out
C#通过Plink结果:

[01;32mcdph/informatica/tgtdynamics225704\u CDPHDRUGRECON.out[0m
[01;32mcdph/informatica/TGTDynamics225704_CDPHELIGRECON.out[0m
[01;32mmerh/informatica/tgtdynamicparams3454321_OPEN_TEST.out[0m
[01;32mmerh/informatica/tgtdynamicparams3454322\u OPEN\u TEST2.out[0m
[0m[01;32maaco/informatica/TGTDynamicParams269885\u CHECK\u REF\u 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());
        }
    }
}
private void请求(字符串remoteHost、字符串用户名、字符串密码、IEnumerable命令)
{
尝试
{
var psi=新流程开始信息
{
FileName=FormInformatiKill.PropFile.Plink,
Arguments=string.Format(“-ssh{0}@{1}-pw{2}”,用户名,远程主机,密码),
RedirectStandardError=true,
重定向标准输出=真,
重定向标准输入=真,
UseShellExecute=false,
CreateNoWindow=true,
StandardOutputEncoding=Encoding.UTF8
};
var p=过程启动(psi);
_mObjLock=新对象();
_mBlnDoRead=真;
如果(p==null)返回;
AsyncReadFeedback(p.StandardOutput);//启动标准输出的异步读取
var strw=p.StandardInput;
foreach(lstCommands中的var cmd)
{
strw.WriteLine(cmd);//发送命令
}
strw.WriteLine(“exit”);//在末尾发送exit命令
p、 WaitForExit();//在远程操作完成之前阻止线程
}
捕获(例外e)
{
控制台写入线(e.Message);
控制台写入线(如StackTrace);
}
}
私有void AsyncReadFeedback(StreamReader strr)
{
var trdr=新线程(ReadFeedback);
trdr.启动(strr);
}
私有void ReadFeedback(对象objStreamReader)
{
var strr=(StreamReader)objStreamReader;
而(!strr.EndOfStream&&u mBlnDoRead)
{
var line=strr.ReadLine();
//锁定反馈缓冲区(因为我们不希望最后出现混乱的stdout/err混合字符串)
锁(移动锁)
{
如果(line!=null)ListOfficeResults.Add(line.Trim());
}
}
}
我已经尝试了
Trim()
。我甚至花了时间尝试删除我不想要的字符,但似乎有比我可以编码更多的可能性。

谢谢用户2864740! 我加了--color=never,那些该死的角色就消失了

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

虽然使用
--color=never
可能会有所帮助,但根本问题是,您运行Plink(使用标准输入输入输入命令)的方式使其使用交互式会话。现在大多数系统都配置为对交互式会话的目录列表(和其他内容)使用奇特的格式,以更人性化

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

有两种方法可以做到这一点:

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

    此语法隐式强制使用非交互模式

  • 或使用显式强制非交互模式:

    plink.exe -ssh username@example.com -pw password -T
    
    此语法允许您使用标准输入继续输入命令

使用非交互式会话(在正确配置的系统上)可以避免交互式会话的所有问题(不仅仅是
--color
),因此这是一种更通用的解决方案


如果这对您不起作用,那一定是因为您的服务器配置错误,并将
ls
化名为
--color
,即使对于非交互式会话也是如此


如果您无法修复服务器,我建议您同时使用非交互式会话(以避免其他可能的问题)和
--color=never
开关。可能比使用
--color=never
更好的解决方案是使用
unalias ls
(这与编码无关,尽管它可能受到程序检测控制台模式的方式的影响),用于颜色等。在这种情况下,颜色生成可能来自
ls
命令。使用
ls--color=never-l..
。user2864740…工作得很好。谢谢!我如何给你评分?我试图将-T添加到我的代码中,但没有效果。所有这些都是通过C#中的Plink运行的。我将标志UseShellExecute设置为false。`Arguments=string.Format(“-ssh{0}@{1}-pw{2}-T”,用户名,远程主机,密码),RedirectStandardOutput=true,RedirectStandardInput=true,UseShellExecute=false,CreateNoWindow=true};`对我很有用。尽管我不得不用
.WriteLine(…)
调用替换
.Write(…+“\n”)
由于
WriteLine
使用
\r\n
,非交互式*nix会话无法处理。如果这对您不起作用,那一定是因为您的服务器配置错误,并且将
ls
别名为使用
--color
,即使对于非交互式会话也是如此。您是正确的。我追溯了.bashrc,它使用了/etc/bas人权委员会将设立一个内部机构
plink.exe -ssh username@example.com -pw password -T