Tag: jsch

使用JSch执行命令

我正在使用JSch自动从后台Java进程远程启动python脚本。 修改JSch包中包含的Shell.java示例,我已经成功安装了JSch,连接到我的Pi,甚至注释掉了用户/域/密码/主机密钥检查提示框,支持将这些值直接存储在我的Java中码。 在我的java代码登录到远程Pi后,我希望它发送类似的东西 sudo nohup python2 myFoo.py & disown 到终点站。 在我修改的Shell.java示例中,我看到代码行将通道对象的输入和输出流重定向到System.in和System.out但我想简单地手动将上面的行注入远程终端并断开连接。 为什么/我的目标: 我有一个Pi的小型网状网络,它运行一天的大部分时间。 我想消除停机时间,但代码有时会在循环连续3-4天后停止工作(有时只要在代码错误和停止之前一周就会停止)。 在每个节点上运行的脚本使用“最后签入”字段更新mySQL数据库。 我希望用Java编写一个小的后台程序,它将无限期地运行在我的服务器上,不时检查每个站的“最后一次检入”,如果它注意到一个节点发生故障,则远程ssh到它和sudo reboot now ,等待大约60-100秒,然后sudo nohup python2 myFoo.py & disown

类型Session中的setConfig(Properties)不适用于参数(String,String)“

这里已经提出了这个问题: “Session类型中的方法setConfig(Properties)不适用于一年多前的参数(String,String)但它没有任何答案,我遇到了同样的问题现在。 不幸的是,我在谷歌上找不到更多。 import com.jcraft.jsch.*; import java.io.*; import java.util.Properties JSch jsch = new JSch(); String user = “myUserId”; String host = “myHost”; Session session = jsch.getSession(user, host, 22); session.setConfig(“StrictHostKeyChecking”, “no”); 我的代码就这么简单,我有以下消息: Session类型中的setConfig(Properties)方法不适用于参数(String,String)。 所以我尝试了另一种方法来做同样的事情,但它不起作用是不正常的。 有谁知道问题出在哪里?

从.pub格式的公钥创建JSch HostKey实例

我正在尝试使用JSch将文件从Windows机器发送到Linux机器。 因此我将主机公钥从Linux机器复制到我的Windows机器并将密钥添加到我的HostKeyRepository 。 但由于某种原因,我得到“无效密钥类型”exception。 这是我的代码: HostKeyRepository repo = jsch.getHostKeyRepository(); File file = new File(“D:\\Uni\\Arbeit\\ssh_host_rsa_key.pub”); byte[] HK = Files.readAllBytes(file.toPath()); Session session=jsch.getSession(user, host, 22); session.setPassword(password); HostKey hk = new HostKey(null, HK); repo.add(hk, null); session.connect();

JSch:存储在hdfs上的私钥的addIdentity

