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

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

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

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

SSH

SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

解決済

1回答

4429閲覧

【C#】WindowsからRaspberry PiにSSH接続してコマンドを送る方法がわかりません。

hekatonkeiru

総合スコア9

C#

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

SSH

SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

0クリップ

投稿2021/07/15 01:35

前提・実現したいこと

Windows上のVisual StudioでC#のプログラムを作成中です。
WindowsからRaspberry PiにSSH接続してコマンドを送りたいのですが上手くいきません。
どのようにプログラムを書けばいいのか教えていただいてもよろしいでしょうか?

発生している問題

Windows上からRaspberry Piに「echo Hello World」のようなコマンドは送れるですが
「cd /home/pi/momo-2021.3_raspberry-pi-os_armv7 && ./momo --use-sdl --show-me test」のようなコマンドを送れません。
C#のプログラムがフリーズしてしまいます。

両方ともRaspberry Pi上のターミナル上で直接打ち込んだら、問題なく動きます。
両者のコマンドの違いは言葉では上手く説明できませんが、下記のスクショの通りです。
イメージ説明
イメージ説明

現状のソースコード

【SSH】SSH接続をプログラムで実装
を参考にして下記のようなプログラムにしました。

SSH

1// ソリューションエクスプローラ>参照>NuGetパッケージの管理>「Neon.SSH.NET」を追加 2using Renci.SshNet; 3 4~ 省 略 ~ 5try 6{ 7 // コネクション情報 8 ConnectionInfo info = new ConnectionInfo( 9 mHostName, 10   Convert.ToInt32(mPortNumber), 11 mUserName, 12 new AuthenticationMethod[] { 13 new PasswordAuthenticationMethod(mUserName, mPassword) 14 } 15 ); 16 17 // SSHクライアントオブジェクトを生成し接続 18 SshClient ssh = new SshClient(info); 19 ssh.Connect(); 20 if (!ssh.IsConnected) 21 { 22 txtMsg("SSH接続に失敗しました",1); 23    return false; 24 } 25 26 // SSHコマンド実行 27 SshCommand cmd = ssh.CreateCommand(mCommandString); 28 messageOutput("$ " + mCommandString,0); 29 cmd.Execute(); 30 31 var stdOut = cmd.Result; 32 var stdErr = cmd.Error; 33 if (stdOut != string.Empty) 34 { 35 //コマンド実行結果を表示(デバック) 36 messageOutput(stdOut); 37 } 38 39 if (cmd.ExitStatus != 0 && stdErr != string.Empty) 40 { 41 // エラー出力を表示 42 txtMsg("SSHコマンドが失敗しました。",1); 43 return false; 44 } 45 46 // 接続終了 47 ssh.Disconnect(); 48 } 49catch (Exception ex) 50{ 51 MessageBox.Show(ex.ToString()); 52}

試したこと

プログラムのフリーズ箇所を調べたところ、下記の「cmd.Execute();」箇所でした。
イメージ説明

補足情報

使用機器:
Raspberry Pi 4 Computer Model B
OS情報:
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 10 (buster)
Release: 10
Codename: buster

参考にした文献

【SSH】SSH接続をプログラムで実装

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

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

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

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

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

guest

回答1

0

ベストアンサー

フリーズしてるというか、多分送った後にサーバ側の応答を待ち続けてるんじゃないですか?
タイムアウトを設定するか、ドキュメントで非同期用のメソッドがあるなら(多分BeginExecute?)、それを使えばいいんじゃないかと。

投稿2021/07/15 02:07

編集2021/07/15 02:14
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

hekatonkeiru

2021/07/15 02:26

radian様 お忙しい中、すぐにご返信いただきまして、 誠にありがとうございます。 おしゃった通り cmd.Execute(); ↓ cmd.BeginExecute(); に書き換えましたところ、無事に解決いたしました。 ご丁寧に対応いただき、感謝申し上げます。 以上よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問