我一直在研究使用JSCH进行scp并将文件传输到同一服务器中另一个目录的应用程序。但是,我希望能够以自动方式将文件从一个远程主机传输到另一台远程主机。以下是我用来拨打电话的代码。我尝试使用其他的scp命令,例如:scp [options] username1@source_host:directory1/filename1 username2@destination_host:directory2/filename2
。在服务器上对其进行测试时,它可以工作,但是当我尝试将其合并到下面的代码中时,它会传回错误。
代码:
public static void main(String[] args){
String array [] = {"robert.txt","ops1axv@gaalpltclu00029.linux.us.ams1907.com:/tmp"};
if(array.length!=2){
System.err.println("usage: java ScpTo file1 user@remotehost:file2");
System.exit(-1);
}
FileInputStream fis=null;
try{
String lfile=array[0];
String user=array[1].substring(0, array[1].indexOf('@'));
array[1]=array[1].substring(array[1].indexOf('@')+1);
String host=array[1].substring(0, array[1].indexOf(':'));
String rfile=array[1].substring(array[1].indexOf(':')+1);
System.out.println("RFile: " + rfile );
System.out.println("Lfile: " + lfile);
JSch jsch=new JSch();
Session session=jsch.getSession(user, host, 22);
// username and password will be given via UserInfo interface.
UserInfo ui=new MyUserInfo();
session.setUserInfo(ui);
session.connect();
boolean ptimestamp = true;
// exec 'scp -t rfile' remotely
String command="scp " + (ptimestamp ? "-p" :"") +" -t "+rfile;
Channel channel=session.openChannel("exec");
((ChannelExec)channel).setCommand(command);
// get I/O streams for remote scp
OutputStream out=channel.getOutputStream();
InputStream in=channel.getInputStream();
channel.connect();
if(checkAck(in)!=0){
System.exit(0);
}
File _lfile = new File(lfile);
if(ptimestamp){
command="T"+(_lfile.lastModified()/1000)+" 0";
// The access time should be sent here,
// but it is not accessible with JavaAPI ;-<
command+=(" "+(_lfile.lastModified()/1000)+" 0\n");
out.write(command.getBytes()); out.flush();
if(checkAck(in)!=0){
System.exit(0);
}
}
// send "C0644 filesize filename", where filename should not include '/'
long filesize=_lfile.length();
command="C0644 "+filesize+" ";
if(lfile.lastIndexOf('/')>0){
command+=lfile.substring(lfile.lastIndexOf('/')+1);
}
else{
command+=lfile;
}
command+="\n";
out.write(command.getBytes()); out.flush();
if(checkAck(in)!=0){
System.exit(0);
}
// send a content of lfile
fis=new FileInputStream(lfile);
byte[] buf=new byte[1024];
while(true){
int len=fis.read(buf, 0, buf.length);
if(len<=0) break;
out.write(buf, 0, len); //out.flush();
}
fis.close();
fis=null;
// send '\0'
buf[0]=0; out.write(buf, 0, 1); out.flush();
if(checkAck(in)!=0){
System.exit(0);
}
out.close();
channel.disconnect();
session.disconnect();
System.exit(0);
}
catch(Exception e){
System.out.println(e);
try{if(fis!=null)fis.close();}catch(Exception ee){}
}
}