我正在尝试连接到在 Amazon EC2 服务器上运行的 postgres 数据库。我知道服务器配置正确,因为我可以从 pgadmin 访问它并作为 intellij 中的数据源。
当仅使用 jsch 时,我还可以从程序中连接到服务器 shell,并直接使用 jdbc 连接到另一个数据库,但是一旦我尝试通过 ssh 隧道与 jsch 连接到我的 postgres 实例,我就会遇到这个奇怪的错误无法诊断:
org.postgresql.util.PSQLException: The connection attempt failed.
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:262)
at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:67)
at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:216)
at org.postgresql.Driver.makeConnection(Driver.java:406)
at org.postgresql.Driver.connect(Driver.java:274)
at java.sql.DriverManager.getConnection(DriverManager.java:664)
at java.sql.DriverManager.getConnection(DriverManager.java:208)
at EnumStreamer.main(EnumStreamer.java:38)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Caused by: java.io.EOFException
at org.postgresql.core.PGStream.ReceiveChar(PGStream.java:285)
at org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:411)
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:208)
... 12 more
Run Code Online (Sandbox Code Playgroud)
我用来连接的代码如下:
System.out.println("Connecting...");
session = secConnect.getSesssion();
UserInfo ui = new uInfo();
session.setUserInfo(ui);
session.connect();
session.setPortForwardingL(5432,secConnect.getHost(),5432);
System.out.println("SSH …Run Code Online (Sandbox Code Playgroud) 我尝试根据说明在 Java 程序中使用 SSH 与 PythonAnywhere 中的 MySQL 库建立连接: https:
//help.pythonanywhere.com/pages/AccessingMySQLFromOutsidePythonAnywhere
不幸的是,我每次都会遇到这个错误,而且我已经没有想法了:
com.jcraft.jsch.JSchException:拒绝主机密钥:ssh.pythonanywhere.com
public static void main(String[] args) {
Tunnel tunnel = new Tunnel();
try {
tunnel.go();
} catch (Exception e) {
e.printStackTrace();
}
}
public void go() throws Exception {
String host = "ssh.pythonanywhere.com";
String user = "username";
String password = "password";
int port = 22;
int tunnelLocalPort = 9080;
String tunnelRemoteHost = "username.mysql.pythonanywhere-services.com";
int tunnelRemotePort = 3306;
JSch jsch= new JSch();
Session session = jsch.getSession(user,host,port);
localUserInfo lui = …Run Code Online (Sandbox Code Playgroud) 我一直在尝试使用 PGP 加密大文件(我为此使用 BouncyGPG)并使用 SFTP(使用 JSch)将其发送到远程服务器。我正在使用 PipedOutputStream 和 PipedInputStream 来避免在发送到服务器之前将最终加密的文件保存在本地。我相信因此 BouncyGPG 行为不端。
谁能帮我这个?
这是我的代码:
BouncyGPG.registerProvider()
private val bufferSize: Int = 8 * 1024
fun sendFileSFTP(myFile: MyFile {
PipedInputStream().use { input ->
GlobalScope.launch {
PipedOutputStream(input).use { output ->
encrypt(myFile, output)
}
}
sendSFTP(input, "mysftp-directory/${myFile.filename}")
log.info("Finished Sending $myFile")
}
}
fun encrypt(myFile: MyFile output: OutputStream) {
log.info("ENCRYPTING - $myFile")
val pubkey = "/home/myhome/server.gpg"
val privkey = "/home/myhome/server.secret.gpg"
val password = "password"
val keyring = KeyringConfigs.forGpgExportedKeys(KeyringConfigCallbacks.withPassword(password))
keyring.addPublicKey(FileReader(File(pubkey)).readText().toByteArray(charset("US-ASCII")))
keyring.addSecretKey(FileReader(File(privkey)).readText().toByteArray(charset("US-ASCII")))
BouncyGPG.encryptToStream()
.withConfig(keyring)
.withStrongAlgorithms()
.toRecipients("contact@myserver.com")
.andDoNotSign() …Run Code Online (Sandbox Code Playgroud) 我需要连接到服务器(用户名,密码,主机) - 简单
输入3-10命令 - command ="dir; date; cd; dir"是否有更简单的方法?,不写20行:while(smtng){很多东西+神秘的打印到scr:D}
下载文件 - 简单
将另一个下载的文件写入同一个文件(添加不是owerride) - 任何想法如何?
因此,为了执行这些可增加的简单任务,如果您敢于使用Jsch(awsome文档),这似乎是不可能的,Jsch,sshj,Ganymed之间有选择任何建议吗?
神秘:
2)多个命令进入
4)在现有的txt文件中添加更多txt:D(可能还有一个内置命令)或不?
/* just for download/owerride : sftpChannel.get("downloadfile.txt", "savefile.txt");*/
Run Code Online (Sandbox Code Playgroud) 我需要能够从Java程序ssh到远程服务器,从那里SSH到另一台服务器.我的客户端上有两台服务器的凭据.
这些命令将作为常规字符串(无用户输入)从应用程序内自动传递.我需要能够在第二台服务器上运行这些自定义命令,并能够根据输出和一些简单的逻辑决定在运行时期间要发出什么命令.
我可以使用JSch来做到这一点,如果是的话,我应该从哪里开始研究?(例子,信息)
================================================== ===========
添加:
线程"main"中的异常com.jcraft.jsch.JSchException:UnknownHostKey:host.net.RSA密钥指纹是'blahblahblah'
到目前为止,我通过修改known_hosts文件并在那里手动添加主机来解决这个问题.我可以通过设置一个选项告诉JSch在询问这个YES-NO问题时自动按YES来绕过这个小问题吗?
我正在创建许多不同的(Session)对象,将登录凭据从Oracle pl/sql包传递给java类.然后,我将此(会话)对象存储在Vector中.我们的想法是连接,打开所需的频道,关闭频道,最后断开特定会话与此Vector的连接.我设法做到了,但它只为每个连接工作一次.我的意思是,在我的Vector(session1,session2,session3)中,当我调用session1.connect()然后调用session1.disconnect()时,我再也无法调用session1.connect(),因为它显然尝试了连接到服务器,但后来我得到:
检索存储在Vector中的会话我打开一个会话并获取:
INFO: Connecting to sftp.myserver.com port 2122
INFO: Connection established
INFO: Remote version string: SSH-2.0-OpenSSH_4.7
INFO: Local version string: SSH-2.0-JSCH-0.1.48
INFO: CheckCiphers: aes256-ctr,aes192-ctr,aes128-ctr,aes256-cbc,aes192-cbc,aes128- cbc,3des-ctr,arcfour,arcfour128,arcfour256
INFO: aes256-ctr is not available.
INFO: aes192-ctr is not available.
INFO: aes256-cbc is not available.
INFO: aes192-cbc is not available.
INFO: arcfour256 is not available.
INFO: CheckKexes: diffie-hellman-group14-sha1
INFO: diffie-hellman-group14-sha1 is not available.
INFO: SSH_MSG_KEXINIT sent
INFO: SSH_MSG_KEXINIT received
INFO: kex: server: diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange- sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
INFO: kex: server: ssh-rsa,ssh-dss
INFO: kex: server: aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,arcfour128,arcfour256,arcfour,aes192-cbc,aes256-cbc,rijndael-cbc@lysator.liu.se,aes128-ctr,aes192-ctr,aes256-ctr
INFO: kex: …Run Code Online (Sandbox Code Playgroud) 我是java新手,我正在尝试编写一个脚本,每天从各个SFTP站点提取多个文件.
我有下面的代码,将从1个网站拉1个文件,它的工作原理,但我很难找到如何修改我的代码,以便下载多个文件.例如,远程目录中的所有文件,或仅包含某些字母的某些文件
你能告诉我这件事吗?
码:-
package package1;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
public class SFTPpullsshkeys {
public SFTPpullsshkeys() {
}
public static void main(String[] args) {
String SFTPHOST = "IP";
int SFTPPORT = 22;
String SFTPUSER = "Username";
String passphrase = "passphrase";
String SFTPWORKINGDIR = "remote directory";
String prikeyfile = "C:\\Open SSH Key.ppk";
Session session = null;
Channel channel = null;
ChannelSftp channelSftp = null;
try{
JSch jsch …Run Code Online (Sandbox Code Playgroud) 我通过sftp(JSCH)连接到FTP服务器.
Evertime我使用端口21连接到FTP服务器,它始终挂在session.connect().
它不会抛出任何异常.但是当我使用其他端口时.它工作,它抛出异常.
有什么方法可以捕捉错误吗?
这是我的代码示例.
public static void main(String[] args) throws SftpException {
JSch jsch = new JSch();
try {
Session session = jsch.getSession("username", "host", 21);
session.setConfig("StrictHostKeyChecking", "no");
session.setPassword("password");
session.connect();
Channel channel = session.openChannel("sftp");
channel.connect();
ChannelSftp channelSftp = (ChannelSftp) channel;
session.disconnect();
channelSftp.disconnect();
} catch (JSchException e) {
log("Cannot make connection to FTP server ");
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud) 我构建了一个Java应用程序,该应用程序通过ssh运行命令。在第一次尝试中,我通过用户名和密码进行了身份验证,并且一切正常。
现在,我想使用Kerberos keytab文件进行身份验证,但这会带来问题!
这里是我的配置几句话:
my-server.deMYREALM.DEkeytabuserCentOS 7Windows 8.1 (x64)了所有默认配置Kerberos for WindowsDanielkinit -kt ... 似乎工作正常,因此keytab文件也应该没问题到目前为止,我的代码片段是:
public static void main(String[] args) {
String host = "my-server.de";
String user = "keytabuser";
String command = "ls -l";
JSch jsch = new JSch();
jsch.setLogger(new MyLogger());
System.setProperty("java.security.krb5.conf", "C:\\ProgramData\\MIT\\Kerberos5\\krb5.ini");
System.setProperty("java.security.auth.login.config", "C:\\ProgramData\\MIT\\Kerberos5\\jaas.conf");
System.setProperty("javax.security.auth.useSubjectCredsOnly", "false");
//to enable kerberos debugging mode
System.setProperty("sun.security.krb5.debug", "true");
try {
Session session = jsch.getSession(user, host, 22);
Properties config = new …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Java代码中的JSch库将SSH SSH到EC2。我在SO中引用了此链接如何使用JSch库在ec2连接中将.pem文件内容用作字符串并尝试了下面提到的几件事,但没有成功。有人可以指导我如何实现我的目标吗?
目的
我有一个像这样的PEM文件。我不想将我的PEM文件存储在AWS中的任何位置,因此我的方法是提取一个等效字符串,我可以对其进行编码和存储在数据库中,然后从Java对其进行解码,以将参数传递给addIdentity采用以下参数的方法:
addIdentity(String name, byte[] prvkey, byte[] pubkey, byte[] passphrase)
throws JSchException
Run Code Online (Sandbox Code Playgroud)
addIdentity(String name, byte[] prvkey, byte[] pubkey, byte[] passphrase)
throws JSchException
Run Code Online (Sandbox Code Playgroud)
出于我的目标,我addIdentity相信我的方法是这样的:
addIdentity ("username","{privatekey string converted to byte array}",null, null)
Run Code Online (Sandbox Code Playgroud)
我试图了解如何形成字符串?我对密码学非常陌生,但是在此过程中,我了解到由于PEM具有BEGIN RSA PRIVATE KEY,它是PKCS1格式。JSch是否支持PKCS1格式,或者需要将其转换为PKSC8?
其次,我了解到主体是使用Base64编码的,因此我什至在剥离所有回车符,页眉和页脚后甚至尝试使用Base64解码字符串,这给了我这样的错误
线程“主”中的异常java.security.spec.InvalidKeySpecException:java.security.InvalidKeyException:IOException:algid解析错误,不是序列
以下是我尝试跟进但仍无法解决的一些其他链接。
希望有人可以指引我正确的方向。
谢谢!