我需要从hadoop集群连接到sftp服务器。 我想知道是否有办法从存储在hdfs中的私钥加载身份。 实际上似乎JSch对象只接受本地路径: try { String privateKeyPath = “hdfs://namenode:8020/path/to/privatekey”; // need this one to be an hdfs path JSch jsch = new JSch(); jsch.addIdentity(privateKeyPath); // [..] } catch (Exception ex) { // [..] } 任何想法?

我可以使用JSCH将远程主机重新添加到known_host吗?

我希望能够从known_hosts中删除远程服务器密钥并再次添加。 远程服务器经常更新,因此我想自动删除远程主机密钥并将其新密钥添加到known_hosts。 我可以从known_hosts中删除密钥,虽然它很笨重并且使用Process而不是通过JSCH。 这有效但我每次尝试访问服务器时都会遇到此消息: The authenticity of host ‘192.168.1.1 (192.168.1.1)’ can’t be established. RSA key fingerprint is 10:10:30:00:e7:0c:d3:18:cf:ac:42:e2:f3:51:25:bg. Are you sure you want to continue connecting (yes/no)? 我知道可以使用UserInfo来解决此消息,但我使用其他方式连接到远程服务器,例如Process ,当我运行这些命令时会出现消息。 是否可以使用JSCH从known_hosts中删除和添加主机ID? 虽然它不使用jsch可能相关: 如何编写程序(脚本)以从〜/ .ssh / known_hosts中删除过时的主机密钥?

使用SSH exec通道调用shell脚本,但忽略对其他shell脚本的调用

我正在使用这里提供的有用示例,使用JSch exec在远程服务器上执行shell脚本。 我可以看到从脚本返回的回声和最后的退出状态是0 – 所以乍一看看起来都很好。 但是,问题是脚本本身会调用其他脚本,这些脚本似乎完全被忽略,只是跳过了。 该脚本直接调用其他脚本。 即脚本的第一行是这样的: script_two.sh 任何人都可以建议任何方法来克服这个问题吗? 我确实开始研究“shell”频道而不是“exec”,但在我的情况下这可能很棘手,因为在让用户访问系统之前,服务器会提供一个表格来填写(姓名,号码,为什么是你登录等等) – 我还没有能够以编程方式填写并提交此表格,所以如果可能的话我想坚持使用exec。 我是这一切的新手,所以任何帮助/建议都会受到欢迎! 下面的代码片段。 正如我所说的,这似乎有效,但是由脚本“scriptFileName”表示的sh脚本调用其他sh脚本,并且这些脚本不会被执行。 非常感谢任何帮助,J JSch jsch = new JSch(); JSch.setConfig(FileTransferConstants.STRICT_HOST_KEY_CHECKING, “no”); Session session = jsch.getSession(username, hostIPAddress, port); session.setPassword(password); session.connect(); //create the execution channel over the session ChannelExec channelExec = (ChannelExec)session.openChannel(“exec”); channelExec.setCommand(scriptFileName); channelExec.connect();

如何在使用Apache VFS时在JSch Session上设置KEX

我正在使用Apache VFS 2.1和JSch 0.1.54 (今天的最新版本)来使用SFTP上传文件。 连接时系统抛出“IO流读取结束” ,完整堆栈为: Caused by: com.jcraft.jsch.JSchException: Session.connect: java.io.IOException: End of IO Stream Read at com.jcraft.jsch.Session.connect(Session.java:565) at com.jcraft.jsch.Session.connect(Session.java:183) at org.apache.commons.vfs2.provider.sftp.SftpClientFactory.createConnection(SftpClientFactory.java:166) 我在这个post中找到了一个可能解决我问题的方法,但它直接用JSch操作。 由于我使用的是Apache VFS,我无法直接访问Session (至少我认为我不能)。 但如果可以,它看起来像这样: session.setConfig(“kex”, “diffie-hellman-group1-sha1”); 查看Apache VFS实现org.apache.commons.vfs2.provider.sftp.SftpClientFactory它没有找到设置此属性的方法。 如何使用Apache VFS API设置此配置? 更新 日志数据: 22/05/2017 09:27:20 org.apache.commons.vfs2.impl.StandardFileSystemManager info INFO: Using “D:\Users\TECBMEPI\AppData\Local\Temp\vfs_cache” as temporary files store. 22/05/2017 09:27:20 org.apache.commons.vfs2.provider.sftp.SftpClientFactory log INFO: Connecting to […]

使用jsch库复制sftp中的文件

import com.jcraft.jsch.*; public class App { public static void main(String args[]) { JSch jsch = new JSch(); Session session = null; try { session = jsch.getSession(“Username”, “Host”, PORT NO); session.setConfig(“StrictHostKeyChecking”, “no”); session.setPassword(“Password”); session.connect(); Channel channel = session.openChannel(“sftp”); channel.connect(); ChannelSftp sftpChannel = (ChannelSftp) channel; sftpChannel.get(“remotefile.txt”, “localfile.txt”); sftpChannel.exit(); session.disconnect(); } catch (JSchException e) { e.printStackTrace(); } catch […]

如何使用Java SFTP Library JSch将文件从一个目录传输到另一个目录?

我需要使用JSch库编写文件传输程序。 我有一个带有两个文件夹的简单目录 – 在SFTP_1文件夹中,我有一个位图图像。 而SFTP_2文件夹只是一个空文件夹。 我的目标是使用SFTP从SFTP_1到SFTP_2传输映像。 到目前为止,这是我的代码: import com.jcraft.jsch.*; import java.awt.Desktop; import java.nio.channels.Channel; public class FileTransfer { public FileTransfer() { super(); } public static void main (String[] args) { FileTransfer fileTransfer = new FileTransfer(); JSch jsch = new JSch(); try { String host = “127.0.0.1”; int port = 22; String user = “user”; Session session […]

如何使用jsch与ProxyCommands进行端口转发

我想ssh到一个代理后面的机器,然后在我的java程序中执行一个portforwarding。 (为了能够ssh到盒子我应该首先ssh’ed到代理机器)。 我通常在〜/ .ssh / config文件中包含以下条目: ProxyCommand ssh proxyhost.com -t nc %h %p IdentityFile /home/username/username_dsa_key 然后我运行以下命令来执行portforwarding以将hostmachine.com:54321映射到我的localhost:12345: ssh -A -L12345:localhost:54321 hostmachine.com 现在我想用Jsch库做这些,但是在打开会话中的通道后我无法弄清楚如何连接到第二个主机: String proxyHost = “proxyhost.com”; String host = “hostmachine.com”; int lport = 12345; String rhost = “localhost”; int rport = 54321; JSch jsch=new JSch(); jsch.setKnownHosts(“/home/{user}/.ssh/known_hosts”); jsch.addIdentity(“/home/{user}/.ssh/{user}_dsa_key”,passphrase); Session session1 = jsch.getSession(user,proxyHost,22); session1.connect(3000); System.out.println(session1.isConnected()); Channel channel = […]