最近我一直试图从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笔记本之间导入和导出数据。
答案 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)
这很好/有趣。