C 中的 SSH 客户端 libssh 在 Java jsch 中重写
SSH client in C libssh rewrite in Java jsch
我有一个用 C (libssh) 编写的简单 SSH 客户端,我需要用 Java (jsch) 重写客户端。这是 C 代码:
#include <libssh/libssh.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
char TEST[] = "HELLO WORLD!";
int main(){
ssh_session my_ssh_session;
int rc;
int port = 22;
int verbosity = SSH_LOG_NOLOG;
char *password, *user;
ssh_channel channel;
my_ssh_session = ssh_new();
if(my_ssh_session == NULL)
exit(-1);
ssh_options_set(my_ssh_session, SSH_OPTIONS_HOST, "192.168.1.1");
ssh_options_set(my_ssh_session, SSH_OPTIONS_PORT, &port);
ssh_options_set(my_ssh_session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity);
rc = ssh_connect(my_ssh_session);
if(rc != SSH_OK){
fprintf(stderr, "Error: %s\n", ssh_get_error(my_ssh_session));
ssh_free(my_ssh_session);
exit(-1);
}
user = "user";
password = "pass";
rc = ssh_userauth_password(my_ssh_session, user, password);
if(rc != SSH_AUTH_SUCCESS){
fprintf(stderr, "Error authenticating with password: %s\n",
ssh_get_error(my_ssh_session));
ssh_disconnect(my_ssh_session);
ssh_free(my_ssh_session);
exit(-1);
}
channel = ssh_channel_new(my_ssh_session);
if(channel == NULL)
return SSH_ERROR;
rc = ssh_channel_open_session(channel);
if(rc != SSH_OK){
ssh_channel_free(channel);
return rc;
}
ssh_channel_write(channel, TEST, sizeof(TEST)); // This line need to be implemeneted in Java using JSCH librarary.
ssh_channel_send_eof(channel);
ssh_channel_close(channel);
ssh_channel_free(channel);
ssh_disconnect(my_ssh_session);
ssh_free(my_ssh_session);
}
我已经在Java中弄清楚了客户端身份验证。客户端可以创建会话和通道,但我无法像在 C 中那样将数据写入 SSH 通道。我尝试在通道上使用 getOutputStream() 并将数据写入流,但服务器没有收到任何数据。我也尝试了 openChannel(String type ) 方法的不同设置(sheel、direct-tcpi 等...)。
这是 Java 代码:
JSch jsch=new JSch();
Session session=jsch.getSession(user, host, port);
session.setPassword(password);
localUserInfo lui=new localUserInfo();
session.setUserInfo(lui);
session.connect();
Channel channel = (Channel)session.openChannel("session" );
channel.connect();
OutputStream out = channel.getOutputStream();
out.write(buffer);
你知道如何使用 jsch 在 Java 中编写类似的功能吗?
ssh_channel_write(channel, TEST, sizeof(TEST))
来自 libssh?
谢谢
很可能数据正在添加到缓冲区,但从未被刷新到客户端。
尝试使用 PrintWriter,或简单地刷新流。
out.write("abc");
out.flush();
或
PrintWriter writer = new PrintWriter(channel.getOutputStream(), true);
writer.println("abc");
我有一个用 C (libssh) 编写的简单 SSH 客户端,我需要用 Java (jsch) 重写客户端。这是 C 代码:
#include <libssh/libssh.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
char TEST[] = "HELLO WORLD!";
int main(){
ssh_session my_ssh_session;
int rc;
int port = 22;
int verbosity = SSH_LOG_NOLOG;
char *password, *user;
ssh_channel channel;
my_ssh_session = ssh_new();
if(my_ssh_session == NULL)
exit(-1);
ssh_options_set(my_ssh_session, SSH_OPTIONS_HOST, "192.168.1.1");
ssh_options_set(my_ssh_session, SSH_OPTIONS_PORT, &port);
ssh_options_set(my_ssh_session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity);
rc = ssh_connect(my_ssh_session);
if(rc != SSH_OK){
fprintf(stderr, "Error: %s\n", ssh_get_error(my_ssh_session));
ssh_free(my_ssh_session);
exit(-1);
}
user = "user";
password = "pass";
rc = ssh_userauth_password(my_ssh_session, user, password);
if(rc != SSH_AUTH_SUCCESS){
fprintf(stderr, "Error authenticating with password: %s\n",
ssh_get_error(my_ssh_session));
ssh_disconnect(my_ssh_session);
ssh_free(my_ssh_session);
exit(-1);
}
channel = ssh_channel_new(my_ssh_session);
if(channel == NULL)
return SSH_ERROR;
rc = ssh_channel_open_session(channel);
if(rc != SSH_OK){
ssh_channel_free(channel);
return rc;
}
ssh_channel_write(channel, TEST, sizeof(TEST)); // This line need to be implemeneted in Java using JSCH librarary.
ssh_channel_send_eof(channel);
ssh_channel_close(channel);
ssh_channel_free(channel);
ssh_disconnect(my_ssh_session);
ssh_free(my_ssh_session);
}
我已经在Java中弄清楚了客户端身份验证。客户端可以创建会话和通道,但我无法像在 C 中那样将数据写入 SSH 通道。我尝试在通道上使用 getOutputStream() 并将数据写入流,但服务器没有收到任何数据。我也尝试了 openChannel(String type ) 方法的不同设置(sheel、direct-tcpi 等...)。 这是 Java 代码:
JSch jsch=new JSch();
Session session=jsch.getSession(user, host, port);
session.setPassword(password);
localUserInfo lui=new localUserInfo();
session.setUserInfo(lui);
session.connect();
Channel channel = (Channel)session.openChannel("session" );
channel.connect();
OutputStream out = channel.getOutputStream();
out.write(buffer);
你知道如何使用 jsch 在 Java 中编写类似的功能吗?
ssh_channel_write(channel, TEST, sizeof(TEST))
来自 libssh?
谢谢
很可能数据正在添加到缓冲区,但从未被刷新到客户端。
尝试使用 PrintWriter,或简单地刷新流。
out.write("abc");
out.flush();
或
PrintWriter writer = new PrintWriter(channel.getOutputStream(), true);
writer.println("abc");