【OpenRPA】SSH接続するカスタムアクティビティを作ってみた


OpenRPAでSSH接続をしてみたかったのですが、現時点のバージョンにSSHのアクティビティがなかったので、作ってみました。

どうやって作る?

OpenRPAのwikiを見ると

The robot uses Microsoft Workflow Foundation ( .NET version 4.6.2 ). A lot of different products uses this platform ( even other RPA products, for instance UIPath), and in many cases activities created for one platform will also work here. Say someone created an activity that reads the content of a PDF file and inserted that into a string, that activity would most likely also work inside OpenRPA.

ロボットはMicrosoft Workflow Foundation(.NETバージョン4.6.2)を使用します。多くの異なる製品がこのプラットフォームを使用しており(UIPathなどの他のRPA製品でさえ)、多くの場合、1つのプラットフォーム用に作成されたアクティビティもここで機能します。誰かがPDFファイルのコンテンツを読み取り、それを文字列に挿入するアクティビティを作成したとします。そのアクティビティはおそらくOpenRPA内でも機能します。

要は、「Workflow Foundationベースで作られたものならOpenRPAでもたぶん使えるよ!」とのこと。
逆に言えば、UiPathのカスタムアクティビティの作成方法がわかれば、OpenRPAのカスタムアクティビティも作れるはず!

参考にした記事

【UiPath】カスタムアクティビティの作成(事前準備と実践初級)
UiPath Studioで使用するカスタムアクティビティの作成方法
UiPath Studioで使用するカスタムアクティビティの作成方法 つづき(GUI構築)

UiPathのカスタムアクティビティの作成方法として、これらの記事を参考にしました。

OpenRPAのカスタムアクティビティを作成する場合も、ほとんど上記と同じ内容で作成できます。
ただし、現在のOpenRPAではNuGetに対応していないため、NuGet関連の手順については無視します。

というわけでできたもの

インストール方法

Visual Studioでビルドすると、Releaseの下に

  • OpenRPA.PMTech.SSH.dll
  • Renci.SshNet.dll

ができるので、OpenRPAのフォルダ(C:\Program Files\OpenRPA)にコピーしてください。

ちょっとだけ解説

アクティビティ自体の作り方は、上記の参考記事の通りに作っただけなので、解説は省きます。

SSH接続

SSH接続については、SSH.NETというライブラリを使っています。
Visual StudioのNuGetパッケージマネージャからダウンロードして使っています。

SSHパスワード問題

こんな感じで接続情報作ってるんですが、パスワードがプレーンテキストなんですよね。

RunCommandActivity.cs

public InArgument<string> Password { get; set; }

ConnectionInfo con = new ConnectionInfo(host, port, user, ProxyTypes.None, null, 0, null, null,
    new AuthenticationMethod[] {
        new PasswordAuthenticationMethod(user, password) });

SecureString使ってあげればプレーンテキストは回避できると思うのですが、テストがどうしてもエラーになってしまって解決できませんでした。

PasswordAuthenticationMethodを使っているのでユーザー/パスワードの認証しかできませんが、PrivateKeyAuthenticationMethodを使えば秘密鍵方式の認証もできそうなので、プレーンテキスト問題と合わせて今後の課題かなー。

おわりに

一応動作確認はしていますが、ちゃんとテストはしていません。
(SSH.NET呼んでるだけだから大丈夫だとおもうけど)

今回作ったのは単発のアクティビティなんですが、ほんとはスコープみたいな感じでやりたかったんですよね。
(最初に接続先だけ定義して、複数コマンド連続実行みたいな)
このあたりもうちょっと調べて、機能追加してみようと思います。