我试图在私钥认证后使用JSch库将文件上传到sftp服务器.但是,put,mkdir等动作正在抛出失败的消息.我尝试了几种方法,确定它看起来像JSch中的一个问题,是否有人遇到过这个问题?
相同的代码(mkdir,put)适用于非私钥(用户名/密码)身份验证.请你帮助我好吗.sftpChannel.ls也在使用私钥方法.
我的代码:
JSch jsch = new JSch();
Session session = null;
if (privateKey != null||"".equals(privateKey)) {
jsch.addIdentity(privateKey);
}
session = jsch.getSession(userName, hostAddress, port);
session.setConfig("StrictHostKeyChecking", "no");
if(password!=null||"".equals(password)){
session.setPassword(password);
}
session.connect();
Channel channel = null;
if (sftp) {
channel = session.openChannel("sftp");
} else {
channel = session.openChannel("ftp");
}
session.setServerAliveInterval(92000);
channel.connect();
ChannelSftp sftpChannel = (ChannelSftp) channel;
// sftpChannel.put(new FileInputStream(new File(path)), remotePath );
// final Vector files = sftpChannel.ls(".");
// for (Object obj : files) {
// System.out.println("f:"+obj);
// }
sftpChannel.exit();
session.disconnect();
Run Code Online (Sandbox Code Playgroud)
Exception …Run Code Online (Sandbox Code Playgroud) 我有以下代码:
JSch jsch = new JSch();
jsch.setKnownHosts(dotSshDir + "/known_hosts");
jsch.addIdentity(dotSshDir + "/id_rsa");
Session session = jsch.getSession(userName, hostname, 22);
session.connect();
ChannelExec channel = (ChannelExec) session.openChannel("exec");
channel.setCommand(command);
channel.setInputStream(null);
channel.setErrStream(System.err);
Reader reader = new InputStreamReader(channel.getInputStream());
char[] buf = new char[1024];
int numRead;
while ((numRead = reader.read(buf)) != -1) {
String readData = String.valueOf(buf, 0, numRead);
result.append(readData);
buf = new char[1024];
}
Run Code Online (Sandbox Code Playgroud)
它试图从读者那里读取.我该如何解决?我该怎么做才能找到正在发生的事情?
我想从另一个ssh服务器后面ssh到服务器.网关服务器需要用户名/密码,我可以这样做.我使用的是隧道进入下一个服务器,但是这需要一个唯一的 SSH密钥.我已经通过PuTTY生成了密钥,因此它存在我的用户名,但我不确定如何为我的Java程序检索它.这是配置吗?即setConfig("userauth.publickey","com.jcraft.jsch.UserAuthPublicKey")那么我该如何使用这个或其他什么?文档似乎很少,我感谢任何帮助.我试过的任何东西都会给我一个错误:当我连接这个会话时"Auth fail"
谢谢!
我使用的隧道方法是:http://sourceforge.net/apps/mediawiki/jsch/index.php?title=ProxySSH所以感谢写这篇文章的人!
对于上下文,我想从我的Android手机读取/写入我学校的服务器.
我目前有一个Android应用程序通过ssh使用密码连接到我的路由器.我正在寻求改进这个,所以我可以使用键,但我有真正的问题.根据我的理解,android附带的bouncycastle版本是一个残缺的版本,因为这个ssh键不适用于jsch.我看过spongycastle,声称是一个更全面的实现.以下是与使用bouncycastle,Auth Fail基本相同的结果.
10-26 18:18:23.528: INFO/System.out(10642): Log(jsch,1): Connecting to 192.168.88.1 port 22
10-26 18:18:23.538: INFO/System.out(10642): Log(jsch,1): Connection established
10-26 18:18:23.548: INFO/System.out(10642): Log(jsch,1): Remote version string: SSH-2.0-ROSSSH
10-26 18:18:23.548: INFO/System.out(10642): Log(jsch,1): Local version string: SSH-2.0-JSCH-0.1.44
10-26 18:18:23.548: INFO/System.out(10642): Log(jsch,1): CheckCiphers: aes256-ctr,aes192-ctr,aes128-ctr,aes256-cbc,aes192-cbc,aes128-cbc,3des-ctr,arcfour,arcfour128,arcfour256
10-26 18:18:23.618: INFO/System.out(10642): Log(jsch,1): SSH_MSG_KEXINIT sent
10-26 18:18:23.618: INFO/System.out(10642): Log(jsch,1): SSH_MSG_KEXINIT received
10-26 18:18:23.628: INFO/System.out(10642): Log(jsch,1): kex: server->client aes128-cbc hmac-md5 none
10-26 18:18:23.628: INFO/System.out(10642): Log(jsch,1): kex: client->server aes128-cbc hmac-md5 none
10-26 18:18:23.688: INFO/System.out(10642): Log(jsch,1): SSH_MSG_KEXDH_INIT sent
10-26 18:18:23.688: INFO/System.out(10642): …Run Code Online (Sandbox Code Playgroud) 我已设法启动,停止并检查以前从JAVA API创建的EC2实例的状态.但是,我很难获得此实例的公共DNS地址.由于我使用StartInstancesRequest启动实例并使用StartInstancesResponse获取响应,因此无法检索实际的Instance对象.我的起始代码如下,它有效:
BasicAWSCredentials oAWSCredentials = new BasicAWSCredentials(sAccessKey, sSecretKey);
AmazonEC2 ec2 = new AmazonEC2Client(oAWSCredentials);
ec2.setEndpoint("https://eu-west-1.ec2.amazonaws.com");
List<String> instanceIDs = new ArrayList<String>();
instanceIDs.add("i-XXXXXXX");
StartInstancesRequest startInstancesRequest = new StartInstancesRequest(instanceIDs);
try {
StartInstancesResult response = ec2.startInstances(startInstancesRequest);
System.out.println("Sent! "+response.toString());
}catch (AmazonServiceException ex){
System.out.println(ex.toString());
return false;
}catch(AmazonClientException ex){
System.out.println(ex.toString());
return false;
}
Run Code Online (Sandbox Code Playgroud)
除了通过JSch连接到这个实例的任何帮助,将不胜感激.
非常感谢!
我希望使用JSch将小文件(在未知时间和未知数量)从一台服务器移动到另一台服务器 - 不幸的是,我试图为每次转移打开一个会话,这很快就被轰炸了(因为MaxSessions是我猜的10?) .
然后我用JSch打开了一个会话(每个主机),只为每个动作创建一个通道(一个发送会创建一个通道,放置文件,关闭通道),但我遇到了同样的事情(当试图这样做时)一次10个或更多,我会得到拒绝连接,因为当另一个请求通过时,一些频道仍在关闭).
所以我看了sshd_config,并发现他们有一个MaxSessions属性,这在这里非常有用 - 但它让我想知道,是不是MaxChannelsPerSession属性,或者我对JSch称之为" channel"和什么是实际的SSH频道.
我使用的是最新版本的JSch,截至20120316.
(最重要的是,我应该在网站的不同位置发布这个吗?这与编程有关,但我猜是系统管理员的一部分......)
使用带有gitolite的jgit进行源代码控制,我有一个应用程序可以根据命令生成某些代码,我们希望将其提交给源代码控制.目标是快速前进,提交新代码,然后推送它.
我有以下方法:
private void commitToGitRepository(String updateComment, Config config)
throws IOException, NoFilepatternException, GitAPIException
{
if(git == null)
{
git = Git.open(new File(config.getDpuCheckoutDir()));
}
PullCommand pull = git.pull();
pull.call();
}
Run Code Online (Sandbox Code Playgroud)
此方法在pull.call()方法调用上失败,但有以下异常:
com.jcraft.jsch.JSchException: UnknownHostKey: www.somehost.com. RSA key fingerprint is 9d:92:a9:c5:5d:cb:5f:dc:57:ff:38:7e:34:31:fe:75
at com.jcraft.jsch.Session.checkHost(Session.java:748)
at com.jcraft.jsch.Session.connect(Session.java:319)
at org.eclipse.jgit.transport.JschConfigSessionFactory.getSession(JschConfigSessionFactory.java:116)
at org.eclipse.jgit.transport.SshTransport.getSession(SshTransport.java:121)
at org.eclipse.jgit.transport.TransportGitSsh$SshFetchConnection.<init>(TransportGitSsh.java:248)
at org.eclipse.jgit.transport.TransportGitSsh.openFetch(TransportGitSsh.java:147)
at org.eclipse.jgit.transport.FetchProcess.executeImp(FetchProcess.java:136)
at org.eclipse.jgit.transport.FetchProcess.execute(FetchProcess.java:122)
at org.eclipse.jgit.transport.Transport.fetch(Transport.java:1104)
at org.eclipse.jgit.api.FetchCommand.call(FetchCommand.java:128)
at org.eclipse.jgit.api.PullCommand.call(PullCommand.java:245)
at net.intellidata.dpu.controller.schema.EntityMappingController.commitToGitRepository(EntityMappingController.java:149)
... (truncated where it meets my code)
Run Code Online (Sandbox Code Playgroud)
我读这个的方式,似乎它没有找到我的known_hosts文件user_home/.git.但是,我一直在寻找一个小时,我没有找到一种方法来配置JGit告诉JSch在哪里查找known_hosts文件.
建议?我知道origin的条目存在于我的known_hosts文件中
我正在使用JSch库列出和下载SFTP服务器上的文件.
Channel channel = this.session.openChannel(SFTP_CHANNEL_NAME);
channel.connect();
sftpChannel = (ChannelSftp) channel;
Vector listing = sftpChannel.ls("*");
在调用时ls,应用程序线程有时会卡住.
线程转储 -
Thread 15108: (state = BLOCKED)
java.lang.Object.wait(long) @bci=0 (Compiled frame; information may be imprecise)
java.io.PipedInputStream.read() @bci=142, line=310 (Compiled frame)
java.io.PipedInputStream.read(byte[], int, int) @bci=43, line=361 (Compiled frame)
com.jcraft.jsch.ChannelSftp.fill(byte[], int, int) @bci=17, line=2527 (Compiled frame)
com.jcraft.jsch.ChannelSftp.header(com.jcraft.jsch.Buffer, com.jcraft.jsch.ChannelSftp$Header) @bci=12, line=2553 (Interpreted frame)
com.jcraft.jsch.ChannelSftp.ls(java.lang.String) @bci=298, line=1424 (Interpreted frame)
有没有办法配置超时ls和其他方法?我看到设置超时,channel.connect(timeout)但这只在连接到远程服务器时设置超时.
我用JSch创建了一个SSH客户端.客户端正在使用我的Apache Mina SSH服务器.但是当我使用真实设备进行测试时,它会失败.
这是客户端的代码:
public boolean openConnection() throws ItsSshException {
boolean connectSuccess = false;
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
jschSSH.setConfig(config);
try {
sshSession = jschSSH.getSession(username, hostname, port);
sshSession.setPassword(password);
sshSession.connect(connectionTimeout);
LOGGER.info("Connection timeout : " + connectionTimeout);
Thread.sleep(1000);
sshHChannel = sshSession.openChannel("shell");
sshHChannel.connect();
in = sshHChannel.getInputStream();
out = new PrintStream(sshHChannel.getOutputStream());
clearInitialSocketState();
connectSuccess = true;
} catch (Exception e) {
LOGGER.error("Error during connecting to host: " + hostname +
", port: " + port + "!", e);
throw new ItsSshException("Error during connecting …Run Code Online (Sandbox Code Playgroud) 需要通过jumphost SSH到目标主机.曾尝试过在JSch JumpHosts示例中提到的相同内容.
Session[] sessions = new Session[2];
Session session = null;
sessions[0] = session = jsch.getSession(getUserName(), "jumphost1.com", 22);
session.setPassword(getHostPassword());
UserInfo userInfo = new UserInfo();
userInfo.setPassword(getHostPassword());
session.setUserInfo(userInfo);
Properties prop = new Properties();
prop.put("StrictHostKeyChecking", "no");
prop.put("PreferredAuthentications", "publickey,keyboard-interactive,password");
session.setConfig(prop);
session.connect();
String host = "host1.com";
int assignedPort = session.setPortForwardingL(0, host, 22);
LOGGER.info("Jump host the {} of agent {} and port forwarding {}", i, host, assignedPort);
sessions[i] = session = jsch.getSession(getUserName(), "127.0.0.1", assignedPort);
session.setPassword(getHostPassword());
userInfo = new UserInfo();
userInfo.setPassword(getHostPassword());
session.setUserInfo(userInfo); …Run Code Online (Sandbox Code Playgroud) jsch ×10
ssh ×8
java ×6
android ×2
sftp ×2
amazon ×1
amazon-ec2 ×1
bouncycastle ×1
ftp ×1
git ×1
jgit ×1
shell ×1
spongycastle ×1
sshd ×1
unix ×1