たまに、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()