【问题标题】:Not able to run an executable inside a Perl script through SSH .Net无法通过 SSH .Net 在 Perl 脚本中运行可执行文件
【发布时间】:2016-04-10 18:56:12
【问题描述】:

我正在使用 Windows 窗体在 C# 中制作桌面应用程序。应用程序连接到 Unix 服务器(每个用户都有单独的登录凭据和单独的环境变量和 .bash_profile)并运行脚本并将输出发送回 Windows 表单。

我正在通过 ssh .net 在 Unix 中运行 Perl 脚本。说abc.pl。这工作正常,但在脚本中我调用了另一个可执行文件(cpp 可执行文件)。

在我的 C# 代码中,我已经给出了脚本的完整路径,因此它可以运行。在脚本中给出了可执行文件的整个路径,因此它也运行。但是可执行文件失败了,因为它没有得到相应的所需 .so 文件。

.so 文件存在于库中,并且库的路径设置为 .bash_profile。

我知道,当我使用 ssh .net 时,我实际上使用的是非交互式 ssh 会话,因此我无法访问环境变量或 .profile,但我尝试了很多方法,比如将 ~/.bash_profile 放入我的Perl 脚本,希望在 ssh 会话和许多其他事情中调用和设置配置文件,但无济于事。

谁能告诉我一个解决方法或如何在 Windows 平台上使用 ssh .net 在 Perl 脚本中运行 cpp exec

编辑:- 导入环境变量或更确切地说是设置环境变量是唯一的出路,但如何去做才是真正的挑战。我选择在脚本执行期间为库设置环境变量路径。这样,SSH 会话在运行脚本时将具有在 perl 脚本中为会话设置的库的路径,因此可执行文件将顺利运行。我使用的代码是:- $ENV{'LD_LIBRARY_PATH'}="$ENV{LD_LIBRARY_PATH}:/path/to/library";

EDIT2:- 如果您想使用交互式 shell 的 .profile 中存在的所有环境变量,那么您也可以为非交互式 ssh 会话运行整个 .profile ,然后您就不会拥有担心在 perl 脚本中设置环境变量。例如,您可以像这样构建您的命令:- command = "..bash_profile; 实际命令"; var cmd = ssh.RunCommand( 命令 ); var 结果 = cmd.Execute(); .profile 将在您的新非交互式 shell 中运行,并在 ssh 连接的整个期间设置环境变量。

【问题讨论】:

  • 您可以在 Perl 代码中添加到 PATH 环境变量。您可以硬编码库的路径或解析.bash_profile 以检查值应该是什么。或者,您的 Perl 程序可能还有另一种方法可以发现 PATH 的正确设置
  • "我已经尝试了很多事情......" 您应该编辑您的问题以包含您的 perl 脚本的相关部分,包括您尝试过的一些事情。这将使人们有更好的机会看到做你想做的事情的正确方法。

标签: c# winforms perl unix ssh


【解决方案1】:

如果错误与找不到 *.so 文件有关,则很可能需要设置 LD_LIBRARY_PATH 变量。您可以在执行 perl 脚本之前执行此操作。比如:

export LD_LIBRARY_PATH=/path/to/libs;/home/user/bin/myperlscript.pl

或者只是编写一个 shell 脚本包装器,在其中显式设置环境变量,然后调用 perl 脚本。现在,通常这不是必需的,您的管理员可能能够设置正确的链接,但这应该可以解决根本问题。

另一个取决于如何调用 cpp 的选项是通过设置 $ENV 变量直接在你的 perl 脚本中设置它。像这样的

$ENV{LD_LIBARY_PATH} = "/path/to/libs";

如果您正在使用 perl 系统方法进行调用,这应该可以工作。

【讨论】:

  • 我之前尝试过您提供的相同解决方案,但它不起作用。在我看到你的评论后,点击了一些东西,我明白了我在哪里。我已经编辑了我的帖子以包含对我有用的内容。结果我接受了这个答案。
【解决方案2】:

选项 1:- 导入环境变量或者设置环境变量是唯一的出路,但如何去做才是真正的挑战。我选择在脚本执行期间为库设置环境变量路径。这样,SSH 会话在运行脚本时将具有在 perl 脚本中为会话设置的库的路径,因此可执行文件将顺利运行。我使用的代码是:- $ENV{'LD_LIBRARY_PATH'}="$ENV{LD_LIBRARY_PATH}:/path/to/library";

选项 2:- 如果您想使用交互式 shell 的 .profile 中存在的所有环境变量,那么您也可以为非交互式 ssh 会话运行整个 .profile ,然后您就不会不得不担心在你的 perl 脚本中设置环境变量。例如,您可以像这样构建您的命令:-

command = ". .bash_profile; actual command"; 
var cmd = ssh.RunCommand( command ); 
var result = cmd.Execute(); 

.profile 将在您的新非交互式 shell 中运行,并在 ssh 连接的整个期间设置环境变量。

虽然我在编辑中也提到了同样的事情。但为了方便起见,我将其发布为答案,因为我自己尝试并测试了上述两种方法。

【讨论】:

    猜你喜欢
    • 2019-12-01
    • 1970-01-01
    • 2014-12-16
    • 2011-07-03
    • 2020-01-06
    • 1970-01-01
    • 2011-08-05
    • 2016-08-16
    • 2021-06-18
    相关资源
    最近更新 更多