在Mathematica中运行ssh命令

时间:2014-10-21 08:43:11

标签: linux ssh wolfram-mathematica

最近我一直试图从Mathematica笔记本上运行shell ssh命令。我尝试了几种建议的方法,没有积极的结果。我对答案的搜索引导我得到以下结果:

RunProcess[$SystemShell, All, " ssh <login>@<server> exit "]

但这会产生以下错误

<|"ExitCode" -> 127, "StandardOutput" -> "", "StandardError" -> "ssh: /usr/local/Wolfram/Mathematica/10.0/SystemFiles/Libraries/\ Linux-x86-64/libcrypto.so.1.0.0: no version information available \ (required by ssh) ssh: /usr/local/Wolfram/Mathematica/10.0/SystemFiles/Libraries/\ Linux-x86-64/libcrypto.so.1.0.0: no version information available \ (required by ssh) ssh: relocation error: ssh: symbol EVP_aes_128_ctr, version \ OPENSSL_1.0.1 not defined in file libcrypto.so.1.0.0 with link time \ reference "|>

你知道如何解决它吗?

P.S。我的总体目标是在外部服务器和Mathematica笔记本之间导入和导出数据。

3 个答案:

答案 0 :(得分:2)

我发现Mathematica强制库依赖。如果我在终端中使用ldd / usr / bin / ssh命令,我将得到以下输出:

linux-vdso.so.1 => (0x00007fffb31fe000) libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f2a309a7000) libcrypto.so.1.0.0 => /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007f2a305cd000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f2a303c8000) libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f2a301af000) libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f2a2ff94000) libgssapi_krb5.so.2 => /usr/lib/x86_64-linux-gnu/libgssapi_krb5.so.2 (0x00007f2a2fd4d000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2a2f987000) libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f2a2f749000) /lib64/ld-linux-x86-64.so.2 (0x00007f2a30e87000) libkrb5.so.3 => /usr/lib/x86_64-linux-gnu/libkrb5.so.3 (0x00007f2a2f47d000) libk5crypto.so.3 => /usr/lib/x86_64-linux-gnu/libk5crypto.so.3 (0x00007f2a2f24e000) libcom_err.so.2 => /lib/x86_64-linux-gnu/libcom_err.so.2 (0x00007f2a2f04a000) libkrb5support.so.0 => /usr/lib/x86_64-linux-gnu/libkrb5support.so.0 (0x00007f2a2ee3e000) libkeyutils.so.1 => /lib/x86_64-linux-gnu/libkeyutils.so.1 (0x00007f2a2ec3a000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f2a2ea1b000)

但在Mathematica中做同样的事情:

RunProcess[$SystemShell, All, " ldd /usr/bin/ssh exit "]

给出了不同的依赖:

libcrypto.so.1.0.0 => /usr/local/Wolfram/Mathematica/10.0/SystemFiles/Libraries/Linux-x86-64/libcrypto.so.1.0.0 (0x00007f30fbe3c000) libz.so.1 => /usr/local/Wolfram/Mathematica/10.0/SystemFiles/Libraries/Linux-x86-64/libz.so.1 (0x00007f30fba20000)

我的解决方案是将文件/usr/local/Wolfram/Mathematica/10.0/SystemFiles/Libraries/Linux-x86-64/libcrypto.so.1.0.0替换为/lib/x86_64-linux-gnu/libcrypto.so.1.0

这可能不是最好的方式,但有效。

答案 1 :(得分:0)

ŁukaszGładczuk建议应该有效,但有更好的方法来实现这一目标。

RunProcess提供了一个ProcessEnvironment选项,允许您为进程设置环境变量。默认值为Inherited,这意味着环境变量继承自Wolfram语言,这是导致库问题的原因。

在终端中运行echo $PATH以查找路径,然后使用:

RunProcess[{"ssh", "user@server"}, ProcessEnvironment -> <|"PATH" -> yourpath|>]

其中yourpath是您的路径,作为字符串。

答案 2 :(得分:0)

一个有趣的例子/可能的解决方案。当我尝试从MMa(11.3,Ubuntu 17)运行ffmpeg

In[16]:= RunProcess["ffmpeg"]
Out[16]= <|ExitCode->1,StandardOutput->,StandardError->/usr/bin/ffmpeg: /usr/local/Wolfram/Mathematica/11.3/SystemFiles/Libraries/Linux-x86-64/libz.so.1: version `ZLIB_1.2.9' not found (required by /usr/lib/x86_64-linux-gnu/libpng16.so.16)|>

它试图使用Mathematica路径中的libz.so(如上面的@Łukasz所观察到的)。只需使用 ProcessEnvironment即可运行?!

In[17]:= RunProcess["ffmpeg",ProcessEnvironment-><||>]
Out[17]= <|ExitCode -> 1, StandardOutput -> , StandardError ->
 ffmpeg version 3.3.4-2 Copyright (c) 2000-2017 the FFmpeg developers                                                          built with gcc 7 (Ubuntu 7.2.0-8ubuntu2)

这很好/有趣。