我设法用Jsch通过ssh执行了一条命令,但是当我尝试执行第二条命令时却失败了
为了调试,我将此问题归结为以下几行:
import java.io.IOException;
import java.io.InputStream;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
public class Exec {
public static void test(Session session) throws Exception {
Channel channel = session.openChannel("exec");
((ChannelExec) channel).setCommand("pwd");
channel.setInputStream(null);
((ChannelExec) channel).setErrStream(System.err);
InputStream in = channel.getInputStream();
channel.connect();
byte[] tmp = new byte[1024];
while (true) {
while (in.available() > 0) {
int i = in.read(tmp, 0, 1024);
if (i < 0)
break;
System.out.print(new String(tmp, 0, i));
}
if (channel.isClosed()) {
System.out.println("exit-status: " + channel.getExitStatus());
break;
}
try {
Thread.sleep(1000);
} catch (Exception ee) {
}
}
channel.disconnect();
}
public static void main(String[] arg) {
try {
JSch jsch = new JSch();
Session session = jsch.getSession("nck", "127.0.0.1", 22);
session.setPassword("asd");
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
test(session); // This one succeeds with exit-status: 0
test(session); // This one fails with exit-status: 255
session.disconnect();
} catch (Exception e) {
//
}
}
}
这主要是官方的Exec示例,但这给了我以下输出:
/home/nck
exit-status: 0
exit-status: 255
第一个命令成功执行,第二个则没有成功。
有任何想法吗 ?
嘿,jsch和Ubuntu完全一样。(如何)解决了?为每个执行执行新会话会浪费太多时间?此刻,我捕获了jsch异常并搜索“会话未关闭”,然后我重新连接了该会话并再次执行命令。可行,但不是一个好的解决方案。
编辑:我现在使用错误的方式解决了我的问题
channel = session.openChannel("shell");
而不是“ exec”。
我正在从事一个项目,其中我打算制作一个JavaGUI应用程序,该应用程序连接到ssh服务器并在服务器上执行远程命令。我愿意使用JSch库。我的目标是制作按钮和文本字段,让用户能够轻松发送命令和获得回复。我的意思是,用户不会打开xShell并提示“grep”hi“/usr/file.txt”,而是从列表中选择路径,在文本字段中输入“hi”,然后按下grep按钮。 问题是,我找不到一个在一个会话中执行
基本上,我有一个java程序,它使用JSch SSH库来控制两个不同的SSH连接。 我创建了一个名为SSHConnection的类,它是JSch库的包装器,并通过调用如下所示的构造函数初始化了两个副本: 但是,我发现,如果我已经打开了一个使用SHELL通道的会话,当我试图为第二个会话打开第一个通道时,我会得到一个错误,即“channel is not opened”(JSch异常)。 有没有一种方
问题内容: 我要为已经在同一域/服务器上运行另一个PHP应用程序的网站构建一个PHP应用程序。我的应用程序当然将使用会话,并且我不希望我的会话干扰现有的应用程序。例如,如果我想使用$ _SESSION [‘username’],也许另一个应用程序也使用$ _SESSION [‘username’],这可能是个问题。我不是在寻找额外的安全层,我相信与之共享主机的应用程序。我只想避免错误。 一种方法是
嗨,我正试图通过ssh隧道连接到服务器上的数据库,但我甚至无法连接Jsch会话。我试图在GWT中作为我的后端代码的一部分来做这件事。这是服务器端代码的实现部分。我对服务器一般不是那么熟悉。通常在端子I类型中: ssh-x username@xxxx.xxx.edu 然后系统提示我输入密码,我输入密码,然后我就进入了。 所以在java中我的代码如下: 我已经双重检查了用户名、密码和主机字符串,它们都
a.c: #include <stdio.h> int func(int a, int b) { int c = a * b; printf("c is %d\n", c); } int main(void) { func(1, 2); return 0; } b.c: #include <stdio.h> int func1
问题内容: 我正在使用Spring和Hibernate,Spring的配置如下。如何配置两个数据源, session factories。使用注释管理事务。请指教 问题答案: 在Hibernate DAO中,我们可以使用@Qualifier注释,如下所示连接2个会话工厂