Plink 通过 C# 返回不需要的字符
Plink returning unwanted characters via C#
通过 C# 使用 Plink 时,我在结果前后收到不需要的字符:
命令:
ls -l */informatica/tgtdynamicparams*.out | grep vaulttest| grep 'Sep 1'|awk '{print }' | 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# 通过 Plink 结果:
[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 }'
| 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()
。我什至花时间试图删除我不想要的字符,但似乎有比我可以编码的更多的可能性。
谢谢用户 2864740!
我添加了 --color=never 然后那些该死的字符消失了。
private const string GetFileNames = "ls --color=never -l */informatica/tgtdynamicparams*.out " +
"| grep vaulttest " +
"| grep 'Sep 1' " +
"| awk '{print }' " +
"| sort";
虽然使用 --color=never
可能有所帮助,但根本问题在于,您 运行 Plink(使用标准输入输入命令)的方式使它使用了交互式会话。现在的大多数系统都配置为对目录列表(和其他内容)使用一种奇特的格式,以使交互式会话更加人性化。
虽然在您的情况下,没有人参与,因此您应该使用非交互式会话。
有两种方法可以做到这一点:
要么在 Plink 命令行上提供命令(而不是使用标准输入来提供命令),例如:
plink.exe -ssh username@example.com -pw password "ls -l ... | grep ... | sort"
此语法隐式强制非交互模式。
或使用-T
switch明确强制非交互模式:
plink.exe -ssh username@example.com -pw password -T
此语法允许您使用标准输入继续输入命令。
使用非交互式会话(在正确配置的系统上)可以避免交互式会话的所有麻烦(不仅仅是 --color
)。所以这是一种更通用的解决方案。
如果这对您不起作用,那一定是因为您的服务器配置错误并且给 ls
添加了别名以使用 --color
即使是非交互式会话。
如果您无法修复服务器,我建议您同时使用非交互式会话(以避免其他可能的麻烦)和 --color=never
开关。可能比使用 --color=never
更好的解决方案是使用 unalias ls
.
通过 C# 使用 Plink 时,我在结果前后收到不需要的字符:
命令:
ls -l */informatica/tgtdynamicparams*.out | grep vaulttest| grep 'Sep 1'|awk '{print }' | 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# 通过 Plink 结果:
[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 }'
| 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()
。我什至花时间试图删除我不想要的字符,但似乎有比我可以编码的更多的可能性。
谢谢用户 2864740! 我添加了 --color=never 然后那些该死的字符消失了。
private const string GetFileNames = "ls --color=never -l */informatica/tgtdynamicparams*.out " +
"| grep vaulttest " +
"| grep 'Sep 1' " +
"| awk '{print }' " +
"| sort";
虽然使用 --color=never
可能有所帮助,但根本问题在于,您 运行 Plink(使用标准输入输入命令)的方式使它使用了交互式会话。现在的大多数系统都配置为对目录列表(和其他内容)使用一种奇特的格式,以使交互式会话更加人性化。
虽然在您的情况下,没有人参与,因此您应该使用非交互式会话。
有两种方法可以做到这一点:
要么在 Plink 命令行上提供命令(而不是使用标准输入来提供命令),例如:
plink.exe -ssh username@example.com -pw password "ls -l ... | grep ... | sort"
此语法隐式强制非交互模式。
或使用
-T
switch明确强制非交互模式:plink.exe -ssh username@example.com -pw password -T
此语法允许您使用标准输入继续输入命令。
使用非交互式会话(在正确配置的系统上)可以避免交互式会话的所有麻烦(不仅仅是 --color
)。所以这是一种更通用的解决方案。
如果这对您不起作用,那一定是因为您的服务器配置错误并且给 ls
添加了别名以使用 --color
即使是非交互式会话。
如果您无法修复服务器,我建议您同时使用非交互式会话(以避免其他可能的麻烦)和 --color=never
开关。可能比使用 --color=never
更好的解决方案是使用 unalias ls
.