3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GroovyからSSH接続してサーバへコマンド発行する

Posted at

たまに、Groovy(Java)から別のサーバにSSH経由でコマンド発行したい時があります。
相手がREST API持ってたり、JavaのAPI持っていれば、そちらでアクセスするんだけど、相手がコマンド発行しかないような場合。
今回は、別サーバのMailmanとやり取りしたいというケース。

JavaベースでSSH接続するライブラリーは色々あるんだけど、今回は ganymed-ssh2 を使ってみた。

@Grab('ch.ethz.ganymed:ganymed-ssh2:262')

import ch.ethz.ssh2.Connection
import java.nio.charset.Charset

def con = new Connection("接続先IPアドレス", 22) // 接続ポート変える場合は、第2引数を変える
con.connect()

def result = con.authenticateWithPassword("ユーザ", "パスワード")
if (!result) {
    println "connect failed"
    return
}

// コマンド実行用メソッド
def exec(con, cmd) {
    def session = con.openSession()
    session.execCommand(cmd)
    def ret = session.stdout.text
    session.close()
    ret
}

def MM_DIR = "/usr/lib/mailman/bin"

// MLリスト取得(リスト名だけが欲しいためtailとsedをかませる
println exec(con, "${MM_DIR}/list_lists | tail -n +2 | sed -e 's/ -.*//g' -e 's/^ *//g'")

// MLに追加するメンバーアドレス
def list = ["aaa@aaa.com", "bbb@bbb.com", "ccc@ccc.com"]

// ヒアドキュメントにGStringを埋め込む
println exec(con, """${MM_DIR}/add_members -r - test-ml << _EOT
${list.join('\n')}
_EOT""")

con.close()
3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?