嘿,我一直在使用new SHH library向Unix服务器发送命令,它对我来说一直很好。它可以正常发送正常命令并接收适当的响应。但是,当我尝试使用它来运行自定义脚本(不是Shell脚本,而是包含另一个命令并带有参数的文件)时,似乎遇到了问题。
香港专业教育学院尝试了几种方法来使它工作。
在unix服务器本身上,以下命令可以完美运行并达到预期目的:
但是,在代码中,我尝试了以下操作:
string command = string.Format("csh -c \"cd script; script.oi {0} {1}\"", arg1, arg2); - DOES NOT WORK
string command = string.Format("cd script; script.oi {0} {1}", arg1, arg2); - DOES NOT WORK
string command = string.Format("cd /users/bin/script; script.oi {0} {1}", arg1, arg2); - DOES NOT WORK
string command = string.Format("csh -c \"cd /users/bin/script; script.oi {0} {1}\"", arg1, arg2); - DOES NOT WORK
string command = string.Format("/users/bin/script/script.oi {0} {1}", arg1, arg2); - DOES NOT WORK
因此对我来说似乎正在发生其他事情。我确实尝试了以下方法:
string command = string.Format("csh -c \"ls\"", arg1, arg2);` - WORKS
string command = string.Format("ls", arg1, arg2);` - WORKS
看来这与我试图运行自定义脚本,或者我忘记了一些愚蠢的设置有关。让我知道您是否需要更多详细信息。
编辑:通过“不起作用”,我的意思是说返回到C#的结果应该说一些东西,但是结果为空。另外,脚本还会发送TIBCO Rendevous消息,最终将消息添加到未显示的DB中。当我说WORKS时,是指该条目显示在数据库中。
最佳答案
好吧,我知道了。事实证明,脚本正在运行通过添加到unix eviroment变量而被unix服务器所知道的命令。当仅使用标准方式在SSH.NET中发送命令时,不会导入环境变量(这就是为什么您能够发送ls,grep,cat,ect等普通命令,但不能发送此命令的原因)。
解决的方法是使用库SSH Shell功能,因为它确实导入了环境变量,因此它知道脚本中的命令是什么并且能够运行它。对于那些使用这个很棒的库的人(仍在积极地开发中,总是一个加号),我在下面提供了示例SSH.NET Shell代码。
PasswordConnectionInfo connectionInfo = new PasswordConnectionInfo("some IP", "user", "pass");
try
{
using (var client = new SshClient(connectionInfo))
{
client.Connect();
var input = new MemoryStream(Encoding.ASCII.GetBytes(command));
var shell = client.CreateShell(input, Console.Out, Console.Out, "xterm", 80, 24, 800, 600, "");
shell.Stopped += delegate(object sender, EventArgs e)
{
Console.WriteLine("\nDisconnected...");
};
shell.Start();
Thread.Sleep(1000);
shell.Stop();
client.Disconnect();
}
}
catch (Exception ex)
{
// Exception stuff
}