【发布时间】: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 脚本的相关部分,包括您尝试过的一些事情。这将使人们有更好的机会看到做你想做的事情的正确方法。