关于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并执行,然后反复循环上述操作。
代码简单就不贴了