编者按:此文件被选为MATLAB Central本周精选
一个新的Matlab接口,用于使用Ganymed-SS2 Java库。重命名命令是改进现有的Matlab/SSH2代码库的限制(见灵感提交)使用一个简单的命令列表。
如果您需要从Matlab会话访问远程机器(用于近实时数据传输等),这组函数允许您发送命令并获取返回值。包括SFTP和SCP文件传输功能。金宝app支持公钥认证和改进的多命令支持。
这需要开源的用于Java的Ganymed SSH-2,它可以免费获得并自动包含在zip文件中。对于SFTP-GET,必须使用包含的自定义Ganymed SSH-2 Java库,该库与Matlab兼容。
看到ssh2-examples。M代表文档。
如需支持金宝app,请直接联系作者,而不是先张贴到“评论和评分”。有帮助的信息或评论可以在沟通后发布,以确保对其他人有用的信息,而不是在评论中膨胀的SSH/SFTP/SCP连接失败的信息。
#1连接的问题是Matlab机器上的软件防火墙阻止Java进行连接。如果你能连接到同一台机器,请检查一下。
#2问题是ssh-serve金宝appr上支持身份验证。更多信息请参见Ganymed-SSH2 faq。http://www.ganymed.ethz.ch/ssh2/FAQ.html
此外,我很想在评论区听到你如何以及在哪里使用这篇文章。
大卫·弗里德曼(2021)。SSH/SFTP/SCP For Matlab (v2)(//www.tatmou.com/matlabcentral/fileexchange/35409-ssh-sftp-scp-for-matlab-v2), MATLAB中央文件交换。检索.
我认为在ssh2.m的第61行有一个拼写错误。我觉得应该是"nargin"而不是"nargout"。从已编译应用程序中删除对象时的一些奇怪行为中发现的。
可爱的代码。我花了很长时间让它工作,我想我可以分享我的问题,以帮助其他人,如果他们正在尝试使用它。”!”
我得到的错误“错误:SSH2无法连接到SSH2主机-“
我发现David的代码使用了一个try catch,它对Java稍微隐藏了错误消息。(ssh2_main的第58行)。
如果您重新抛出最后一个错误,您将获得更多信息。对我来说,我被告知客户的密钥交换提议有问题(“无法协商,提议不匹配”)。
Ganymed库提供了diffie-hellman-group-exchange-sha1、diffie-hellman-group14-sha1、diffie-hellman-group1-sha1密钥交换算法。我的服务器不接受这些,所以我必须将其中一个添加到sshd_config文件中。我特别在我的列表末尾添加了一个:“KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group14-sha256,diffie-hellman-group-exchange-sha1”
我希望这能帮助到一些人!
非常感谢您分享这些精彩的代码。我真的很感激。
太棒了!轻松连接到树莓派!
工作得很好!我一直在用它来提交在大学集群上运行的模拟,它完全符合我的需要。非常感谢你,大卫!我唯一的建议是将SCP功能添加到整个文件夹中(除非这个功能已经存在,而我错过了它)。我可以通过创建递归函数来单独提交每个文件来实现这一点。还有,有没有办法强制抑制反应?我的意思是停止显示到MATLAB控制台的响应,但仍然存在于command_result?
我试图连接到我的服务器,但是我得到这个错误:
使用ssh2_main时出错(第86行)
错误:SSH2无法连接到SSH2主机- "173.000.0.00"!
ssh2错误(第84行)
Ssh2_struct = ssh2_main(Ssh2_struct);
ssh2_command中的错误(第31行)
Ssh2_struct = ssh2(Ssh2_struct);
ssh2_simple_command中的错误(第38行)
Ssh2_struct = ssh2_command(Ssh2_struct, command, enableprint);
我错过了什么?ssh连接在matlab中工作良好…
是否有一种方法可以输出远程目录中的所有文件名?我不想下载所有文件,但我并不总是知道文件的确切名称。
哦,我的错。我不知道如何编辑或删除评论(如果我可以的话)。
修复应该是这样的:
function [str] = ssh2_localPathString(fileStr,pathStr)
确定路径是否已经是绝对路径
pathOnly = fileparts(fileStr);
if ~isempty(pathOnly)&& exist(pathOnly,'dir')
str = fileStr;
其他的
str = fullfile(pathStr,fileStr);
结束
返回;
我收到过很多这样的问题,直到最近都没有整理出来。为了将其编译成一个独立的应用程序,我将jar文件添加到源文件夹(并将其添加到编译列表中)并进行编辑
$ MATLABROOT /工具箱/地方/ classpath.txt
包含.jar文件的副本。这对我很管用!
更多信息请参见此链接
https://stackoverflow.com/questions/9220675/matlab-compiler-mcc-errors-on-imports-for-java-classes-from-dynamic-java-classpa
我注意到,当将文件上载到路径包含字符串的服务器时,SCP_Put函数将失败。我必须通过一个空格转义远程文件夹,即。
Newremotefolder = strrep(remote_base_folder,' ','\ ');
嗨,首先谢谢你带我去图书馆。当命令编写正确时,它可以正常工作。但是,您无法从主机获得错误打印输出,这使得在命令不返回任何内容的情况下,很难理解命令是否正常工作。有人找到解决办法了吗?
你好。首先感谢你有这么好的图书馆!我正在尝试做X11转发,可以吗?
伟大的工作!
我发送了一封电子邮件,但我在这里写,看看是否有人可以帮助我更快:我有“ls”与ssh一起工作,但我试图通过ssh启动一个ros节点,但没有成功。有人有什么建议吗?
大卫,谢谢你分享这个非常有用的工具箱。您是否开发了重命名和删除的等价物?
提前谢谢你
代码可以工作,但是你听说过类/对象吗?一半的代码是检查结构体是否有字段——这就是类为你做的事情。
谢谢你分享这么棒的代码。
我想提个建议。
我编写了以下代码来指定端口:
Ssh2_conn = ssh2_config('sftp.thishost.com','用户名','密码','1234');
但是,这段代码产生了一个错误。后来我发现我必须以整数而不是文本的形式输入端口(如下所示)。
Ssh2_conn = ssh2_config('sftp.thishost.com','用户名','密码',1234);
请在ssh2_examples中添加一个示例。M表示以整数形式输入端口。
谢谢。
谢谢你分享这么棒的代码。
我想提个建议。
我编写了以下代码来指定端口:
Ssh2_conn = ssh2_config('sftp.thishost.com','用户名','密码','1234');
但是,这段代码产生了一个错误。后来我发现我必须以整数而不是文本的形式输入端口(如下所示)。
Ssh2_conn = ssh2_config('sftp.thishost.com','用户名','密码',1234);
请在ssh2_examples中添加一个示例。M表示以整数形式输入端口。
谢谢。
更新:
“监视器”问题解决了。由于shell环境不同,采用绝对路径解决。在命令后使用2>&1查看stderr输出。
而作为'cd ..' problem, 'cd ..&& ls -l'输出预期结果。现在还是毫无头绪。
你好大卫,
谢谢你的代码。但是,我在使用时遇到了一些问题。
我已经成功地建立了连接,并执行了一些命令,而某些命令未能发挥作用。输出如下:
>> ssh2_conn = ssh2_command(ssh2_conn,'pwd',1);
/根
>> ssh2_conn = ssh2_command(ssh2_conn,' CD ..',1);
>> ssh2_conn = ssh2_command(ssh2_conn,'pwd',1);
/根
(cd ..'更改目录失败)
两者都不能“监视”命令工作(我使用ssh与FPGA通信)
此外,错误信息似乎不会被存储或打印。
你对这个问题有什么想法?非常感谢。
公钥认证(ssh2_config_publickey)注意:由Putty或MobaXterm生成的ssh2密钥(RSA或DSA)必须转换为openssh格式,以供ganimed ssh2库识别。
谢谢塞巴斯蒂安,我会尝试你的解决方案。
@Vlad:我刚看到你的评论。实际上,首先我通过为我想使用的用户设置一个空密码来解决这个问题。然后,我上一篇文章中的代码片段实际上起作用了。但这不是一个真正的解决方案,因为它可能不可能每次都设置用户密码,即使它是空的。
为了登录到一个根本没有设置密码的用户,我修改了文件ssh2_main。在“%% AUTHENTICAE(密码或私钥)”部分,脚本尝试Java库中可用的不同身份验证方法。尝试的最后一种方法是使用“ssh2_struct.connection”使用用户名和密码进行身份验证。authenticateWithPassword Java方法。我用Java方法“ssh2_struct.connection”替换了这个方法。authenticateWithNone”,这对我很有用。
下面是对应的“username + password”(注释掉)和“username”的代码片段:
% ssh2_struct。authenticated = ssh2_struct.connection.authenticateWithPassword(…
% ssh2_struct.username ssh2_struct.password)
ssh2_struct。authenticated = ssh2_struct.connection.authenticateWithNone(…
ssh2_struct.username);
我希望这对你有所帮助。
欢呼,
塞巴斯蒂安。
我也有同样的问题。尝试连接到一个无密码的根用户在一个板上,并尝试什么塞巴斯蒂安费舍尔说(ssh2_config(主机名,用户名,“”)),但它仍然不工作。使用其他有密码的用户也可以。有什么想法吗?
我一直在找这样的东西,谢谢!
感谢大卫的巨大贡献,也感谢他对我的信息的快速回应。
我遇到了与M. Ertem相同的问题,即登录到一个没有密码集的帐户。其实非常非常简单。我只是想在这里发布解决方案,如果其他人有同样的问题,他们也可以从中受益:
ssh2_conn = ssh2_config(HOSTNAME, USERNAME, "")
谢谢你,大卫!(既用于编写代码,也用于今早的快速帮助……)
注意:(至少在BeagleBone上)ssh2_simple_command不适合我使用空密码
我用了一个有密码的账户,它像魔法一样有效……(我所需要做的就是签发一个
'touch goTrigger'从Matlab内部到shell,在BeagleBone上启动我的数据acq例程。
我在'get=1'模式下使用scp_get(), scp_simple_get()或scp()时遇到了问题。Matlab就挂了,我必须手动终止它。该问题出现在单个或多个文件中。
Scp_put工作得很完美。
克里斯托弗·艾里希,请直接联系我寻求帮助。请不要在评论和评分中发布您的连接问题。
嘿,大卫,
我已经连接成功,但是我不能执行任何命令。我收到这个简单的“ls”查询:
使用ssh2_main时出错(第320行)
出现Java异常:
ioexception:执行请求失败。
ch.ethz.ssh2.channel.ChannelManager.requestExecCommand (ChannelManager.java: 707)
ch.ethz.ssh2.Session.execCommand (Session.java: 248)
原因:java.io.IOException:服务器拒绝请求。
ch.ethz.ssh2.channel.ChannelManager.waitForChannelSuccessOrFailure (ChannelManager.java: 191)
ch.ethz.ssh2.channel.ChannelManager.requestExecCommand (ChannelManager.java: 703)
...1
ssh2错误(第84行)
Ssh2_struct = ssh2_main(Ssh2_struct);
ssh2_command中的错误(第31行)
Ssh2_struct = ssh2(Ssh2_struct);
************************中的错误(第3行)
Ssh2_command (test, 'ls -l');
嗨,Massimo,你可以使用这个工具来构建你所说的功能。但是您需要开发关于要替换哪些文件的逻辑。我建议使用SSH获取文件列表及其日期,处理该列表以确定使用SFTP或SCP上传哪些文件。TL: DR:这是可能的,但你必须做大部分繁重的工作。
你好大卫,
非常感谢您提供这样一套文件。我试图使用它,并取代需要使用一些linux脚本来执行从本地服务器到远程服务器的文件传输。我想传输文件,并可能更新存储在目标文件夹中的文件,检查目的地是否更新。这能做到吗?我尝试使用matlab文件“ssh2_command”实现cp或rsync调用。但是运气不好。
如果你能帮助我,请告诉我。最好,马西莫。
Mathworks应该在他们的下一个版本中加入这一点!!
伟大的图书馆。为了支持安装在当前文件夹金宝app之外的Java库,需要编辑文件ssh2_setupm。
ssh2_setup中的第114-121行。M需要修改如下
if (USE_CUSTOM_GANYMED_LIB > 0)
如果存在(“ganymed-ssh2-m1”、“dir”)
Ganymed_java_library = fileparts(which(' ganymed_ssh2 -m1.jar'));
其他的
Ganymed_java_library = ' ganymed_ssh2 -m1';%包括自定义ganymed库
结束
Ganymed_java_library_zip = [ganymed_java_library '.zip'];
Ganymed_java_library_http = ";
其他的
选择CLEONDRIS或者google代码,不要两个都选
%来自cleondris
如果存在(“ganymed-ssh2-build250”、“dir”)
Ganymed_java_library = fileparts(which(' ganymed_ssh2 -build250'));
其他的
Ganymed_java_library = ' ganymed_ssh2 -build250';%包括自定义ganymed库
结束
伟大的提交。大卫也非常乐于助人!
这是一个很棒的包,允许SFTP与Matlab通信。
一开始,我在使用sftp_get函数时遇到了麻烦,但在David的及时反馈后,我设法做到了。
在我的例子中,为了让它工作,我需要改变ssh2_setupm上的107行:
Use_custom_ganymed_lib = 0;
来
Use_custom_ganymed_lib = 1;
并重新启动Matlab。
谢谢你,马里奥。
这就跟你问声好!这是一个非常有用的图书馆。
然而,当我在Mac上使用库并尝试在matlab中做uigetdir时,ssh库被加载,我得到一个有趣的java异常。还有其他人有这个问题吗?有解决办法吗?谢谢你,马丁
这太棒了!节省了很多时间!
但是,我想知道是否有一种方法可以只下载FTP数据的片段。换句话说,假设FTP上的文件每天都在更新。我如何下载更新,并将其附加到我的电脑上的文件,而不是下载所有过去的数据,和最近的数据在一个文件?
David,有没有一种方法可以给ssh2_command添加一个超时,在主机上的进程挂起的情况下释放会话?
最好,谢谢你的出色工作!
请,请,请不要把错误贴在评论区。
大卫,我已经正确下载了所有文件,想通过sftp发送一个文件。
这些行执行正确
ssh2_conn = ssh2_config(HOSTNAME,USERNAME,PASSWORD);
ssh2_struct = ssh2_config(HOSTNAME,USERNAME,PASSWORD);
Ssh2_struct = sftp(Ssh2_struct);
有一个错误,当我试图执行这个-
Ssh2_struct = ssh2_command(Ssh2_struct,'ls');
使用ssh2_main时出错(第320行)
出现Java异常:
ioexception:执行请求失败。
ch.ethz.ssh2.channel.ChannelManager.requestExecCommand (ChannelManager.java: 707)
ch.ethz.ssh2.Session.execCommand (Session.java: 248)
原因:java.io.IOException:服务器拒绝请求。
ch.ethz.ssh2.channel.ChannelManager.waitForChannelSuccessOrFailure (ChannelManager.java: 191)
ch.ethz.ssh2.channel.ChannelManager.requestExecCommand (ChannelManager.java: 703)
...1
ssh2错误(第84行)
Ssh2_struct = ssh2_main(Ssh2_struct);
ssh2_command中的错误(第31行)
Ssh2_struct = ssh2(Ssh2_struct);
我使用这些文件在安装在Windows机器上的Matlab中启动Ubuntu模拟。作为命令,我发送。/file_name_of_the_script',这样这个脚本就会在Ubuntu中执行。重要的是使用bash解释器,而不是shell(因此第一行是“#!/bin/bash”)
重要的是,脚本文件首先加载所有所需的环境变量。这可以通过使用source"-命令来完成。在这之后,我再也没有任何麻烦运行我的模拟。
再次感谢David的帮助!
当我使用SFTP上传文件时,默认情况下公共读取设置是关闭的。这使我无法使用网络浏览器查看该文件。
David通过显式地设置remote_file_mode帮助我克服了这个问题。这招很管用。例如:
Ssh2_conn = ssh2_config(主机名,用户名,密码)
ssh2_conn。远程_file_mode = 0644
Ssh2_conn = scp_put(Ssh2_conn,test.html','www_folder','local_folder','new_name.html')
ssh2_conn = ssh2_close (ssh2_conn)
坚实的,有良好文件记录的包装。作者很快地回答了一个问题。强烈推荐。
此外,Ganymed .jar也可以在Maven上使用:http://mvnrepository.com/artifact/ch.ethz.ganymed/ganymed-ssh2/
你能把提交迁移到github,这样我就可以把它分叉,并包括在我的“Matlab API for WRDS”项目中吗?
你好,Saugat,我不回复技术帮助的评论,如果需要支持,你应该直接联系我。金宝app
你好大卫,
我得到以下错误:
使用ssh2_main时出错(第86行)
错误:SSH2无法连接到SSH2主机- "localhost:8022"!
ssh2错误(第84行)
Ssh2_struct = ssh2_main(Ssh2_struct);
scp中的错误(第19行)
Ssh2_struct = ssh2(Ssh2_struct);
scp_put错误(第57行)
Ssh2_struct = scp(Ssh2_struct);
scp_simple_put中的错误(第55行)
ssh2_struct = scp_put(ssh2_struct, localFilename, localPath, localPath, remoteFilename);
David的提交提供了我迫切需要的SSH功能来解决一些问题。这是我的救命稻草。
我在连接Windows客户端和运行在Mac上的服务器时遇到了问题。我最终通过使用公共私钥机制进行身份验证解决了这个问题。我还必须在Mac上生成密钥对,并将私钥带到Windows机器上,以使一切正常工作。
初苏能够通过这样做来解决问题:
在管理员帮助下,启用密码身份验证。例如,对于Fedora上的OpenSSH,编辑/etc/sshd/sshd_config并将“PasswordAuthentication”的值更改为“yes”,然后向守护进程发送HUP信号,以便它重新读取其配置。
我下载了它在Linux CentOS上使用,一开始,我有一些问题,但大卫一直支持我。金宝app现在它工作得很好!非常感谢善良的大卫!
固定的错误!
我错过了javaaddpath命令!
非常感谢你的精彩投稿!!
嘿,大卫,
当我尝试连接时,我在Matlab命令窗口中得到以下错误-
下载ganymed-ssh2-build250.zip
从http://www.cleondris.ch/ssh2/ganymed-ssh2-build250.zip
使用urlreadwrite错误(第93行)
服务器没有找到与此请求匹配的资源。
urlwrite错误(第38行)
[f,status] = urlreadwrite(mfilename,catchErrors,url,filename,varargin{:});
ssh2_setup错误(第233行)
urlwrite (ganymed_java_library_http ganymed_java_library_zip);
ssh2_config_publickey中的错误(第26行)
Ssh2_struct = ssh2_setup();%的默认配置
如果你能帮我这个忙,我会很感激的!
问候,
光辉
嗨Enno,
不幸的是,保存日期和时间戳的支金宝app持不是用于SCP的Ganymed SSH2库的一部分。我看到的唯一替代方法是先通过SSH捕获日期和时间,然后在下载的文件上更改它。
你好大卫,
您的工具都像一个魅力,但有一种方法来保存日期和时间戳时,从远程获取文件?
SCP手册页指出-p选项应该做到这一点,但我不知道如何在ssh matlab脚本中使用它。
最好的问候,
Enno
嗨,克里斯,我的荣幸。
不幸的是,在使用scp或sftp时,不直接支持使用通配符“*”。金宝app我建议使用ssh使用通配符收集文件列表,然后使用scp或sftp下载解析后的列表。
非常感谢你的密码。这是可怕的。
顺便问一下,有办法在scp中使用野字符吗?
当我为scp尝试*时,它创建了一个名为“*”的文件
包装看起来很棒;然而,我得到以下错误:
错误:SSH2无法连接到SSH2主机-“余弦”!
错误==> ssh2在84
Ssh2_struct = ssh2_main(Ssh2_struct);
错误==> ssh2_command在31
Ssh2_struct = ssh2(Ssh2_struct);
错误==> ssh2_simple_command在38
Ssh2_struct = ssh2_command(Ssh2_struct, command, enableprint);
但是,我*am*能够连接system()命令。任何想法吗?
伟大的工具!上传和下载速度比某些ftp客户端快得多。
这个包是伟大的-良好的文档,易于使用,可靠!供您参考,如果您想在编译的MATLAB程序中使用它,请在ssh2_setup中删除对JAVAADDPATH的调用。M文件,因为它们会导致函数错误并清除全局变量。相反,将ganymed文件夹存在或将被下载的路径(当时程序的当前路径)添加到matlabroot/toolbox/local/classpath.txt文件中。
当我与开发人员就我的问题与这个功能联系时,我非常感谢他对我的查询的快速回应。
你好大卫,
非常感谢您的帮助!
我会查一下FAQ。
如需支持金宝app,请直接与作者联系。
嗨,丹尼尔,
这个问题源于这样一个事实:您没有得到bash(或tcsh) shell,因此没有得到任何典型的变量。此外,您不能在此软件的交互模式下运行bash shell。
这对我来说也是一个问题,我必须创建一个“导出”变量的文件,在我登录后,我在发出任何语句之前包含一个“source”命令。
您可能想查看ganymed-ssh2常见问题解答http://www.cleondris.ch/opensource/ssh2/FAQ.html更多信息。
这个套餐太棒了!
我试图在个人服务器上执行一个命令,但我遇到了一个问题。
我可以执行“cd /home/;ls -la;”这样的命令,但我不能执行“cd /home/;mpiexec -n np program”。当我在服务器shell中执行时,最后一个命令是正确的。
你能帮我吗?
嗨,麻省理工学院主任,我建议发送带有分叉修饰符的命令,即&,在命令后。希望您不需要等待命令完成,但如果您这样做,希望您可以检查要写入的文件。或者,您也可以像我一样把一些东西组合在一起,我在服务器上运行一个脚本,当它完成时输出一个文件。我有一个循环检查该文件,但与此同时,你可以运行其他东西(本地或远程)。
嗨,大卫,谢谢你这么棒的包裹。我正在玩你的程序的功能,因此有一个问题。
当我向外部服务器发送命令以开始模型计算时,matlab被抑制为“忙碌”状态并等待服务器的回答。有没有什么办法可以避免这个问题?非常感谢。
非常好的包装。几年前我一直在找这个。现在我能够从远程服务器复制数据文件,然后自动分析到matlab中。很好! !非常感谢。
非常好的包装。经过最后的修改,它也可以顺利地处理仅使用sftp的服务器。我非常感谢大卫·弗里德曼的支持金宝app
以及改进软件的承诺。
哇,工作得很完美!我正在用matlab设计光刻掩模。现在我不需要不断手动上传文件了!
谢谢Jon, Nitay和Danilo。我更新了文件,加进了达尼洛的解决方案。
尼泰和达尼洛是对的。我刚刚升级到R2012a,现在我之前的修复不工作,而它在R2008b上。
Danilo的修复应该适用于所有情况…
“for jcp_index = 1:size(jcp,2)”在这里不起作用。只需将其替换为“for jcp_index = 1:length(jcp)”。问题解决了。
我很抱歉,但是这个修复导致配置函数在jcp中找不到jar文件(可能是matlab版本的问题?)
这个包中的一个函数有一个错误:
ssh2_setup.m
217行:
对于jcp_index = 1:size(jcp,1)
应该是:
对于jcp_index = 1:size(jcp,2)