【发布时间】:2011-06-23 16:44:36
【问题描述】:
由于某种原因,我需要连接到防火墙(基于 Linux)并使用 Java 添加一些规则。
用google搜索了一阵子,发现jsch是我最好的选择。但是当我
使用它执行命令,例如,显示主机名,返回错误。如果我
执行“ls -l”和“whoami”之类的命令,结果还可以。也就是说,我只能
连接到 Bash Shell!我的问题是如何连接到防火墙 shell?
我的测试代码如下:
import java.io.InputStream;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.UserInfo;
public class SSHDemo {
public static void main(String[] args) {
SSHDemo t = new SSHDemo();
try {
t.go();
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void go() throws Exception {
String host = "10.4.44.192";
String user = "root";
String password = "root";
int port = 22;
// int tunnelLocalPort = 9080;
// String tunnelRemoteHost = "10.4.44.192";
// int tunnelRemotePort = 8000;
JSch jsch = new JSch();
Session session = jsch.getSession(user, host, port);
session.setPassword(password);
localUserInfo lui = new localUserInfo();
session.setUserInfo(lui);
session.connect();
ChannelExec channel = (ChannelExec)session.openChannel("exec");
channel.setInputStream(null);
//Pay attension to this line
channel.setCommand("show hostname");
channel.setErrStream(System.err);
channel.connect();
InputStream in=channel.getInputStream();
int i=0;
byte[] tmp=new byte[1024*1024];
while ((i = in.read(tmp, 0, tmp.length)) != -1) {
System.out.write(tmp, 0, i);
}
in.close();
channel.disconnect();
session.disconnect();
// session.setPortForwardingL(tunnelLocalPort,tunnelRemoteHost,tunnelRemotePort);
System.out.println("Connected");
}
class localUserInfo implements UserInfo {
String passwd;
public String getPassword() {
return passwd;
}
public boolean promptYesNo(String str) {
return true;
}
public String getPassphrase() {
return null;
}
public boolean promptPassphrase(String message) {
return true;
}
public boolean promptPassword(String message) {
return true;
}
public void showMessage(String message) {
}
}
}
【问题讨论】:
-
如何使用普通 ssh 连接到防火墙外壳?
-
只要使用putty或者ssh,你就会得到防火墙shell