这个星期接到一个新需求,需要在web应用中对另外一台主机进行文件的移动操作,本来想用ftp来操作,后来实在觉得用ftp搬来搬去太二了。正好同事提到了telnet,于是就找了一些telnet的资料,实现了这个功能。
首先,什么是telnet?百度百科说的还是蛮清楚的(对我这个半调子来说)。
接着,如何调用telnet命令呢?第一想到的是Runtime.exec(),可行不可行,总得试试才知道!
于是在网上找到了这个shell中的telnet命令,根据其中的代码:
#!/bin/bash
(
echo "user"
sleep 2
echo "passwd"
sleep 3
echo "do something in remote device"
sleep 3
echo "exit"
) | telnet IP
我拼接了一个String ,然后再用Runtime.getRuntime().exec()去执行,代码如下:
String result = "";
String unixcommand = "(sleep 1; echo user; sleep 1; echo pass; echo cp /aa/bb/cc* /dd/ee ;sleep 2) |telnet xx.xx.xx.xx";
try {
Process p = Runtime.getRuntime().exec(unixcommand);
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String msg = null;
while((msg = br.readLine())!=null){
System.out.println(msg);
}
p.waitFor();
System.out.println("command :"+unixcommand+" success!");
result = "成功传送文件!</br>";
} catch (IOException e) {
e.printStackTrace();
result = "文件传送失败!</br>";
} catch (InterruptedException e) {
e.printStackTrace();
result = "文件传送失败!</br>";
}
经实测,这种方法不靠谱,报错如下:
大概报错说的是,Not a File or Directer
(明天去单位补图)
原因我还没找出来,各位如果知道的话,请一定要告诉我!!
那么看来,必须要写shell脚本来曲线救国了
一开始,我的脚本是这么写的,目的是想写个通用的脚本:
#!/bin/bash
(
sleep 1;
echo $1;
sleep 1;
echo $2;
echo $3;
sleep 2
) |telnet $4
调用是这么调用的:
String unixcommand = "sh /aa/sendFile.sh "+user+" "+password+" ‘"+cmd+"’ "+remoteIp;
结果发现,就算是加了单引号,JAVA还是会把单引号去掉,将内部的部分作为参数传给主机,没办法,只能在脚本里把命令写死了。
最后的脚本格式是这样的:
(sleep 1; echo $1; sleep 1; echo $2; echo cp /aa/bb/TR$3*.XQ /cc/dd/TR;sleep 2) |telnet $4
(sleep 1; echo $1; sleep 1; echo $2; echo rm /aa/bb/TR$3*.XQ;sleep 2) |telnet $4
JAVA的调用是这样的:
String unixcommand = "sh /aa/send12580.sh "
+user+" "+password+" "+month+" "+remoteIp;
try {
System.out.println("commond:"+unixcommand);
Process p = Runtime.getRuntime().exec(unixcommand);
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String msg = null;
while((msg = br.readLine())!=null){
System.out.println(msg);
}
p.waitFor();
System.out.println("command :"+unixcommand+" success!");
result = "成功传送文件!</br>";
} catch (IOException e) {
e.printStackTrace();
result = "文件传送失败!</br>";
} catch (InterruptedException e) {
e.printStackTrace();
}
执行一下,大功告成!