使用SSH在c#的Unix服务器上运行自定义脚本

本文关键字:运行 自定义 脚本 服务器 Unix SSH 使用 | 更新日期: 2023-09-27 17:54:45

大家好,我一直在使用一个新的SHH库向unix服务器发送命令,它对我来说工作得很好。它发送正常的命令并接收正确的响应。然而,当我试图使用它来运行自定义脚本(不是shell脚本,而是包含另一个命令并具有参数的文件)时,我似乎遇到了一个问题

我试了好几种方法来让它工作。

在unix服务器本身上,以下命令可以完美地工作并执行它们的预期任务:

  • cd脚本;脚本。someArg - WORKS
  • csh -c "cd script;脚本。i someArg someArg" -也工作
  • /bin/cd/用户脚本;脚本。someArg1 somearg2 - WORKS
  • csh -c "cd/users/bin/script;脚本。i someArg1 somearg2 " - WORKS
  • /用户/bin/脚本/脚本。someArg1 someArg2 - WORKS

然而,在代码中我尝试了以下操作:

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

看起来它与我试图运行自定义脚本的事实有关,或者可能是我忘记的一些愚蠢的设置。如果你需要更多的细节,请告诉我。

EDIT:通过DOES NOT WORK,我的意思是返回到c#的结果应该说一些东西,但结果是空白的。此外,脚本发送TIBCO Rendevous消息,该消息最终将一个条目添加到未显示的DB中。当我说WORKS时,我的意思是条目显示在DB中。

使用SSH在c#的Unix服务器上运行自定义脚本

我明白了。原来该脚本运行的命令是unix服务器通过添加到unix环境变量而知道的。在SSH中使用标准方式发送命令时。NET中,环境变量不会被导入(这就是为什么您可以发送ls、grep、cat等普通命令,但不能发送这个命令)。

修复方法是使用库的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
}

使用ssh客户端登录的用户是否对被调用的可执行文件具有执行权限?

由于每个人都应该执行该脚本,因此参数应该有问题。获取生成的命令字符串,并尝试自己在ssh会话中执行它(使用类似PuTTY的工具)。如果可能的话,向我们提供生成的命令。我猜其中可能有需要适当转义的字符