【问题标题】:Unable to run user script in Unix server from Windows using C# and SSH.NET无法使用 C# 和 SSH.NET 从 Windows 运行 Unix 服务器中的用户脚本
【发布时间】:2015-11-04 20:15:51
【问题描述】:

我有一个在 Unix 服务器(准确地说是 Solaris)上运行的 Perl 脚本。该脚本使用 ftp 实用程序来调节大型机服务器中的文件,然后将它们传输到 Unix 服务器。

最近,我正在尝试使用 Windows 窗体和 C# 开发一个 Windows 桌面应用程序。我正在尝试使用 codeplex 提供的 SSH.NET 库。问题是,每当我从应用程序运行正常的 Unix 命令时,它都可以工作,但是当我尝试运行脚本时,它就不起作用了。我检查了连接并且应用程序正确连接到服务器。我使用了以下两种方法,但没有运气:-

using (ssh client = new SshClient("Ip", "username", "password"))
{
    client.Connect();
    SshCommand cmd = client.RunCommand("script");
    client.Disconnect();
}

using (ssh client = new SshClient("hostnameOrIp", "username", "password")) 
{
    client.Connect();
    SshCommand cmd = client.createCommand("script");
    cmd.execute();
    client.Disconnect();
}

如果有人指出我正确的方向,那将是一个巨大的帮助。

编辑:- 使用完整路径运行脚本已作为调用的非交互式 shell 在加载时不读取 /etc/profile/ env 变量。我也会尝试其他建议的选项,如果可行,我会编辑帖子。

【问题讨论】:

  • 它不起作用:这是什么意思?它不运行?还是运行时失败?尝试运行它时的输出是什么?
  • 没有输出。输出应该是经过一些调整后要从大型机服务器传输到 nix 服务器的相关文件。如果脚本失败,则不会传输文件并且没有其他输出。不过,我可以检查 stderr 并深入了解它。当我有机会时,我会做第一件事。

标签: c# .net ssh ssh.net


【解决方案1】:

您需要调试您的 unix 脚本。修改脚本以通过管道将 stderr 传输到文本文件,然后查看它的内容。例如,脚本可能依赖于使用 ssh.net 运行时会发生变化的环境属性

【讨论】:

  • 谢谢。我去做。如果是这样,解决方法是什么?
  • 这取决于脚本。我建议您发布一个新问题,其中包含有关脚本如何在 ssh 下失败的详细信息
  • 很公平。但我真正想问的是,是否有任何固有属性或方法来运行使用来自 c# 或更确切地说是通过 ssh .net lib 的环境变量的用户脚本?
  • 我认为最简单的方法是通过 ssh 命令调用你的 shell。尝试将client.createCommand("script"); 替换为类似于client.createCommand("bash -l -c 'script'"); 的内容,这应该会为您提供所有常用的环境变量
  • 谢谢。我会尝试一下,让您知道它是否已解决或确切的问题是什么。
【解决方案2】:

你的问题很模糊。

但首先,我会尝试为脚本添加路径。绝对 (/home/user/script) 或相对 (./script)。

*nix shell 默认不在当前工作目录(本例中的主目录)中查找可执行文件。只有在您的 PATH 中有 . 时,他们才会找到它们。

请注意,RunCommand 使用非交互式会话。它可能具有与您在 SSH 终端中使用的交互式会话不同的环境 (PATH)。交互式和非交互式会话使用不同的启动脚本集。

【讨论】:

  • 脚本在我的垃圾箱里。它可以从我在 nix 服务器中的任何路径访问。因此,理想情况下,当我使用我的凭据连接到服务器时,我应该能够运行该脚本。我在这里错过了什么吗?
  • 您真的尝试过完整路径吗? RunCommand 使用非交互式会话。它可能具有与您在 SSH 终端中使用的交互式会话不同的环境 (PATH)。
  • @KChow 我遇到了完全相同的问题,您能否举例说明您在非交互模式下执行脚本时所做的工作……例如我的路径传递看起来像下面/home/guest/src/test.sh我会问我办公室的unix管理员完整路径是什么添加./查找工作负载环境变量..
  • 您可以在 ssh 命令中执行 ./bash_profile,然后执行实际命令,例如 ssh cmd=client.RunCommand("./bash_profile;/fullPath_from_your_home_directory_or_relative_path_from_the_landing_path_of_your_sshConnection/test.sh");这应该适合你。如果它不起作用,请详细说明您的实际问题以及您要实现的目标。
【解决方案3】:

请确保用户的默认路径正确且路径中存在脚本。为了调试最后一个命令/脚本运行/退出状态,您可以通过 C# ssh 客户端再次运行 shell 命令 echo $? 以获取有关错误的详细信息。这可能会对错误有所了解

【讨论】:

  • 我这样做了,退出状态不为零。脚本失败。我还没有机会检查标准错误。我希望这能给我一些线索。
  • 通过退出代码我们可以得到错误类型的线索。
猜你喜欢
  • 2020-03-31
  • 2011-08-17
  • 1970-01-01
  • 2015-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
相关资源
最近更新 更多