无法通过SSH.Net在Perl脚本中运行可执行文件

本文关键字:脚本 Perl 运行 可执行文件 Net SSH | 更新日期: 2023-09-27 18:29:23

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

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

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

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

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

有人能告诉我一个变通方法吗?或者如何在Windows平台中使用ssh.net在Perl脚本中运行cpp-exec吗

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

第2版:-如果你想使用交互式shell的.profile中的所有环境变量,那么你也可以为非交互式ssh会话运行整个.profile,这样你就不必担心在perl脚本中设置环境变量了。例如,您可以像这样构建命令:-command="..bash_profile;实际命令";var cmd=ssh。RunCommand(命令);var result=cmd。执行();.profile将在新的非交互式shell中运行,并为ssh连接的整个持续时间设置环境变量。

无法通过SSH.Net在Perl脚本中运行可执行文件

如果错误与找不到*.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系统方法进行调用,这应该会起作用。

选项1:-导入环境变量或更确切地说设置环境变量是唯一的出路,但如何实现这一点是真正的挑战。我选择在脚本期间为库设置环境变量路径。通过这种方式,SSH会话在运行脚本时,将在session的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连接的整个持续时间设置环境变量。

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