2

私はc#のplinkを使用してLinuxサーバーに接続し、いくつかのプログラムを実行しています。c#コンソールプログラムとplink.exeの両方が同じWindowsマシン上にあります。

問題は、Linuxサーバーに初めて接続するときに、plinkがLinuxサーバーからのSSHキーを受け入れて保存するかどうかを尋ねてくることです。すべてのサーバーが私のLANにあり、セキュリティの問題がないため、私は常にこれに「はい」と答えたいと思います。

私はc#プロセスタイプを使用しています。正しい引数をplinkに渡し、出力をリダイレクトして開始します。ここで問題となるのは、plinkがプロンプトを表示するとき、process.StandardOutput.ReadToEnd();です。ハングし、plinkによってキーを受け入れるように求められたのか、実際にLinuxサーバーにログインしたのかを判断する方法がありません。

        string output = string.Empty;
        string error = string.Empty;
        string arguments = @" -ssh -pw password root@12.12.12.12 ./Install_xxx.bin";

        using (Process process = new Process())
        {
            ProcessStartInfo psi = new ProcessStartInfo();
            psi.FileName = "plink";
            psi.Arguments = arguments;
            psi.ErrorDialog = false;
            psi.UseShellExecute = false;
            psi.RedirectStandardError = true;
            psi.RedirectStandardInput = true;
            psi.RedirectStandardOutput = true;
            psi.CreateNoWindow = true;

            process.StartInfo = psi;
            process.Start();

            output = process.StandardOutput.ReadToEnd();
            error = process.StandardError.ReadToEnd();
        }

ありがとう

4

3 に答える 3

1

外部実行可能ファイルを使用してSSH接続を確立する代わりに、SSHライブラリを使用して、コードを介して(より確実に)実行してみませんか?

SharpSshここでは最新バージョン)は、BSDライセンスのJavaライブラリであるJschのC#ポートです。私はこれをC#プロジェクトで非常にうまく使用しました。キーネゴシエーションを含むSSH接続のすべての側面をプログラムで処理できるようになります。

于 2011-03-17T19:12:09.760 に答える
1

デッドロックの問題は、Processドキュメントで説明されています。プロセスが入力を待機している場合、標準入力を閉じることができないため、ブロックされます。プロセスがまだ stdin からの入力を待っているため、StandardOutput は閉じられません: デッドロック。非同期 API を使用して行ごとに読み取るか、他のストリームに別のスレッドを使用できます。

于 2011-03-17T19:32:40.663 に答える
0

PLINKを介してリモートサーバーにシームレスに接続するには、初回以降、SSHキーを手動で調整する必要があります。つまり、PUTTYGENを使用して、PLINKが使用する.ppk秘密鍵ファイルを作成し、対応する公開鍵を~/.ssh/authorized_keysサーバー上のファイルに事前に保存します。

また、sshdのホストキーを調整する必要があるため、PUTTYGENを使用して秘密キーファイルのセットを生成し(ssh_host_rsa_key既存のファイルを調べて、エクスポート先のキー形式を確認します)、実行して対応する公開キーファイルを作成します。 (ファイルを作成するために同じことを行います)。ssh_host_dsa_key/etc/sshssh-keygen -y -f /etc/ssh/ssh_host_rsa_key > /etc/ssh/ssh_host_rsa_key.pubssh_host_dsa_key.pub

PLINKするサーバーが複数あり、同じキーを使用してそれらすべてに接続することを気にしない場合(これは、ローカルのITセキュリティポリシーによって異なります)、同じキーファイルを各サーバーにコピーするだけです。 。

次に、PLINKを使用しているWindowsマシンで、PUTTYまたはPLINKを使用して任意のサーバーに手動で接続し、ホストキーをインタラクティブに受け入れます。これを行うと、PUTTY/PLINKはそのキーをWindowsレジストリの。の下に保存しますHKCU\Software\SimonTatham\PuTTY\SshHostKeys。サーバーのホスト名は、のrsa2@22:hostようなエントリに気付くでしょう。host

ここで、手順の要点として、REG_SZの16進値0x23,...をC#アプリにコピーする必要があります。ここで、シェルアウトする前に、Microsoft.Win32.RegistryKeyクラスを手動で使用して、同じrsa2@22:host命名スキームを使用する他のすべてのサーバーにこの値を書き込む必要があります。 PLINK(このレジストリ値をセキュリティに配慮したものと見なすかどうかはあなた次第です。必要に応じて、C#アプリで何らかの方法で保護してください)。

他の人が述べたように、SSHライブラリを使用して、接続プロセスに関するよりプログラム的なフィードバックを取得することを検討することもできますが、PLINKを使用するには、これを行う必要があります。

于 2012-02-01T22:30:55.893 に答える