リモート動作のUbuntu(22.03で確認)をAndroid端末から自作アプリでSSH操作したい場合、JSchを使うと可能だった。
==== JSch ライブラリ使用の準備 =====
1)jsch ダウンロード
http://www.jcraft.com/jsch/
http://www.jcraft.com/jsch/
ここではjar ファイルを指定する jsch-0.1.55.jar(280,681 bytes) とする
2)Androidのプロジェクトに追加
/app/lib ホルダを作成してその中にダウンロードしたjsch-0.1.55.jar を追加
3)AndroidStudioにライブラリ追加したことの設定
GradleScripts の中の buiild.gradle1(Module:app) の dependencies 範囲内で以下行を追加
implementation fileTree(include: ['*.jar'], dir: 'libs')
===== 作成コード例 =====
以下、Copilot が吐いたコード例にすこし加筆。優秀ですな。
import com.jcraft.jsch.*;
public void sshcommand(String commandArgs, String Host, String User, String Pass )
{
try {
JSch jsch = new JSch();
Session session = jsch.getSession(username, host, 22);
session.setPassword( password );
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
// Execute the shutdown command
Channel channel = session.openChannel("exec");
((ChannelExec) channel).setCommand( commandArgs );
channel.connect();
// Wait for the command to complete
while (!channel.isClosed()) {
Thread.sleep(1000);
}
channel.disconnect();
session.disconnect();
} catch (JSchException | InterruptedException e) {
e.printStackTrace();
}
}
で、何かボタンとか押されたら上記の sshcommand を実行するようにする。
実行したいコマンドをcommandArgsへセット。
ホストはIPアドレス、User/Pass はUbuntuのログイン用をセット。
ただし、ShutdownとかRebootとかの管理者権限が必要な場合はsudo付けるだけでは行かないので、Ubuntu側でuser下の適当なホルダで
#!/bin/bash
PASSWORD='(パスワード)'
echo $PASSWORD | sudo -S shutdown -h now
PASSWORD='(パスワード)'
echo $PASSWORD | sudo -S shutdown -h now
という内容の名称適当でファイルを作り、実行権限を与えたうえで、このファイルを指定する。
余談:コマンドのレスポンスを受けたいときは
「JSchライブラリにおいて、channel でsetcommand したあとのレスポンスを取得するサンプル」
とCopilotさんに問うと答えてくれた。
----
動作確認
androidStudio2023
Ubuntu22.03が走るCPUボード
で行った。
※ Ubuntu側にはSSHが入っていること。
sudo systemctl status ssh
でUnit ssh.service could not be found.と表示の場合は
sudo apt install openssh-server -y
でインストールできる。