javaはリモートサーバのshellスクリプトを呼び出し、停止する方法で実現します。
最近需要を迎えました。遠隔でshellのシナリオを調整するように要求しました。聞き間違えませんでした。一言で言えば、私達は誰ですか?私達は優れた開発選手です。再三考慮して、二つの実現方法があります。
シナリオのサーバーはクライアントをインストールして、つまり自分で書いた小さいプログラムをポートを通してターゲットサーバのプログラムを調整して、プログラムは本機の上のshellスクリプトを調整します。
利点:ポートで呼び出すと、ユーザーはサーバのアカウントパスワードを暴露しなくても大丈夫です。安全性が高いです。
欠点:私達はずっとこのクライアントのプログラムを維持しなければならなくて、その上すべてのサーバーにアクセスして、すべてこのクライアントをインストールしなければなりません。
シナリオ2:ローカルは直接IPを通して、サーバーのアカウントのパスワードはリモートサーバーのshellスクリプトを調整します。
利点:コードは開発しやすく、拡張時はサービスエンドコードだけを拡張すればいいです。
短所:ユーザーサーバのアカウントのパスワードはサーバーに暴露されます。パスワードの安全問題です。
各方案の長所と短所をリーダーに報告して、リーダーは第二種類によって言います。
さあ!ドライ、無駄話は多く言わないで、直接コードを入れます。
プログラムの導入に必要なパッケージ:
シナリオのサーバーはクライアントをインストールして、つまり自分で書いた小さいプログラムをポートを通してターゲットサーバのプログラムを調整して、プログラムは本機の上のshellスクリプトを調整します。
利点:ポートで呼び出すと、ユーザーはサーバのアカウントパスワードを暴露しなくても大丈夫です。安全性が高いです。
欠点:私達はずっとこのクライアントのプログラムを維持しなければならなくて、その上すべてのサーバーにアクセスして、すべてこのクライアントをインストールしなければなりません。
シナリオ2:ローカルは直接IPを通して、サーバーのアカウントのパスワードはリモートサーバーのshellスクリプトを調整します。
利点:コードは開発しやすく、拡張時はサービスエンドコードだけを拡張すればいいです。
短所:ユーザーサーバのアカウントのパスワードはサーバーに暴露されます。パスワードの安全問題です。
各方案の長所と短所をリーダーに報告して、リーダーは第二種類によって言います。
さあ!ドライ、無駄話は多く言わないで、直接コードを入れます。
プログラムの導入に必要なパッケージ:
<dependency>
<groupId>org.jvnet.hudson</groupId>
<artifactId>ganymed-ssh2</artifactId>
<version>build210-hudson-1</version>
</dependency>
プログラム関連のデモ:
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import org.apache.commons.io.IOUtils;
import ch.ethz.ssh2.ChannelCondition;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;
public class RemoteShellExecutor {
private Connection conn;
/** IP */
private String ip;
/** */
private String osUsername;
/** */
private String password;
private String charset = Charset.defaultCharset().toString();
private final String GET_SHELL_PID = "ps -ef | grep '%s' | grep -v grep |awk '{print $2}'";
private final String KILL_SHELL_PID = "kill -15 %s";
private static final int TIME_OUT = 1000 * 5 * 60;
/**
*
* @param ip
* @param usr
* @param pasword
*/
public RemoteShellExecutor(String ip, String usr, String pasword) {
this.ip = ip;
this.osUsername = usr;
this.password = pasword;
}
/**
*
* @return
* @throws IOException
*/
private boolean login() throws IOException {
conn = new Connection(ip);
conn.connect();
return conn.authenticateWithPassword(osUsername, password);
}
/**
*
*
* @param cmds
* @return
* @throws Exception
*/
public ExecuteResultVO exec(String cmds) throws Exception {
InputStream stdOut = null;
InputStream stdErr = null;
ExecuteResultVO executeResultVO = new ExecuteResultVO();
String outStr = "";
String outErr = "";
int ret = -1;
try {
if (login()) {
// Open a new {@link Session} on this connection
Session session = conn.openSession();
// Execute a command on the remote machine.
session.execCommand(cmds);
stdOut = new StreamGobbler(session.getStdout());
outStr = processStream(stdOut, charset);
stdErr = new StreamGobbler(session.getStderr());
outErr = processStream(stdErr, charset);
session.waitForCondition(ChannelCondition.EXIT_STATUS, TIME_OUT);
System.out.println("outStr=" + outStr);
System.out.println("outErr=" + outErr);
ret = session.getExitStatus();
executeResultVO.setOutStr(outStr);
executeResultVO.setOutErr(outErr);
} else {
throw new Exception(" " + ip); //
}
} finally {
if (conn != null) {
conn.close();
}
IOUtils.closeQuietly(stdOut);
IOUtils.closeQuietly(stdErr);
}
return ret;
}
/**
* @param in
* @param charset
* @return
* @throws IOException
* @throws UnsupportedEncodingException
*/
private String processStream(InputStream in, String charset) throws Exception {
byte[] buf = new byte[1024];
StringBuilder sb = new StringBuilder();
int len = 0;
while ((len=in.read(buf)) != -1) {
sb.append(new String(buf,0,len, charset));
}
return sb.toString();
}
public static void main(String args[]) throws Exception {
// shell
RemoteShellExecutor executor = new RemoteShellExecutor("192.168.234.123", "root", "beebank");
System.out.println(executor.exec("sh /data/checkMysql.sh"));
// shell pid
ExecuteResultVO executeResultVO = executor.exec(String.format(GET_SHELL_PID,"sh /data/checkMysql.sh"));
// shell
ExecuteResultVO executeResultVO1 = executor.exec(String.format(KILL_SHELL_PID ,executeResultVO.getOutStr()));
}
public class ExecuteResultVO<T>{
private String outStr;
private String outErr;
// get set
}
}
テストをしても确かに使いやすいです。これによって皆さんは修正できます。ここでは、Javaのリモートサーバーのshellスクリプトと停止方法についての記事を紹介します。javaのリモートshellスクリプトの内容については、以前の記事を検索したり、下記の関連記事を見たりしてください。これからもよろしくお願いします。