使用 Ganymed SSH2 庫實現 Java 程序通過 SSH 協議遠程登錄 Linux 服務器,執行命令或腳本並獲取輸出結果。適用於自動化部署、監控採集、遠程運維等場景。
<dependency>
<groupId>com.ganymed.ssh2</groupId>
<artifactId>ganymed-ssh2-build</artifactId>
<version>210</version>
</dependency>
Connection conn = new Connection(hostname); conn.connect();conn.authenticateWithPassword(username, password)Session sess = conn.openSession();sess.execCommand("ls -la /tmp");StreamGobbler 處理 stdout/stderrsess.getExitStatus()(0 成功,非 0 失敗)sess.close(); conn.close();
public class RemoteExecutor {
private final Connection conn;
public RemoteExecutor(String host, String user, String pwd) throws IOException {
conn = new Connection(host);
conn.connect();
if (!conn.authenticateWithPassword(user, pwd)) {
throw new RuntimeException("認證失敗");
}
}
public String execute(String command) throws IOException {
try (Session sess = conn.openSession()) {
sess.execCommand(command);
try (InputStream stdout = new StreamGobbler(sess.getStdout());
BufferedReader br = new BufferedReader(new InputStreamReader(stdout, StandardCharsets.UTF_8))) {
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
sb.append(line).append('\n');
}
int exitCode = sess.getExitStatus();
if (exitCode != 0) {
// 可選:讀取 stderr 並拋出異常
}
return sb.toString();
}
}
}
public void close() {
conn.close();
}
}
StandardCharsets.UTF_8 讀取流,避免中文亂碼/home/user/,腳本路徑需用絕對路徑或先 cdcmd1 && cmd2 或腳本文件串聯,多 Session 間環境不共享conn.connect(new SocketTimeout(30000)) 防止掛死authenticateWithPublicKey() 替代密碼
<dependencies>
<dependency>
<groupId>com.ganymed.ssh2</groupId>
<artifactId>ganymed-ssh2-build</artifactId>
<version>210</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
</dependencies>