嘿,我一直在使用new SHH library向Unix服务器发送命令,它对我来说一直很好。它可以正常发送正常命令并接收适当的响应。但是,当我尝试使用它来运行自定义脚本(不是Shell脚本,而是包含另一个命令并带有参数的文件)时,似乎遇到了问题。

香港专业教育学院尝试了几种方法来使它工作。

在unix服务器本身上,以下命令可以完美运行并达到预期目的:

  • cd脚本; script.oi someArg someArg-工作
  • csh -c“cd脚本; script.oi someArg someArg”-还需要工作
  • cd / users / bin / script; script.oi someArg1 someArg 2-工作
  • csh -c“cd / users / bin / script; script.oi someArg1 someArg 2”-工作
  • /users/bin/script/script.oi someArg1 someArg2-工作

  • 但是,在代码中,我尝试了以下操作:
    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
    }
    

    10-04 16:19