Domanda

Credo di capire la differenza tra la modalità ASCII e modalità binaria sui trasferimenti FTP regolari - in modalità binaria il file viene copiato esattamente, e in modalità ASCII il cliente può modificare fine riga (strippaggio Carriage Return da Windows -> UNIX o aggiungendo nell'altra direzione). Tuttavia, ho pensato che il protocollo SFTP supportata solo i trasferimenti binari stile modalità; il file di origine non sarebbe stato modificato.

Tuttavia, quando si utilizza la libreria JSch di copiare un file da Windows a UNIX, la fine riga in stile Windows sono spogliato. Questo è problematico perché questi file vengono recuperati da altri, utilizzando vari metodi, per le macchine Windows, e non posso garantire che i loro clienti potranno aggiungere nuovamente il ritorno a capo prima di ogni avanzamento riga.

Properties properties = new Properties();
properties.setProperty("StrictHostKeyChecking", "no");
Session session = jsch.getSession(UserName, Address, Port);
session.setPassword(Password);
session.setConfig(properties);
session.connect();
ChannelSftp channel = (ChannelSftp)session.openChannel("sftp");
channel.connect();
channel.
channel.cd(SCPDir);
channel.put(new ByteArrayInputStream(WindowsStyleString.getBytes()), FileName);
channel.disconnect();
session.disconnect();

C'è qualcosa che posso fare per garantire che JSch trasferisce i file esattamente? E 'frustrante carente di documentazione, quindi non sono sicuro se c'è qualche parametro del suo o forse qualche ulteriore proprietà SSH posso specificare per garantire il trasferimento Verbatim. E perché questo anche accade, in primo luogo, quando modifiche di stile modalità ASCII non fanno parte dello standard SFTP?

È stato utile?

Soluzione

SFTP supportata la modalità solo binario fino alla versione 4 e nella versione 4 e versioni successive (5, 6) modalità binaria è ancora inadempiente, anche se la modalità ASCII è disponibile anche. Qualunque sia JSH fa con il file è di propria iniziativa. Forse è spoglia CR sé, o forse il server fa questo, non posso dire con certezza senza vedere alcun tipo di log che jsh o server espone.

Altri suggerimenti

Un altro caso di depistaggio; Mi scuso per tutte queste domande non soddisfacenti.

Si scopre che su Windows, dove posso eseguire il debug, onnipresenti restituisce toString fine riga di Java con il Carriage Return e Line Feed (\ r \ n). Sui server Linux di produzione, i rendimenti toString solo \ n. Tuttavia, ogni uso che ho avuto di questi oggetti toString, se caricato tramite FTP (anche se l'host è anche una macchina Linux), inviato per posta elettronica, o utilizzato in query SQL, sia automaticamente aggiunto \ r o non lo richiedono. Ma non lo fece SFTP.

Quindi credo che la lezione è che toString probabilmente restituisce una linea di piattaforma appropriata fine format, che org.apache.commons.net.ftp.FTPClient in modalità ASCII aggiungerà \ r prima \ n anche se il server FTP è ospitato su Linux (o forse il server è mascherata da Windows), e che la posta elettronica e SQL non particolarmente cura che terminazioni linea che hanno.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top