プログラミングでアイデアを具現化したい

仮説アルファを妄想するのが日課でアイデアを具現化するためにプログラミングを始めました。主な言語はC# 。

SSH接続の公開鍵認証でハマった話。(C# SSH.NET)

tos5511.hatenablog.com


続きです。

パスワード認証で実装したものの、せっかくだから公開鍵認証もやっておこう!
なんて、軽く取り掛かったらちょっとハマったので共有しておきます。

var key = new PrivateKeyFile("openssh.key");
var connectionInfo = new ConnectionInfo("サーバIP", sshport , "ユーザ",
    new PrivateKeyAuthenticationMethod("ユーザ", key) 
);
var client = new SshClient(connectionInfo);
client.Connect();

基本的には上記のコードでSSH接続ができます。

が、

var key = new PrivateKeyFile("openssh.key");

この部分で {"Key 'OPENSSH' is not supported."} というエラーが発生します。
・・・サポートしてねぇわけねーだろ!!と言いたくなりますが

これ、結論だけ書くと、
OpenSSHの秘密鍵の書式がV7.8で変更となったが、
SSH.NETが新しい書式に対応していなかったって話。(サポートしてなかったんですw


ということで、OpenSSH側で鍵を発行する際に、'-m PEM' オプションをつけて
古い書式で発行した鍵を参照することで無事問題解決に至りました。

.\ssh-keygen -m PEM


今回の経験から学んだこと。
日本語だけで情報を探すべきではない

SSHでPostgresqlに接続した話

趣味プログラマーとして今までノーガード上等でやってきましたがちょっとした事情で
セキュリティを高める必要があって、DBサーバへSSH接続してDBサーバから情報を
クライアントアプリで取得するフローを構築したのでメモ書き。

クラウドにおいてるwinサーバ(DBサーバでもあるw)にOPENSSHをインストールしてサービス開始。
このサイトがわかりやすかった。
https://www.server-world.info/query?os=Windows_Server_2016&p=openssh


②クライアントアプリからのアクセスもSSHに対応させる為、SSH.NETというライブラリを使用。
言語はもちろんC#。なんだかんだで中途半端にC#しかできねぇ
サンプルコードはこのサイトがわかりやすかった。
http://shen7113.blog.fc2.com/blog-category-4.html


サンプルコード
※あくまでサンプルなので、SSHのコネクション閉じないのかとかそーゆう話は別でw

public List<独自クラス> Get独自データ(引数) {
    try {

        var connectionInfo = new PasswordConnectionInfo("winサーバIP", 22, "winサーバユーザ", "パスワード");
        var client = new SshClient(connectionInfo);
        client.Connect(); //SSH接続
       
        var forward = new ForwardedPortLocal("127.0.0.1(localhost)", 63333, "winサーバIP", postgresqlで使うport);
        client.AddForwardedPort(forward);
        forward.Start(); //ポートフォアード開始

        NpgsqlCommand cmd = new NpgsqlCommand("ストアドファンクション名", _connPostgre);
        cmd.Parameters.AddWithValue("ストアドの引数", 引数);
        cmd.CommandType = System.Data.CommandType.StoredProcedure;
        _connPostgre.Open();
        var result = cmd.ExecuteReader();
        var hoges  = new List<独自クラス>();
        while (result.Read()) {
            var hoge = new 独自クラス() {
                Name = result.GetValue(0).ToString(),
                Age = result.GetValue(1).ToString(),
            };
            hoges  (hoge );
        }

        return hoges  ;

    }
    catch (Exception ex) {
        Program.logger.Error(ex);
        return new List<独自クラス>();
    }
    finally {
        if (_connPostgre != null)
            _connPostgre.Close();
    }
}


こーゆう実装は今までしたことなかったのでやってみて良かったかもしれない。

VSCodeでC#とPythonの開発環境を用意した

tos5511.hatenablog.com

転職先ではノートPCを配布され、基本的にはそれですべて仕事するスタンス。
プログラミングは仕事で必須ではないしシステムグループでもないから、
当然VisualStudioなんて決済が通らずいれてもらえない。申請してないけどw

ということで今更ながら、Visual Studio Code (VSCode)で開発環境を揃えてみることに。
結果、色々勝手にインストールされることは制限されているものの
VSCodeと.Net Core SDK、Python3系だけインストールしてもらって
あとはpip installでjupyterとVSCode拡張機能でそれなりの開発環境を準備することが出来た。

今までVisualStudioやAnacondaありきで趣味プログラマーしていたので、
エディターベースなのは色々違和感あったけど、慣れてきたせいか
今では基本VSCodeで書くようになってきた。

C#の簡単なプロジェクト作成からexe発行までのTIPS
プロジェクト作成
Ctrl+@ ターミナル起動「dotnet new console」-> プロジェクトが生成される。

ビルドして実行
Ctrl+@ ターミナル起動「dotnet run」

ビルドだけ
Ctrl+@ ターミナル起動「dotnet build」

ビルド済を実行
Ctrl+@ ターミナル起動「C:\Data>dotnet C:\data\test.dll」

Nuget
Ctrl+P コマンドパレット起動「>Nuget Package Manager Add Package」

  • >導入したいパッケージとバージョンを選択

EXE作成
Ctrl+@ ターミナル起動「dotnet publish -c Release -r win-x64」


あと、使ってみて重宝しそうな拡張機能「LocalHistory」
->これは都合上Gitなど連携できないのでバージョン管理どうしようかと迷っていたところ、
変更前との差分も見れるし、手軽で操作も直感的ですばらしい拡張機能だと思った。

以上!


たぶん年内ラストのエントリになると思います。
皆様良いお年を