Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java clj ssh/JSch无法加载库';c';在窗户上_Java_Ssh_Clojure_Jna_Jsch - Fatal编程技术网

Java clj ssh/JSch无法加载库';c';在窗户上

Java clj ssh/JSch无法加载库';c';在窗户上,java,ssh,clojure,jna,jsch,Java,Ssh,Clojure,Jna,Jsch,我已经将CLJSH作为依赖项添加到Leiningen项目中,我可以(使用'cljsh.ssh),但是调用(ssh代理{})会出现错误 UnsatisfiedLinkError Unable to load library 'c': The specified module cannot be found. at com.sun.jna.NativeLibrary.loadNativeLibrary ... at org.jcraft.jsch.agentproxy.usocket.JNAUSoc

我已经将CLJSH作为依赖项添加到Leiningen项目中,我可以
(使用'cljsh.ssh)
,但是调用
(ssh代理{})
会出现错误

UnsatisfiedLinkError Unable to load library 'c': The specified module cannot be found.
at com.sun.jna.NativeLibrary.loadNativeLibrary
...
at org.jcraft.jsch.agentproxy.usocket.JNAUSocketFactory$CLibrary.(clinit)
...

有人知道这是为什么吗?我认为这可能与Windows没有附带C标准库有关,在这种情况下,是否可以安装例如cygwin帮助?

尝试安装cygwin,并添加如下内容:

-Djava.library.path=...path to lib dir ...
如果它自己找不到图书馆

我是的作者,它已在cljsh中使用

我认为它对cygwin的ssh代理不起作用,因为JNA不提供 它的本地库。试试Putty的选美怎么样?如果需要在cygwin环境中使用cygwin的ssh代理和“nc”命令出口,那么使用如何?我对CLJSH不太熟悉,但据介绍,可以使用NCUSocketFactroy而不是JNAUSocketFactory

更新: 我已经确认我可以使用成功运行clj ssh 通过应用以下提交,在我的Cygwin环境上安装ssh代理


好的,在对源代码进行一些挖掘之后,似乎clj ssh在默认情况下尝试使用系统ssh代理(如果它与windows不兼容,这似乎是一种奇怪的行为)。这使得
cljsh.cli
无法使用,但是
cljsh.ssh
可以修复

(ssh-agent {:use-system-ssh-agent false})

如果您确实想使用系统ssh代理,下面的clj ssh和ymnk自述文件提到PuTTY的选美,我找不到任何关于设置此代理的信息,但它应该可以通过cygwin实现。

如果设置了
ssh\u AUTH\u SOCK
环境变量,我已经看到了这一点。在启动jvm之前清除此环境变量可能会解决此问题

当未设置
SSH\u AUTH\u SOCK
时,如果正在运行,clj SSH应自动使用pageant


看起来最好的解决方案是根据ymnk的提交支持NCUSocketFactory,并添加关于cygwin的ssh代理的文档。很高兴接受这个请求。

libc
在windows上被称为
msvcrt
(或多或少)。但是,我建议检查您的
cljsh
文档,看看它们是否支持windows。有时,你可以用
msvcrt
替换
c
,但windows上的套接字与其他平台上的行为不同,因此除了简单的库替换之外,你还需要做一些工作。你可以插入
cygwin1.dll
(或任何它的名称)来代替
libc
加载,因为cygwin在windows上提供了API兼容性。为了避免需要更改Java代码,您可以尝试创建一个名为
c.dll
cygwin1.dll
副本,并将其放在
路径中的某个位置,以便JNA可以找到它。基本上,您可以将cygwin dll表示为
libc
。我曾尝试将JNA与cywgin一起使用,但我找不到如何做到这一点。如果可能的话,这对我来说是个好消息。好吧,可能离可行还有很长的路要走。这可能与制作名为
c.dll
cygwin1.dll
的副本一样简单,但可能要复杂得多。感谢这个答案,我没有意识到clj ssh正在寻找一个外部ssh代理,因此这促使我找出修复方法。顺便说一句,自述还顺便提到了选美比赛,但我找不到任何关于设置的信息。