我有一个.sh脚本,它粘合了许多其他脚本,由Windows应用程序中的jsch ChannelExec调用.
Channel channel = session.openChannel("exec");
((ChannelExec) channel).setCommand("/foo/bar/foobar.sh");
channel.connect();
Run Code Online (Sandbox Code Playgroud)
如果我运行像"nohup /foo/bar/foobar.sh >> /path/to/foo.log&"这样的命令,那么所有长期工作(数据库操作,文件处理等)似乎都会丢失.
检查日志文件,只查找那些回声填充(长期操作之前和之后,计算运行时间等).
我检查了权限,$ PATH,将源/ etc/profile添加到我的.sh但这些都没有.
但是当我正常运行命令(同步运行,在Windows上将所有回显输出打印到我的java客户端)时,所有事情都顺利进行.
这是一个非常具体的问题.希望有经验的人可以帮助我.
预先感谢.
韩
我正在使用Java的JSch API 进行 SFTP 连接。有时服务器可能会关闭一秒钟或连接可能很忙。在这些情况下,在我确定连接失败之前,我至少需要重新连接到服务器 3 次。
JSch 是否提供任何配置选项来自动执行此操作?
我正在使用ChannelSftp(jsch-0.1.42.jar)从unix服务器复制文件,并且可以成功完成,但最后修改日期会被当前时间覆盖.
我正在使用chanSftp.get(nextName,"C:/ Test /"+ nextName);
有没有办法在本地副本上保留远程文件的上次修改时间?
我有使用的远程文件的最后修改时间
attrs = lsEntry.getAttrs();
日期modDate =(Date)format.parse(attrs.getMtimeString());
我正在尝试使用Jsch在Java中建立SSH连接.我已将"StrictHostKeyChecking"设置为yes.据我所知,必须事先获取服务器的主机密钥,并在第一次尝试连接服务器之前存储在hostkey文件中.如何获取服务器的HostKey.我的代码产生以下异常:
com.jcraft.jsch.JSchException:UnknownHostKey:ASY-PC RSA密钥指纹是22:fb:ee:fe:18:cd:aa:9a:9c:78:89:9f:b4:78:75:b4
如何与StrictHostKeyChecking建立连接是的.这是我的代码.
package sshexample;
import com.jcraft.jsch.*;
import java.io.*;
public class SSHexample
{
public static void main(String[] args)
{
String user = "user";
String password = "password";
String host = "192.168.100.103";
int port=22;
try
{
JSch jsch = new JSch();
Session session = jsch.getSession(user, host, port);
session.setPassword(password);
session.setConfig("StrictHostKeyChecking", "yes");
System.out.println("Establishing Connection...");
session.connect();
System.out.println("Connection established.");
System.out.println("Crating SFTP Channel.");
ChannelSftp sftpChannel = (ChannelSftp) session.openChannel("sftp");
sftpChannel.connect();
}catch(Exception e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud) 不幸的是,该getExitStatus()方法总是返回-1所以我不能用它来告诉我文件上传是否有效.我试图用getInputStream()的方法Channel类,但每当我试图从InputStream我的代码阻止永远读仿佛Channel实例还开着/连接(即使isConnected和isClosed()分别为虚假和真实的-这表明通道确实是封闭的) .我尝试从输入流中读取一个数据字节后,以下代码总是阻塞:
public class Put {
public static void main(String[] args) throws IOException {
Session session = null;
Channel channel = null;
ChannelSftp channelSftp = null;
InputStream in = null;
JSch jsch = new JSch();
try {
jsch.setKnownHosts("known_hosts");
session = jsch.getSession("user", "host", 22);
session.setPassword("password");
session.connect();
channel = session.openChannel("sftp");
channel.setInputStream(null);
stdout = channel.getInputStream();
channel.connect();
channelSftp = (ChannelSftp)channel;
channelSftp.cd("/path/to/sftp");
channelSftp.put("/path/to/localfile", "/path/to/remotefile");
} catch (JSchException e) {
System.out.println(e.getMessage());
e.printStackTrace();
} catch …Run Code Online (Sandbox Code Playgroud) 我试图尝试从我的 Java 应用程序到客户端的外部服务器的 SSH 连接。客户端增强了安全性,他们不接受 1024 位素数,但我的 JSch 只发送 1024 位素数。
请在下面的我的应用程序中找到详细的错误输出:
INFO |: Launching [sftp] handler
INFO |: Creating SFTP session to host [server1] with logger for JSch
INFO |: Connecting via public/private key.
INFO |: Session created.
INFO |: Connecting to server1 port 22
INFO |: Connection established
INFO |: Remote version string: SSH-2.0-VShell_4_1_1_862 VShell
INFO |: Local version string: SSH-2.0-JSCH-0.1.53
INFO |: CheckCiphers: aes256-ctr,aes192-ctr,aes128-ctr,aes256-cbc,aes192-cbc,aes128-cbc,3des-ctr,arcfour,arcfour128,arcfour256
INFO |: CheckKexes: diffie-hellman-group14-sha1,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521
INFO |: SSH_MSG_KEXINIT sent
INFO |: SSH_MSG_KEXINIT received
INFO …Run Code Online (Sandbox Code Playgroud) 我有一段连接到Unix服务器并执行命令的代码.
我一直在尝试简单的命令,他们工作正常.
我能够登录并获得命令的输出.
我需要通过Java运行Ab-initio图.
我正在使用此air sandbox run graph命令.
当我使用SSH客户端登录并运行命令时,它运行正常.我能够运行图表.但是,当我尝试通过Java运行命令时,它会给我一个"未找到空气"的错误.
对JSch支持的Unix命令有什么限制吗?
知道为什么我无法通过我的Java代码运行命令吗?
这是代码:
public static void connect(){
try{
JSch jsch=new JSch();
String host="*****";
String user="*****";
String config =
"Host foo\n"+
" User "+user+"\n"+
" Hostname "+host+"\n";
ConfigRepository configRepository =
com.jcraft.jsch.OpenSSHConfig.parse(config);
jsch.setConfigRepository(configRepository);
Session session=jsch.getSession("foo");
String passwd ="*****";
session.setPassword(passwd);
UserInfo ui = new MyUserInfo(){
public boolean promptYesNo(String message){
int foo = 0;
return foo==0;
}
};
session.setUserInfo(ui);
session.connect();
String command="air sandbox run <graph-path>";
Channel channel=session.openChannel("exec");
((ChannelExec)channel).setCommand(command);
channel.setInputStream(null);
((ChannelExec)channel).setErrStream(System.err);
InputStream …Run Code Online (Sandbox Code Playgroud) 正如来自这个问题和本教程的用户所解释的那样,我正在尝试设置一个简单的 ssh 连接以在应用程序上执行单个命令。它甚至不需要等待任何响应。
这是代码:
主要活动:包 com.example.lucas.shutdown;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onCLick(View v){
new AsyncTask<Integer, Void, Void>(){
@Override
protected Void doInBackground(Integer... params) {
try {
executeRemoteShutdown();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}.execute(1);
}
public void executeRemoteShutdown(){
String user = "ssh";
String password = …Run Code Online (Sandbox Code Playgroud) 我想上传一个非常大的文件,它的大小可以是1 GB。是否可以将其上传或下载到/从 SFTP 服务器?我正在使用 JSch 库。
我遇到了这个问题,其中 sftpChannel.rename 失败,错误不是很有帮助,我想不出原因。目标中不存在文件。权限很好,因为 mv 命令有效。我将列出文件和文件夹的权限。有人有任何想法吗?我不必使用该目录,但不知道为什么会失败令人沮丧。
这是一段测试代码。RemoteFile 只是 sftpChannel 的包装器,因此我可以检查文件/目录是否存在并在必要时删除文件或创建目录:
String file = "/u01/apps/tpms/applstg2/ken_test/TestFile";
String destDir = "/usr/local/jboss/server/applstg2/backup/"; // Caused by: 4: Failure
//String destDir = "/u01/apps/tpms/applstg2/ken_test/backup/"; // Success
RemoteFile remoteFile = new RemoteFile(file, ssh.openSftpChannel());
remoteFile.rename(destDir + "/TestFile");
Run Code Online (Sandbox Code Playgroud)
这是失败的行:
sftpChannel.rename(file, newName);
Run Code Online (Sandbox Code Playgroud)
这是跟踪(我删除了所有 JUnit 和 sun.reflect 跟踪):
Error renaming file /u01/apps/tpms/applstg2/ken_test/TestFile to /usr/local/jboss/server/applstg2/backup//TestFile
at com.framework.remote.RemoteFile.rename(RemoteFile.java:82)
at com.framework.remote.RemoteFileTest.renameFile(RemoteFileTest.java:56)
Caused by: 4: Failure
at com.jcraft.jsch.ChannelSftp.throwStatusError(ChannelSftp.java:2846)
at com.jcraft.jsch.ChannelSftp.rename(ChannelSftp.java:1923)
at com.framework.remote.RemoteFile.rename(RemoteFile.java:79)
Run Code Online (Sandbox Code Playgroud)
权限:
drwxrwxr-x 2 applstg2 applstg2 4096 May 2 22:09 ken_test
-rw-rw-r-- 1 applstg2 applstg2 61595086 …Run Code Online (Sandbox Code Playgroud) jsch ×10
java ×7
ssh ×5
sftp ×4
android ×1
cryptography ×1
encryption ×1
exec ×1
file-move ×1
file-rename ×1
nohup ×1
shell ×1
unix ×1