无法通过SSH .Net

时间:2016-01-06 15:54:18

标签: c# winforms perl unix ssh

我正在使用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会话在运行脚本时将具有在selsion的perl脚本中设置的库的路径,因此可执行文件将顺利运行。我使用的代码是: -     $ ENV { 'LD_LIBRARY_PATH'} = “$ ENV {LD_LIBRARY_PATH}:/路径/到/库”;

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

2 个答案:

答案 0 :(得分:0)

如果错误与未找到* .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 :(得分:0)

选项1: - 导入环境变量或者更确切地说设置环境变量是唯一的出路,但如何解决这个问题才是真正的挑战。我选择在脚本的持续时间内为库设置环境变量路径。通过这种方式,SSH会话在运行脚本时将具有在selsion的perl脚本中设置的库的路径,因此可执行文件将顺利运行。我使用的代码是: - $ ENV {' LD_LIBRARY_PATH'} =" $ ENV {LD_LIBRARY_PATH}:/ path / to / library&#34 ;;

选项2: - 如果您想要使用交互式shell的.profile中存在的所有环境变量,那么您也可以为非交互式ssh会话运行整个.profile,然后您就不会#39 ; t必须担心在perl脚本中设置环境变量。例如,您可以将命令框架​​化为: -

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

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

虽然我在编辑中也提到过同样的东西。但是为了方便所有我发布它作为答案,因为我自己尝试并测试了上述两种方法。