サーバーにファイルをアップロードしようとすると、次の例外が発生します
com.jcraft.jsch.JSchException: Auth fail
at com.jcraft.jsch.Session.connect(Session.Java:464)
at com.jcraft.jsch.Session.connect(Session.Java:158)
at FtpService.transferFileToReciever(FtpService.Java:80)
at FtpService.transferFileToReciever(FtpService.Java:54)
at FtpService.transferFileToRecievers(FtpService.Java:44)
at FtpService.transferSingeFile(FtpService.Java:241)
at FtpService.main(FtpService.Java:26)
Auth fail
ソースファイルのtransferFileToReciever関数の一部は
JSch jsch = new JSch();
jsch.addIdentity("/root/.ssh/id_dsa");
Session session = jsch.getSession(username, Host, 22);
session.setUserInfo(serverinfo);
session.connect(); //geting exception here
boolean ptimestamp = true;
私はsshを使用してログインできるため、パスワードは機能していますが、JSChを使用すると、キー、ユーザー名、およびパスワードが提供されていても機能しません。 Java version "1.6.0_25"でid_dsaキーを使用しています。エラーは何ですか?
他の同様の質問が見つかりましたが、答えはありません。前もって感謝します。
根本原因をトレースすると、タイプdsaの公開キーがリモートサーバーの認証キーに追加されていないことが最終的にわかりました。同じものを追加することは私のために働いた。
Sshはrsaキーで動作していたため、コードを振り返っていました。
みんな、ありがとう。
ユーザー名/パスワードに特殊文字が含まれている場合は、ラクダ構成内でRAWを使用して次のような値を構成します
RAW(se+re?t&23)
ここで_se+re?t&23
_は実際のパスワードです
RAW({abc.ftp.password})
ここで、_{abc.ftp.password}
_値は、スプリングプロパティファイルから取得されます。
RAWを使用して、問題を解決しました。
例、リモートサーバーからファイルを取得してローカルマシンに保存する場合
パッケージコネクタ。
import Java.io.File;
import Java.io.FileNotFoundException;
import Java.io.FileOutputStream;
import Java.io.IOException;
import Java.io.InputStream;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;
public class Main {
public static void main(String[] args) throws JSchException, SftpException, IOException {
// TODO Auto-generated method stub
String username = "XXXXXX";
String Host = "XXXXXX";
String passwd = "XXXXXX";
JSch conn = new JSch();
Session session = null;
session = conn.getSession(username, Host, 22);
session.setPassword(passwd);
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
ChannelSftp channel = null;
channel = (ChannelSftp)session.openChannel("sftp");
channel.connect();
channel.cd("/tmp/qtmp");
InputStream in = channel.get("testScp");
String lf = "OBJECT_FILE";
FileOutputStream tergetFile = new FileOutputStream(lf);
int c;
while ( (c= in.read()) != -1 ) {
tergetFile.write(c);
}
in.close();
tergetFile.close();
channel.disconnect();
session.disconnect();
}
}
他の同様の質問が見つかりましたが、答えはありません。
この質問をどこで見つけたのかを知ることは興味深いものでした。
覚えている限りでは com.jcraft.jsch.JSchException:Auth cancel メソッド.addIdentity()
にパスフレーズを追加してください。キーファイルなしでキーファイルを生成した場合は、""
を使用できます。エラーの別の原因は指紋文字列です。一致しない場合は、認証エラーが発生します(ターゲットサーバーによって異なります)。
そしてついにここで私の作業ソースコード-私はい管理タスクを解決できた後:
public void connect(String Host, int port,
String user, String pwd,
String privateKey, String fingerPrint,
String passPhrase
) throws JSchException{
JSch jsch = new JSch();
String absoluteFilePathPrivatekey = "./";
File tmpFileObject = new File(privateKey);
if (tmpFileObject.exists() && tmpFileObject.isFile())
{
absoluteFilePathPrivatekey = tmpFileObject.getAbsolutePath();
}
jsch.addIdentity(absoluteFilePathPrivatekey, passPhrase);
session = jsch.getSession(user, Host, port);
//Password and fingerprint will be given via UserInfo interface.
UserInfo ui = new UserInfoImpl(pwd, fingerPrint);
session.setUserInfo(ui);
session.connect();
Channel channel = session.openChannel("sftp");
channel.connect();
c = (ChannelSftp) channel;
}
私も認証失敗の問題に直面しています、私のコードの問題は私が持っていることです
channelSftp.cd("");
に変更しました
channelSftp.cd(".");
その後、動作します。
次のように認証メソッドを明示的に追加してみてください。必要な場合があります。
session.setConfig("PreferredAuthentications", "password");
私の場合、以下の依存関係を使用していました
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.42</version>
</dependency>
authの同じ例外を取得できませんでしたが、更新された依存関係を以下のバージョンと問題に解決しました。
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.54</version>
</dependency>