我知道有重复的>>>从副本>>>复制;只要您的本地计算机有运行的SSH服务器<<<<<<但是我无法发表评论,也不能从问题中得出(而且我没有提供答案......)
它声明“只要您的本地计算机运行SSH服务器”,但我不知道如何运行SSh服务器。我打开我的腻子(双击它)(不确定这是否意味着SSH(?Putty?)服务器(?)正在运行......怀疑......
我是套接字编程的新手。我正在使用JSch(http://www.jcraft.com/jsch/)尝试连接到远程服务器(后期阶段) 目前,这是我使用的代码,我试图连接到我的本地计算机并执行命令(确切地说是ls)来进行测试。但是,我一直拒绝连接。我用谷歌搜索,我注意到有一些文章提到“有服务器监听”,但我不知道它意味着什么。请查看我的代码如下。
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Properties;
import com.jcraft.jsch.*;
class SwingWorkerExample {
JTextField hostField;
JTextField userNameField;
JTextField passwordField;
JPanel panel;
public SwingWorkerExample() {
JPanel p = panel = new JPanel(new GridLayout(0,2));
hostField = new JTextField(20);
userNameField = new JTextField(20);
passwordField = new JPasswordField(20);
JButton testButton = new JButton("connect!");
testButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
testConnectionButtonActionPerformed(ev);
}
});
p.add(new JLabel("host:"));
//127.0.0.1
p.add(hostField);
p.add(new JLabel("user:"));
//mycomputerusername
p.add(userNameField);
p.add(new JLabel("password:"));
//mycomputerpassword
p.add(passwordField);
p.add(testButton);
}
public JPanel getPanel() {
return panel;
}
private void testConnectionButtonActionPerformed(ActionEvent evt) {
SwingWorker sw = new SwingWorker(){
protected Object doInBackground() throws Exception {
try {
JSch jsch = new JSch();
String host = hostField.getText();
String username = userNameField.getText();
String password = passwordField.getText();
Session session = jsch.getSession(username, host);
session.setPassword(password);
session.setConfig("StrictHostKeyChecking", "no");
session.setTimeout(20000);
System.out.println("Connecting to server...");
session.connect();
return session;
}
catch(Exception ex) {
ex.printStackTrace();
throw ex;
}
}
public void done(){
try {
System.out.println(get());
} catch (Exception ex) {
ex.printStackTrace();
}
}
};
sw.execute();
}
public static void main(String[] egal) {
EventQueue.invokeLater(new Runnable(){public void run() {
SwingWorkerExample ex = new SwingWorkerExample();
JFrame f = new JFrame("bla");
f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
f.setContentPane(ex.getPanel());
f.pack();
f.setVisible(true);
}});
}
public void remoteLs() throws JSchException, IOException {
JSch js = new JSch();
Session s = js.getSession("kellyseo", "192.168.0.103", 22);
s.setPassword("S9031808z");
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
s.setConfig(config);
s.connect();
Channel c = s.openChannel("exec");
ChannelExec ce = (ChannelExec) c;
ce.setCommand("ls -l");
ce.setErrStream(System.err);
ce.connect();
BufferedReader reader = new BufferedReader(new InputStreamReader(ce.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
ce.disconnect();
s.disconnect();
System.out.println("Exit code: " + ce.getExitStatus());
}
public void remoteMkdir() throws JSchException, IOException {
JSch js = new JSch();
Session s = js.getSession("myusername", "myremotemachine.mycompany.com", 22);
s.setPassword("mypassword");
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
s.setConfig(config);
s.connect();
Channel c = s.openChannel("exec");
ChannelExec ce = (ChannelExec) c;
ce.setCommand("mkdir remotetestdir");
ce.setErrStream(System.err);
ce.connect();
BufferedReader reader = new BufferedReader(new InputStreamReader(ce.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
ce.disconnect();
s.disconnect();
System.out.println("Exit code: " + ce.getExitStatus());
}
public void remoteCopy() throws JSchException, IOException, SftpException {
JSch js = new JSch();
Session s = js.getSession("myusername", "myremotemachine.mycompany.com", 22);
s.setPassword("mypassword");
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
s.setConfig(config);
s.connect();
Channel c = s.openChannel("sftp");
ChannelSftp ce = (ChannelSftp) c;
ce.connect();
ce.put("/home/myuser/test.txt","test.txt");
ce.disconnect();
s.disconnect();
}
}
BTW我使用命令提示ping 127.0.0.1没关系,但是如果我使用telnet 127.0.0.1它说无法打开与主机的连接(我打开putty(?双击?),在端口23上:连接失败。 而且,SSH = PUTTY ......对吗? (我不能在命令提示符中使用'ssh'命令)
链接: 1)http://sourceforge.net/p/jsch/mailman/message/31745775/
和2)http://javarevisited.blogspot.sg/2013/02/java-net-ConnectException-Connection-refused.html
和3)http://www.jcraft.com/jsch/examples/ 和4)Run a command over SSH with JSch 和5)Can we use JSch for SSH key-based communication?
和...谢谢是提前!!
哦,还有theres http://www.ganymed.ethz.ch/ssh2/(JSch的替代品......任何建议都欢迎!)但是当我尝试运行这个例子时,它说没有主要的。哪个..我duno>。<在那之前会坚持使用JSch ....
BTW,我为服务器尝试https://serverfault.com/questions/185153/free-public-ssh-server-for-testing-purposes但是...我不知道地址,用户名和密码是什么。 (我还有一个http://sdf.org帐户新创建,但当我尝试连接到它时,它会显示unknownhost.fyi!)
忘了提,我使用的是Windows 7,而'yum'在我的命令提示符中不是命令...
答案 0 :(得分:5)
您尝试通过SSH协议连接到本地主机。对于JSCH,这不完全是套接字编程,但是你的问题与套接字编程有关。
基本上你的问题是你的程序试图连接到一个没有打开的端口,特别是在这个实例的端口22.你没有SSH服务器所以你的SSH客户无能为力。您正在给没有电话的人打电话。
要解决此问题,您需要找到一个运行ssh的测试服务器,以便在本地PC上进行开发或安装ssh服务器。对于Windows框,最好的选择是cygwin,这将允许您模拟posix系统并在本地计算机上运行SSHD。谷歌搜索cygwin和sshd将为您提供如何设置它的示例。
答案 1 :(得分:0)
我不知道为什么但是我可以将putty添加到我自己的localhost之后,虽然上面(示例代码,并且感谢您提供代码)我面临错误但是以下代码(再次感谢您提供代码这段代码来自JCraft,如果我不混淆,可以工作!我设法发送命令'help')。非常感谢#chris midolo提供答案和#Robby Cornelissen评论......虽然我变得更加困惑(所以...... SSH意味着服务器和客户端(?)叹息......我虽然远程访问意味着只要我的计算机打开,我就可以从其他地方访问它...所以我的计算机,为了从其他地方访问,也必须有某种服务器运行...天啊!我的头疼...... )
请注意,除了使用其他命令的'help',将导致'无法在远程系统上执行命令或shell:执行失败的过程。根据{{3}},您需要使用 cmd /c dir
并执行我的bat文件,我需要使用C:\ Users \ kellyseo \ sampling.bat(如果我只使用sampling.bat,它会显示错误)
我的批处理文件内容如下:
ECHO RUNNING kellyseo SAMPLING.BAT
@ECHO OFF
CD C:\Users\kellyseo\Desktop
set ldt=kellyseo folder version executed on %date% %time%
echo %ldt%>> logs.txt
EXIT
我实际上有两个版本的同一个文件(一个我放在桌面上)然后我只能使用'sampling.bat'
如果你不喜欢很多提示,除了删除提示之外,如果你面对这个 com.jcraft.jsch.JSchException:UnknownHostKey ,你可能还需要以下代码(感谢{{ 3}})
session.setPassword(password);
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
**注意:#1提示=输入密码。 #2 prompt =输入命令。用户名是'user1'
/* -*-mode:java; c-basic-offset:2; indent-tabs-mode:nil -*- */
/**
* This program will demonstrate remote exec.
* $ CLASSPATH=.:../build javac Exec.java
* $ CLASSPATH=.:../build java Exec
* You will be asked username, hostname, displayname, passwd and command.
* If everything works fine, given command will be invoked
* on the remote side and outputs will be printed out.
*
*/
import com.jcraft.jsch.*;
import java.awt.*;
import javax.swing.*;
import java.io.*;
public class Exec{
public static void main(String[] arg){
try{
JSch jsch=new JSch();
/*
String host=null;
if(arg.length>0){
host=arg[0];
}
else{
host=JOptionPane.showInputDialog("Enter username@hostname",
System.getProperty("user.name")+
"@localhost");
}
String user=host.substring(0, host.indexOf('@'));
host=host.substring(host.indexOf('@')+1);
*/
String user1 = "user1";
String host1 = "127.0.0.1";
Session session=jsch.getSession(user1, host1, 22);
/*
String xhost="127.0.0.1";
int xport=0;
String display=JOptionPane.showInputDialog("Enter display name",
xhost+":"+xport);
xhost=display.substring(0, display.indexOf(':'));
xport=Integer.parseInt(display.substring(display.indexOf(':')+1));
session.setX11Host(xhost);
session.setX11Port(xport+6000);
*/
// username and password will be given via UserInfo interface.
UserInfo ui=new MyUserInfo();
session.setUserInfo(ui);
session.connect();
String command=JOptionPane.showInputDialog("Enter command",
"set|grep SSH");
Channel channel=session.openChannel("exec");
((ChannelExec)channel).setCommand(command);
// X Forwarding
// channel.setXForwarding(true);
//channel.setInputStream(System.in);
channel.setInputStream(null);
//channel.setOutputStream(System.out);
//FileOutputStream fos=new FileOutputStream("/tmp/stderr");
//((ChannelExec)channel).setErrStream(fos);
((ChannelExec)channel).setErrStream(System.err);
InputStream in=channel.getInputStream();
channel.connect();
byte[] tmp=new byte[1024];
while(true){
while(in.available()>0){
int i=in.read(tmp, 0, 1024);
if(i<0)break;
System.out.print(new String(tmp, 0, i));
}
if(channel.isClosed()){
if(in.available()>0) continue;
System.out.println("exit-status: "+channel.getExitStatus());
break;
}
try{Thread.sleep(1000);}catch(Exception ee){}
}
channel.disconnect();
session.disconnect();
}
catch(Exception e){
System.out.println(e);
}
}
public static class MyUserInfo 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
}
}
}
}
答案 2 :(得分:0)
如果您使用的是Mac,则可能无法远程登录服务器(在本例中为您的计算机)。转到系统偏好设置 - &gt;共享并启用远程登录。还要添加您要使用的用户。