- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在开发一个 Java 应用程序,它应该向我们的远程计算机发送一个特定文件。我正在使用 Jsch 库,并遵循网站 @ ( http://www.jcraft.com/jsch/examples/ScpTo.java) 中的 ScpTo.java 示例
但是,scp 命令在应用程序中很难执行,因此我尝试使用 Cygwin 在我的终端中的应用程序外部手动运行 SCP 命令。
我的命令是这样的:
scp -t /home/user/test.csv
C0644 197171 C:\Users\user\Documents\test.csv
命令的输出为:
C:\Users\user\Documents\test.csv 0% 0 0.0KB/s - stalled -
这就是它似乎所做的全部。现在我想这可能是防火墙问题,所以我尝试了其他几台远程机器,他们仍然给我同样的问题。
关于如何处理此类问题的任何想法?
非常感谢,
乔
编辑:这是 Java 代码:
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.UIKeyboardInteractive;
import com.jcraft.jsch.UserInfo;
class HPCConnector
{
private static String username = "username";
private static String host = "host.edu";
JSch jsch;
Session session;
UserInfo ui;
public HPCConnector() throws JSchException
{
jsch = new JSch();
session = jsch.getSession(username, host, 22);
ui = new HPCUserInfo();
session.setUserInfo(ui);
}
public boolean validateConnection()
{
boolean status = true;
try {
session.connect();
if (status)
return status;
} catch (JSchException e) {
e.printStackTrace();
status = false;
}
return status;
}
public static class HPCUserInfo implements UserInfo, UIKeyboardInteractive
{
public String getPassword(){ return passwd; }
public boolean promptYesNo(String str)
{
Object[] options={ "Yes", "No" };
int foo=JOptionPane.showOptionDialog(null, str,"Warning", JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE,null, options, options[0]);
return foo==0;
}
String passwd;
JTextField passwordField=(JTextField)new JPasswordField(20);
public String getPassphrase(){ return null; }
public boolean promptPassphrase(String message){ return true; }
public boolean promptPassword(String message)
{
Object[] ob={passwordField};
int result=
JOptionPane.showConfirmDialog(null, ob, message,
JOptionPane.OK_CANCEL_OPTION);
if(result==JOptionPane.OK_OPTION)
{
passwd=passwordField.getText();
return true;
}
else{ return false; }
}
public void showMessage(String message)
{
JOptionPane.showMessageDialog(null, message);
}
final GridBagConstraints gbc = new GridBagConstraints(0,0,1,1,1,1,GridBagConstraints.NORTHWEST,GridBagConstraints.NONE,new Insets(0,0,0,0),0,0);
private Container panel;
public String[] promptKeyboardInteractive(String destination,String name,String instruction,String[] prompt,boolean[] echo)
{
panel = new JPanel();
panel.setLayout(new GridBagLayout());
gbc.weightx = 1.0;
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.gridx = 0;
panel.add(new JLabel(instruction), gbc);
gbc.gridy++;
gbc.gridwidth = GridBagConstraints.RELATIVE;
JTextField[] texts=new JTextField[prompt.length];
for(int i=0; i<prompt.length; i++)
{
gbc.fill = GridBagConstraints.NONE;
gbc.gridx = 0;
gbc.weightx = 1;
panel.add(new JLabel(prompt[i]),gbc);
gbc.gridx = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weighty = 1;
if(echo[i])
{
texts[i]=new JTextField(20);
}
else
{
texts[i]=new JPasswordField(20);
}
panel.add(texts[i], gbc);
gbc.gridy++;
}
if(JOptionPane.showConfirmDialog(null, panel, destination+": "+name,JOptionPane.OK_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE) ==JOptionPane.OK_OPTION)
{
String[] response=new String[prompt.length];
for(int i=0; i<prompt.length; i++)
{
response[i]=texts[i].getText();
}
return response;
}
else
{
return null; // cancel
}
}
}
public void transferToHPC(File spreadsheet) throws JSchException
{
OutputStream out = null;
InputStream in = null;
String command = "scp -t /home/user/" + spreadsheet.getName();
Channel channel = session.openChannel("exec");
((ChannelExec)channel).setCommand(command);
try{
out = channel.getOutputStream();
in = channel.getInputStream();
} catch (IOException ex) {
ex.printStackTrace();
}
System.out.println(command);
long fileSize= spreadsheet.length();
channel.connect();
command = "C0644 " + fileSize + " " + spreadsheet.getAbsolutePath() + "\n";
try {
if(checkAck(in)!=0){
System.exit(0);
}
out.write(command.getBytes());
out.flush();
FileInputStream fis = new FileInputStream(spreadsheet);
byte[] buffer = new byte[1024];
while (true)
{
int length = fis.read(buffer, 0, buffer.length);
if (length <= 0)
break;
out.write(buffer, 0, 1);
}
fis.close();
fis = null;
System.out.println(command);
buffer[0] = 0;
out.write(buffer, 0, 1);
out.flush();
out.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
channel.disconnect();
session.disconnect();
}
static int checkAck(InputStream in) throws IOException{
int b=in.read();
// b may be 0 for success,
// 1 for error,
// 2 for fatal error,
// -1
if(b==0) return b;
if(b==-1) return b;
if(b==1 || b==2){
StringBuffer sb=new StringBuffer();
int c;
do {
c=in.read();
sb.append((char)c);
}
while(c!='\n');
if(b==1){ // error
System.out.print(sb.toString());
}
if(b==2){ // fatal error
System.out.print(sb.toString());
}
}
return b;
}
}
EDIT2:控制台上没有出现异常,给我带来麻烦的主要功能是 transferToHPC(File spreadsheet)
EDIT3:好吧,我终于放弃了;能够使用 JSch 的 Sftp 类并且它按我预期的方式工作。
我做了更多阅读并阅读了 Kenster 的回答,我想我应该将 -t 标志留给 scp 内部处理:)谢谢大家!!
最佳答案
我的理解正确吗?您手动运行了 scp -t
命令并输入了 C0644
行,然后您收到了 stalling
消息?这并不表示有任何问题。
scp -t
通常是 scp
传输的接收端。它由另一个 scp
实例启动,该实例将文件发送到接收端。发送 scp
实例启动接收器,发送 C
行来标记文件即将到来,然后发送文件的数据。
您所做的是手动和交互地启动一个接收器,并向它发送一个 C
行,指示一个文件即将到来。之后,接收方期望读取文件的数据。由于您没有发送任何文件数据,接收方最终打印了一条状态消息,指示传输已停止。
唯一的问题是人类通常不会直接运行 scp -t
。 scp
程序在这些情况下的工作方式完全符合您的预期。
关于java - -t 标志 ("- stalling -"的 SCP 问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23637594/
我正在测试新的 zgc包含在 java 中的垃圾收集器11 因为它 promise 非常低的延迟。我们的应用程序是一个实时服务,每秒创建和销毁许多对象,它使用 akka 在多线程环境中完成。 . 启用
自从我升级到新的 MBP 后,我在 R 中收到以下警告。当我启动应用程序并以奇怪的间隔重新出现时,会出现警告。 2016-12-06 15:05:02.067 R[87426:4480089] IMK
假设我有一个具有定义的宽度和高度的视口(viewport)。我克隆了右侧 View 之外的一个元素,然后随机将其飞过视口(viewport) y位置代码如下: ... .css({
当我运行 heroku pg:psql 我得到 --> Connecting to postgresql-cylindrical-38664 并停滞不前。一切看起来都很好,只是卡住了,什么也没做。 最
我正在 Google Chrome 上使用 HTML5 视频标签编写视频播放器:我需要显示一些视频 (1),然后将它们从 DOM 文档中删除以显示其他视频,稍后再次创建一些指向相同视频标签的视频标签文
我在 FastCGI 模式下运行带有 HHVM 3.5.0 的 NGINX 1.2.1。 正如标题所说,在我执行以下操作后,Chrome 会“暂停”请求很长时间: 打开我的网站(只需大约 1.5 秒)
我正在与Tokio一起运行一款铁锈应用程序。在上一个版本中,我有一个错误,一些请求导致我的代码进入无限循环。。发生的情况是,当进入循环的任务陷入停滞时,所有其他任务继续正常工作并处理请求,直到停止任务
我开始注意到发送到我们的应用程序服务器的 post 请求在浏览器端停滞了大约 7 秒,没有明显的原因。 环境: Angular 1.4 Play Framework Chrome 64。* 服务器发送
在我的智能电视应用程序中,我通过跨域请求使用 SoundCloud API - $.getJSON() 等 该应用程序还在 100% HTML5 模式(无 Flash)上使用 SoundManager
我在 chrome 中有以下网络登录: 里面有一件事我不明白:实心灰条和透明灰条有什么区别。 最佳答案 Google 在 Evaluating network performance 中对这些字段进行
我正在开发一个 Java 应用程序,它应该向我们的远程计算机发送一个特定文件。我正在使用 Jsch 库,并遵循网站 @ ( http://www.jcraft.com/jsch/examples/Sc
我正在尝试编写一个使用 [SoundManager 2][1] api 的 javascript 应用程序并旨在运行所有桌面和移动浏览器。在 iPad 平台上,Soundmanager 使用 HTML
我正在使用 Spring Boot 创建一个 Spring Integration 原型(prototype)。 我有一个“集线器”,它接受控制台输入并将其发送到单独的套接字/tcp 应用程序。 tc
在尝试发送 mp3 数据时,我们遇到了一个非常烦人的错误。我们有以下设置。 网络摄像头生成 aac -> ffmpeg 转换为 adts -> 发送到 nodejs 服务器 -> 服务器上的 ffmp
我的 Emacs(Windows 10 64 位下的 GNU Emacs 25.1.1 (x86_64-w64-mingw32))变得非常缓慢和不稳定,尤其是在 Org 模式下,例如可能会暂停 2 秒
我对此非常陌生,所以如果我问的是一个愚蠢的问题,我提前道歉。此外,如果可能的话,最可取的是一个非常简单的答案。 使用 mac osx 10.8.4,安装了 PostgreSQL 9.2.4 和带有自制
我正在尝试解决 Google CodeJam 2017 "Bathroom Stalls" problem C - 链接中提供了解决方案,下面我的 C# 代码在 small1 和 2 集上运行良好。大
运行 perf stat ls 显示: Performance counter stats for 'ls': 1.388670 task-clock
我制作、训练并保存了一个简单的 tf.keras 模型。然后,我通过 Flask、redis 和 rq 设置了一个基于任务的基本 API。 它的工作原理基本上是这样的: 使用输入调用 api 任务(使
我试图了解如何衡量性能并决定编写非常简单的程序: section .text global _start _start: mov rax, 60 syscall 然后我用 pe
我是一名优秀的程序员,十分优秀!