【问题标题】:SSH client in C libssh rewrite in Java jschC libssh 中的 SSH 客户端用 Java jsch 重写
【发布时间】:2018-08-08 06:35:27
【问题描述】:

我有一个用 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 用 Ja​​va 编写类似的功能吗? ssh_channel_write(channel, TEST, sizeof(TEST)) 来自 libssh?

谢谢

【问题讨论】:

  • 听起来更像是需要实现的ssh_channel_send_eof(channel); ssh_channel_close(channel); ssh_channel_free(channel); 行。您必须刷新流才能实际传输数据。 out.flush(); 可能就足够了。

标签: java c ssh jsch libssh


【解决方案1】:

数据很可能被添加到缓冲区,但从未被刷新到客户端。

尝试使用 PrintWriter,或简单地刷新您的流。

out.write("abc");
out.flush();

PrintWriter writer = new PrintWriter(channel.getOutputStream(), true);
writer.println("abc");

【讨论】:

    猜你喜欢
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    • 2012-12-14
    • 2016-01-12
    • 2023-03-13
    相关资源
    最近更新 更多