使用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中。
我明白了。原来该脚本运行的命令是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的工具)。如果可能的话,向我们提供生成的命令。我猜其中可能有需要适当转义的字符