当前位置: 首页 > 面试题库 >

使用JSch setCommand执行时,带有source选项的Shell ping命令失败

郦昆
2023-03-14
问题内容

我正在测试短ping测试程序。如果我将简单的ping命令设置"ping y.y.y.y -c 5 -s 500 "为setCommand()功能,它将按设计工作。但是,如果我添加另外平的选择,"ping source x.x.x.x host y.y.y.y -c 5 -s 500"我有

ping:未知主机源

回信。如果我从x终端手动执行两个命令,则两个命令都能正常工作。

我需要使程序从不同的源接口IP执行ping操作。使用JSch的两个命令有什么区别setCommand?

  1. ping y.y.y.y -c 5 -s 500 (加工)
  2. ping source x.x.x.x host y.y.y.y -c 5 -s 500 (不工作)

码:

public static void main(String[] arg){
try{
  JSch jsch=new JSch();  

  String host=null;
  if(arg.length>0){
    host=arg[0];
  }
  else{
    host=JOptionPane.showInputDialog("Enter username@hostname",
                                     System.getProperty("user.name")+
                                     "@localhost"); 
  }
  String user=host.substring(0, host.indexOf('@'));
  host=host.substring(host.indexOf('@')+1);

  Session session=jsch.getSession(user, host, 22);

  UserInfo ui=new MyUserInfo();
  session.setUserInfo(ui);
  session.connect();

  // this command works
  // String command = "ping 20.5.1.15 -c " + count + " -s " + size;

  // this command not working
  String command = "ping source 20.5.1.10 host 20.5.1.15 -c " + count + " -s
  " + size;

  Channel channel=session.openChannel("exec");
  ((ChannelExec)channel).setCommand(command);

  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()){
      if(in.available()>0) continue; 
      System.out.println("exit-status: "+channel.getExitStatus());
      break;
    }
    try{Thread.sleep(1000);}catch(Exception ee){}
  }
  channel.disconnect();
  session.disconnect();
}
catch(Exception e){
  System.out.println(e);
}

问题答案:

您的ping source x.x.x.x host y.y.y.y语法对我来说似乎很奇怪。但我相信您,它可以在终端上正常工作。

该ping命令可能取决于某些环境变量或其他配置来解析源地址。

JSch中的“ exec”通道(正确地)没有为会话分配伪终端(PTY)。结果,(可能)获得了一组不同的启动脚本。基于TERM环境变量的存在/不存在,使用脚本中的和/或不同分支。因此,环境可能不同于您与SSH客户端一起使用的交互式会话。

如果这使ping命令中断,则很明显是服务器端配置错误,而不是JSch故障。该ping命令不是交互式命令,因此即使在非交互式会话上也应起作用。您应该找出破坏的原因,ping并相应地修复启动脚本。

要验证这是根本原因,请在SSH客户端中禁用伪终端分配。例如在PuTTY中,它是Connection> SSH> TTY>不要分配伪终端。然后转到“连接”>“ SSH”>“远程”命令并输入您的ping source …命令。检查会话>退出时关闭窗口>从不,然后打开会话。

另一种(不推荐)的方法是使用以下.setPty方法强制为“ exec”通道分配伪终端:

Channel channel=session.openChannel("exec");
((ChannelExec)channel).setPty(true);


 类似资料:
  • 问题内容: 为了从Java执行python脚本(具有几个命​​令行参数),我尝试使用的是以下Java代码 例如,我打算执行以下命令: 请注意,参数arg3采用参数值列表。 我面临的问题是我没有找到将值列表传递给参数arg3的方法。 如果有人可以给我一些提示以解决我的问题,我将不胜感激。 我已经进行了搜索,但是找不到适合我需要的答案,如果有人找到正确的链接,请告诉我。 最好! 问题答案: 只需将它们

  • 甲骨文是甲骨文公司和/或其附属公司的注册商标。其他名称可能是其各自所有者的商标。

  • Node.js 自带了各种命令行选项。 这些选项开放了内置的调试、执行脚本的多种方式、以及其他有用的运行时选项。运行 man node 可在一个终端中查看操作手册。 概要 node [options] [v8 options] [script.js | -e "script" | -] [--] [arguments] node debug [script.js | -e "script" | <

  • Shebang 行 几乎每个 Perl 程序都如此开始: #!/usr/bin/perl 这是 UNIX 结构,它告诉 Shell 直接执行余下的输入程序文件。 你可以在此行添加 Perl 的任何命令行选项,它们将成为选项之后命令行的一部分。 如果你有一个程序包含: #!/usr/bin/perl -T 然后执行: perl -l program.pl -l 和 -T 两个选项都会使用,但

  • 我目前正在处理这个android项目,它刚刚从eclipse移植到android Studio。使用android studio IDE构建APKs工作良好,但最近我想尝试使用terminal(mac osx)来构建APKs,但事情并不顺利。即使是最基本的命令 或 根本不起作用并且在同一点上不断失败。下面是错误的stacktrace

  • Ruby 一般是从命令行运行,方式如下: 解释器可以通过下列选项被调用,来控制解释器的环境和行为。 选项 描述 -a 与 -n 或 -p 一起使用时,可以打开自动拆分模式(auto split mode)。请查看 -n 和 -p 选项。 -c 只检查语法,不执行程序。 -C dir 在执行前改变目录(等价于 -X)。 -d 启用调试模式(等价于 -debug)。 -F pat 指定 pat 作为默