关于Apache.commons.net中的telnet协议调用中输入cmd命令的长度的问题

     之前做了一个项目,用到Apache封装的一个调用Windows系统telnet服务的jar包,开始在远程执行cmd命令的时候由于命令所带的参数比较短,没有出现什么问题,昨天在调用时突然就无法执行了,后来找各种原因,一一排除后猜测是执行的cmd命令参数长度太长,命令行无法执行

     后来把远程调用的telnet输出流中的数据全读出来,一一对比后发现在第1024个字符处出现了一个乱码,是一个像“口”的乱码,这时就猜测是命令长度不得超过1k,也就是1024个字符。

     后来查了下命令行的命令长度限制,资料如下

标题: 命令行的长度限制是多少?
作者: Demon
链接: http://demon.tw/programming/what-is-the-command-line-length-limit.html
版权: 本博客的所有文章,都遵守“署名-非商业性使用-相同方式共享 2.5 中国大陆”协议条款。

命令行的长度限制是多少?这取决于你问的是谁。

CreateProcess函数的最长命令行长度为32767字符。这个限制来自于UNICODE_STRING结构。

CreateProcess是创建进程的核心函数,所以如果你直接调用该函数,该限制是你唯一需要注意的地方。但是如果你通过其他方式间接调用CreateProcess,那么可能会有其他限制。

如果你使用的是CMD.EXE命令处理器,那么你同样受到CMD.EXE的长度限制,即8192的命令行长度限制。

如果你正在使用ShellExecute/Ex函数,那么你会受到ShellExecute/Ex函数的长度限制,即不得超过INTERNET_MAX_URL_LENGTH的命令行长度(大约2048字符)(如果你的操作系统为Windows 95,那么该限制为MAX_PATH)

谈到这儿,我还要提到另外一种限制:你所处环境的最大长度为32767字符。环境的最大值包括所有的变量名加上所有的值。

      但是这里明显不是上述的那些情况,这里是1024个字符。不知道是不是Apache封装的时候设定的参数大小为1Kb

      最后我的解决方法是:

      先将完整的Command命令写入telnet并执行,这时输出流中会出现刚才输入的一长串命令,末尾是”more ?“ 其中在第1024个字符处是乱码,这里可以将流中的数据一一读出,只要读到‘?’就返回标记,将之前的Command去掉前1023个字符,将剩下的一串作为新的Command命令写入telnet并执行,然后反复循环上述操作。

       代码简单就不贴了

 

posted @ 2016-01-28 17:15  Acandy  阅读(593)  评论(0编辑  收藏  举报