SSH経由でログインするプログラムを作成しました。このサーバーは、"Destination: " というメッセージが表示されたときに、市外局番と 3 桁の電話番号を提供する必要があるという追加の手順を実行します。したがって、私がやろうとしているのは、端末に Destination: プロンプトを待機させ、6 桁の数字を入力してから、結果のプロンプトを見て、expect コードを実行する前にどこに行ったかを確認することです。Destination: プロンプトの後には 5 つのターミナル タイプが考えられます。つまり、正規表現を使用して 6 桁の電話番号を指定した後、返されるストリームをテストする必要があります。
私が立ち往生しているのは、宛先を取得するための最良の方法を考え出すことです: プロンプト、数字を送信し、結果のコードを取得して正規表現と if then ステートメントを実行し、それをいくつかのクラスの 1 つに渡します。その時点からexpect4jを使用して実行するようにします。期待に移る前に実行シェルを使用する必要がありますか?もしそうなら、正規表現を実行するためにそこから入力を取得するにはどうすればよいですか? expect.expect ("Destination: "); を送信する必要がありますか? 次に、expect.send ("123456"); が続き、正規表現を実行するための入力を取得します。そうであれば、どのように入力を取得しますか? (私のコード例では、execute メソッドから情報を取得するバッファーを使用していますが、それがどのように機能するのか完全には理解できません) または、最後のオプションとして、コード例の 2 つのインスタンスをビルドする必要があります。セッションと ssh チャネル、
要するに: 私が知る限り、これらは私の 3 つのオプションです: exec シェルを実行する、より複雑なリストの構築などに入る前に単一の expect.expect と expect.send を実行する、または 2 つのリストを expect メソッドで実行する、1 つです。他の後。どちらに行けばいいのか、入力を元に戻して正規表現を実行する方法がわからない。
5 つの端末オプションの 1 つにログインし、調べて、切断することができました。最近では、ログインして数字を入力し、結果のコードを正規表現で読み取って、5 つのオプションのどれを示すかを示すコードを作成しました。タイプです。私は彼らを一緒に働かせることができません。
私のコードはhttp://nikunjp.wordpress.com/2011/07/30/remote-ssh-using-jsch-with-expect4j/にある例から構築されています
package switchoverlay;
import com.jcraft.jsch.ChannelShell;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import expect4j.Closure;
import expect4j.Expect4j;
import expect4j.ExpectState;
import expect4j.matches.Match;
import expect4j.matches.RegExpMatch;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.oro.text.regex.MalformedPatternException;
public class SSHLogin {
static final String controlB = "\u0002";
static final String controlC = "\u0003";
static final String controlV = "\u0016";
static final String cr = "\u0013";
static final String lf = "\u0010";
static final String sp = "\u0032";
String npa = OverlayGUI.tn.substring(1, 4); //Get first three digits from tn
String nxx = OverlayGUI.tn.substring(5, 8); //Get first three digits from tn
String xxxx = OverlayGUI.tn.substring(9, 13); //Get last four digits from tn
private static final int COMMAND_EXECUTION_SUCCESS_OPCODE = -2;
private static String ENTER_CHARACTER = "\r"; //NOT GOOD FOR A GTD5!
private static final int SSH_PORT = 22;
private List<String> loginLstCmds = new ArrayList<String>();
private static String[] switchPromptRegEx = new String[]
{"\r\nDestination: ", //npanxx
"via.{12}\r\n"}; //controlB
private Expect4j expect = null;
private StringBuilder loginBuffer = new StringBuilder();
private String userName;
private String password;
private String host;
/**
*
* @param host
* @param userName
* @param password
*/
public SSHLogin(String host, String userName, String password) {
this.host = host;
this.userName = userName;
this.password = password;
}
/**
*
* @param LoginCmdsToExecute
*/
public String execute(List<String> LoginCmdsToExecute) {
this.loginLstCmds = LoginCmdsToExecute;
Closure closure = new Closure() {
public void run(ExpectState expectState) throws Exception {
loginBuffer.append(expectState.getBuffer());
}
};
List<Match> lstPattern = new ArrayList<Match>();
for (String regexElement : switchPromptRegEx) {
try {
Match mat = new RegExpMatch(regexElement, closure);
lstPattern.add(mat);
} catch (MalformedPatternException e) {
e.printStackTrace();
} catch(Exception e) {
e.printStackTrace();
}
}
try {
expect = SSH();
boolean isSuccess = true;
for(String strCmd : loginLstCmds) {
isSuccess = isSuccess(lstPattern,strCmd);
if (!isSuccess) {
isSuccess = isSuccess(lstPattern,strCmd);
}
}
checkResult(expect.expect(lstPattern));
} catch (Exception ex) {
ex.printStackTrace();
} finally {
testType();
}
return loginBuffer.toString();
}
/**
*
* @param objPattern
* @param strCommandPattern
* @return
*/
private boolean isSuccess(List<Match> objPattern,String strCommandPattern) {
try {
boolean isFailed = checkResult(expect.expect(objPattern));
if (!isFailed) {
expect.send(strCommandPattern);
Thread.sleep( 8000);
//expect.send(ENTER_CHARACTER); //NOT GOOD FOR A GTD5!
return true;
}
return false;
} catch (MalformedPatternException ex) {
ex.printStackTrace();
return false;
} catch (Exception ex) {
ex.printStackTrace();
return false;
}
}
/**
*
* @param hostname
* @param username
* @param password
* @param port
* @return
* @throws Exception
*/
private Expect4j SSH() throws Exception {
JSch jsch = new JSch();
Session session = jsch.getSession(userName, host, SSH_PORT);
if (password != null) {
session.setPassword(password);
}
Hashtable<String,String> config = new Hashtable<String,String>();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect(120000);
ChannelShell channel = (ChannelShell) session.openChannel("shell");
channel.connect();
Expect4j expect = new Expect4j(channel.getInputStream(), channel.getOutputStream());
return expect;
}
/**
*
* @param intRetVal
* @return
*/
private boolean checkResult(int intRetVal) {
if (intRetVal == COMMAND_EXECUTION_SUCCESS_OPCODE) {
return true;
}
return false;
}
/**
*
*/
private void testType() {
String lBString = loginBuffer.toString();
System.out.println(lBString);
Pattern gtd5 = Pattern.compile(".*GTD5.*");
Matcher gtd5Matcher = gtd5.matcher(lBString);
if (gtd5Matcher.find()) {
System.out.println("Your switch type is GTD5");
}
Pattern dms10 = Pattern.compile(".*DMS10^0.*");
Matcher dms10Matcher = dms10.matcher(lBString);
if (dms10Matcher.find()) {
System.out.println("Your switch type is DMS10");
}
Pattern dms100 = Pattern.compile(".*DMS100.*");
Matcher dms100Matcher = dms100.matcher(lBString);
if (dms100Matcher.find()) {
System.out.println("Your switch type is DMS100");
}
Pattern ess = Pattern.compile(".*5es.*");
Matcher essMatcher = ess.matcher(lBString);
if (essMatcher.find()) {
System.out.println("Your switch type is 5ESS");
}
Pattern dco = Pattern.compile(".*DCO.*");
Matcher dcoMatcher = dco.matcher(lBString);
if (dcoMatcher.find()) {
System.out.println("Your switch type is DCO");
}
//else { System.out.println("Switch type Error."); }
//SSHGTD5ExamClient runSsh = new SSHGTD5ExamClient(); //pass on to expect4j based on regex for remaining expect and sends?
//if (expect!=null) { //old code for shutting down expect4j
//expect.close();
}
}