我搜索在一台PC和一台服务器之间建立连接。此连接必须通过Java应用程序完成。因此,我使用JSCH与SCP协议建立SSH连接。
我设法建立了连接,但无法传输文件。
import com.jcraft.jsch.*;
import java.awt.*;
import java.io.FileNotFoundException;
import java.io.IOException;
import javax.swing.*;
public class Logger {
public static void main(String[] arg) throws FileNotFoundException, IOException {
try {
JSch.setLogger(new MyLogger());
JSch jsch = new JSch();
Session session = jsch.getSession("*****", "***.***.***.***", 22);
// username and password will be given via UserInfo interface.
UserInfo ui = new MyUserInfo();
session.setUserInfo(ui);
session.connect();
Channel channel = session.openChannel("exec");
channel.connect();
channel.disconnect();
session.disconnect();
} catch (JSchException e) {
System.out.println(e);
}
}
public static class MyLogger implements com.jcraft.jsch.Logger {
static java.util.Hashtable name = new java.util.Hashtable();
static {
name.put(new Integer(DEBUG), "DEBUG: ");
name.put(new Integer(INFO), "INFO: ");
name.put(new Integer(WARN), "WARN: ");
name.put(new Integer(ERROR), "ERROR: ");
name.put(new Integer(FATAL), "FATAL: ");
}
@Override
public boolean isEnabled(int level) {
return true;
}
@Override
public void log(int level, String message) {
System.err.print(name.get(level));
System.err.println(message);
}
}
public static class MyUserInfo implements UserInfo, UIKeyboardInteractive {
@Override
public String getPassword() {
return passwd;
}
@Override
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);
@Override
public String getPassphrase() {
return null;
}
@Override
public boolean promptPassphrase(String message) {
return true;
}
@Override
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;
}
}
@Override
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;
@Override
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
}
}
}
}
我在JSCH的站点网络中找到了更多示例,但是我不理解不同示例的工作方式。 (http://www.jcraft.com/jsch/examples/ScpTo.java.html)
所以,我继续搜索,我也找到了这个程序:
channel.put(from, fileName);
但是我认为该程序用于SFTP,而不用于SCP。
我也尝试这种方法:
String command6 = "scp Source Destination";
try {
JSch.setLogger(new MyLogger());
JSch jsch = new JSch();
Session session = jsch.getSession("****", "***.***.***.***", 22);
// username and password will be given via UserInfo interface.
UserInfo ui = new MyUserInfo();
session.setUserInfo(ui);
session.connect();
Channel channel = session.openChannel("exec");
((ChannelExec) channel).setCommand(command6);
channel.connect();
channel.disconnect();
session.disconnect();
但是她不工作... 请帮帮我!