Java 我们可以使用JSch进行基于SSH密钥的通信吗?
我使用的是sftp通信,现在我想使用方便的基于密钥的身份验证,密钥由我的网络团队加载到客户端和服务器机器上一次,所有后续通信将仅基于用户,我们已加载密钥Java 我们可以使用JSch进行基于SSH密钥的通信吗?,java,ssh,jsch,Java,Ssh,Jsch,我使用的是sftp通信,现在我想使用方便的基于密钥的身份验证,密钥由我的网络团队加载到客户端和服务器机器上一次,所有后续通信将仅基于用户,我们已加载密钥 sftp -oPort=10022 jmark@192.18.0.246 astjill@192.18.0.135 像这个命令一样,它可以很好地工作并连接到sftp,我如何通过编程实现这个功能 如果无法使用JSch,请建议使用其他库。我遇到了。这是可能的。看看 这允许您将密钥用作字节数组或从文件中读取它 import com.jcraft.j
sftp -oPort=10022 jmark@192.18.0.246
astjill@192.18.0.135
像这个命令一样,它可以很好地工作并连接到sftp,我如何通过编程实现这个功能
如果无法使用JSch,请建议使用其他库。我遇到了。这是可能的。看看 这允许您将密钥用作字节数组或从文件中读取它
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
public class UserAuthPubKey {
public static void main(String[] arg) {
try {
JSch jsch = new JSch();
String user = "tjill";
String host = "192.18.0.246";
int port = 10022;
String privateKey = ".ssh/id_rsa";
jsch.addIdentity(privateKey);
System.out.println("identity added ");
Session session = jsch.getSession(user, host, port);
System.out.println("session created.");
// disabling StrictHostKeyChecking may help to make connection but makes it insecure
// see http://stackoverflow.com/questions/30178936/jsch-sftp-security-with-session-setconfigstricthostkeychecking-no
//
// java.util.Properties config = new java.util.Properties();
// config.put("StrictHostKeyChecking", "no");
// session.setConfig(config);
session.connect();
System.out.println("session connected.....");
Channel channel = session.openChannel("sftp");
channel.setInputStream(System.in);
channel.setOutputStream(System.out);
channel.connect();
System.out.println("shell channel connected....");
ChannelSftp c = (ChannelSftp) channel;
String fileName = "test.txt";
c.put(fileName, "./in/");
c.exit();
System.out.println("done");
} catch (Exception e) {
System.err.println(e);
}
}
}
系统中的预加载可能意味着它是
.ssh/id\u rsa
或类似的,或者主机的.ssh/config
中有一个特殊设置,或者您正在使用一些程序,如ssh\u agent
按需提供密钥。探索适合您的案例,并将其添加到您的问题中。在我的案例中,我还需要提供UserInfo:session.setUserInfo(UserInfo)
。没有它,我得到的是jscheexception:USERAUTH fail
@Betlista当您使用ssh-I
时,如果不指定用户名,它将使用客户端计算机上帐户的用户名。因此,如果您以steve@client,这就像说ssh-i/path/to/private\u-keysteve@remote
@Martin-我更新了代码示例,并链接到您的答案。现在应该很清楚,禁用StrictHostKeyChecking是不安全的。只需添加:还有一个addIdentity()
方法接受密钥和密钥短语,因此您不需要处理UserInfo
-对象