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パスワード問題
こんな感じで接続情報作ってるんですが、パスワードがプレーンテキストなんですよね。
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呼んでるだけだから大丈夫だとおもうけど)
今回作ったのは単発のアクティビティなんですが、ほんとはスコープみたいな感じでやりたかったんですよね。
(最初に接続先だけ定義して、複数コマンド連続実行みたいな)
このあたりもうちょっと調べて、機能追加してみようと思います。