質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

9264閲覧

C#のSSH.NETを使って途中結果を表示させたい

d_neko

総合スコア108

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2019/07/14 14:36

編集2019/07/16 07:38

windowsから、Tera Termを使ってlinuxに接続して決まったコマンドを実行しています。
これをもっと簡略化できないかと考えています。

そこで検索した見つけたのを、説明のままやってみました。

C#でSSHを使ってコマンドを実行して結果を表示したいと思っています。
そして、検索して見つけたサイトはこれです↓
https://developer.aiming-inc.com/programming/connect-mysql-and-ssh-for-csharp/

実際に試してみると、ページの説明のとおりの結果が出ました。

そこで、上記アドレスのソースの一部分を下記のようにしました。

var commandString = "date";

var commandString = "wh.py";

そのソースは

ファイル名 "wh.py"

#!/usr/bin/python3 import time for i in range(100): print(i) time.sleep(1)

こんな感じです。

実行した結果、最後に一括して結果が表示されます。

// 送信したいコマンドを変数に入れる var commandString = "wh.py"; // コマンドを作成する SshCommand cmd = ssh.CreateCommand(commandString); // コマンドを実行する Console.WriteLine("[CMD] {0}", commandString); cmd.Execute(); // 結果を変数に入れる var stdOut = cmd.Result;

上記のままだと、最後に結果が表示されます。

最後に一括して表示させるのではなく、リアルタイムに表示させるにはどうすればいいのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2019/07/14 14:39

Teratermでやるときはどうコマンドを入れてるんでしょう。 そこらへん詳しく説明してください
d_neko

2019/07/14 16:01

自作コマンドです。それは、今回の例("wh.py")のような、whileで文字を結合して、printで表示させるようなものです。
y_waiwai

2019/07/14 23:21

なんかよーわかりませんが、、、 Teratermで、wh.pyっていれたらどうなりますか?
hihijiji

2019/07/15 04:38

linuxのほうに wh.py を置いてますか?
guest

回答3

0

自己解決

以下のリンクのページのコードと、Answerを参考(適当にコピペ)にすると、1・2・3とカウントされました。

https://stackoverflow.com/questions/44528158/ssh-net-doesnt-process-my-shell-input-commands/44542531#44542531

本当は、このページのやり方が正しいと思うのですが調べることが出来ませんでした。
https://github.com/sshnet/SSH.NET/issues/464

投稿2019/07/18 05:58

編集2019/07/18 06:05
d_neko

総合スコア108

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

wh.pyを、以下のように修正したらいかがですか。

python

1 #print(i) 2 print(i, flush=True)

上記の修正で動くかどうかは別にして、以下の事は知っておいた方がいいと思います。

pythonに限らず、大抵のプログラミング言語のファイルIOはバッファリングされています。
要は、出力命令を実行しても実際には出力されず、ある程度出力データが溜まったり、クローズした時点で出力されます。

pythonの場合、組み込み関数のopen関数にそのあたりの説明が書かれています。

buffering はオプションの整数で、バッファリングの方針を設定するのに使われます。バッファリングを無効にする (バイナリモードでのみ有効) には 0、行単位バッファリング (テキストモードでのみ有効) には 1、固定値のチャンクバッファの大きさをバイト単位で指定するには 1 以上の整数を渡してください。buffering 引数が与えられていないとき、デフォルトのバッファリング方針は以下のように動作します:

バイナリファイルは固定サイズのチャンクでバッファリングされます。バッファサイズは、下層のデバイスの「ブロックサイズ」を決定するヒューリスティックを用いて選択され、それが不可能な場合は代わりに io.DEFAULT_BUFFER_SIZE が使われます。多くのシステムでは、典型的なバッファサイズは 4096 か 8192 バイト長になるでしょう。
「対話的な」テキストファイル (isatty() が True を返すファイル) は行バッファリングを使用します。 その他のテキストファイルは、上で説明したバイナリファイル用の方針を使用します。

先のpythonスクリプトでは標準出力に出力しているのでテキストファイル扱いですが、Pythonスクリプトを「対話的」な実行をしていないので、バイナリファイルのように一定バイト数出力しない限り(もしくは、プログラムが終了するまで)実際に出力はされないと思います。

これを、明示的に強制的に出力される事を、大抵の場合「flush」と呼びます。
print関数のマニュアルによれば、flush引数にTrueを指定する事により、flushが実行されるそうです。

ついでに、print関数の後に、

python

1 print('hoge') 2 sys.stdout.flush()

というように、flushメソッドを呼び出しても同様です。

投稿2019/07/16 11:41

編集2019/07/16 11:44
katsuko

総合スコア3462

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

katsuko

2019/07/16 12:10 編集

あぁ、YAmaGNZさんのいうとおり、c#側でも対処しないといけなさそうですね。 両方一緒に対処してみてください。
d_neko

2019/07/16 12:24

ためしてみましたが、出来ませんでした。Tera Termで、wh.pyを実行すると、ちゃんと1・2・3とカウントされます。SSH.NETをつかえば、Tera Termのようなものが作れると思ったのですが違うのでしょうか。
katsuko

2019/07/17 00:17

違う事をしているのですから、違いが出るのは当たり前です。 どこまで「TeraTermのようなもの」に近いモノが作れるかは、SSH.NETとやらのマニュアルを熟読するなりして、仕様をしっかり把握するよう調べてください。
d_neko

2019/07/17 10:01 編集

print(i, flush=True)はためしました。駄目でした。sys.stdout.flush()は、python2用みたいなので、うまくいきませんでした。
guest

0

stackoverflowにSSH.NET real-time command output monitoringとありました。
参考になりますか?

投稿2019/07/16 08:17

YAmaGNZ

総合スコア10222

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

d_neko

2019/07/16 09:12 編集

stackoverflowで、何件か見て試してみましたがうまくいきません。 cmd.Execute();では、最後に出力されます。
YAmaGNZ

2019/07/16 09:22

BeginExecuteは試されたのですか?
d_neko

2019/07/16 10:38

BeginExecuteでできるのでしょうか?リンク先の場合、BeginExecute以降、Console.Writeが無いようなのですが、表示されるのでしょうか。BeginExecuteで検索して、いろいろやってみましたができませんでした。
YAmaGNZ

2019/07/16 14:41

どう試されたのでしょうか? ソースを提示されれば何か分かるかもしれません。 リンク先では、コマンドの出力ストリームを読み込むような形になっているみたいなので、それで出来そうに見えました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問