java - IP 作为 Linux 数组元素会抛出 UnknownHostException 但作为常量可以正常工作

标签 java linux bash sockets jsch

我在目录 /home/test/javacall 中有以下脚本,它解析 IP 对的 csv,调用 sh 文件,该文件调用可执行 jar 以从这些 IP 获取输出。

在下面的代码中,ip1=${IPArray[0]}从java抛出UnknownHostException。 但是如果我直接使用ip ip1="10.10.10.10" java代码工作正常。我从 java 执行了 System.out.println,并且在两种情况下都显示了相同的 IP。但仅在 ip1=${IPArray[0]} 的情况下,我得到了异常。

#!/bin/bash

INPUT="IPPairs.csv"
array=()

while IFS="," read var1 var2 ; do
    echo $var1 $var2
    pairString="$var1***$var2"
    array+=("$pairString")
done < $INPUT

for i in "${array[@]}" ; do
    echo $i
    IPString=$(echo $i | tr '***' ' ')
    read -ra IPArray <<< "$IPString"
    ip1=${IPArray[0]}
    #ip1="10.10.10.10"
    ip2=${IPArray[1]}

    source /home/test/javacall/javacmd.sh "$ip1" "/home/test/javacall/out.txt" "show running-config all-properties"
done

异常(exception):

com.jcraft.jsch.JSchException: java.net.UnknownHostException: 10.10.10.10
        at com.jcraft.jsch.Util.createSocket(Util.java:349)
        at com.jcraft.jsch.Session.connect(Session.java:215)
        at com.jcraft.jsch.Session.connect(Session.java:183)

最佳答案

该字符串 (357\273\277) 表示您的 csv 文件使用 Byte-Order Mark 进行编码。 (BOM) 位于文件的前面。 read 命令不会将 BOM 解释为具有特殊含义,只是传递原始字符,因此您可以将它们视为输出的一部分。

由于您没有指明源文件是如何生成的,因此您可以调整该端的设置以防止写入 BOM,这在许多情况下是可选的。或者,您可以在脚本方面通过多种方式解决这个问题。这些问题都提供了一些例子:

How can I remove the BOM from a UTF-8 file?
Cygwin command not found bad characters found in .bashrc 357\273\277

但说实话,如果您遵循 Charles Duffy 的建议并在解析文件之前通过 dos2unix 运行您的文件,它应该会自动为您清理这些内容。即:

...
array=()

dos2unix $INPUT

while IFS="," read var1 var2 ; do
...

或者,基于 Charles 的版本构建:

#!/usr/bin/env bash
case $BASH_VERSION in ''|[123].*) echo "ERROR: Bash 4.0+ needed" >&2; exit 1;; esac

INPUT="IPPairs.csv"
declare -A pairs=( )

dos2unix $INPUT

while IFS=$',\r' read -r var1 var2 _ ; do
    pairs[$var1]=$var2
done <"$INPUT"

for ip1 in "${!pairs[@]}"; do
  ip2=${pairs[$ip1]}
  # Using printf %q causes nonprintable characters to be visibly shown
  printf 'Processing pair: %q and %q\n' "$ip1" "$ip2" >&2
done

请注意,在脚本中运行 dos2unix 不一定是最好的方法,因为文件只需要转换一次。一般来说,它不会造成任何损害,尤其是对于这么小的文件。尽管如此,更好的方法是运行 dos2unix 作为将 csv 推送到服务器的任何进程的一部分,并将其排除在该脚本之外。

关于java - IP 作为 Linux 数组元素会抛出 UnknownHostException 但作为常量可以正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56001930/

相关文章:

linux - 使我在 ubuntu 16.04 LTS 上的 Octave 安装崩溃

linux - 无论 bash printf 输出如何,都将文本保留在适当的位置

java - 同步静态方法和非静态方法的区别

java - 使用 Spring MVC 从外部上下文加载文件

linux - 我应该如何设置 MATLAB 以在 Linux 中的图形上正确显示俄语(西里尔文)字符?

PHP:shell_exec 一个 shell 脚本与 shell_exec 一个 linux 上的程序(权限)

java - 在处理过程中发生错误时,休息 Controller 应如何表现

java - Spring 和 Jackson ObjectMapper 无法使用自定义过滤器

c - GCC 无法在 Linux 中编译

linux - 如何在 jar 中查找文件而不解压它并从命令行在编辑器中打开?