VncSharpWpf - VNC Client User Control for WPF

Based on VncSharp which is created by Windows From, I made VncSharp - VNC Client User Control for WPF.

Download: https://github.com/nakano531/VncSharpWpf

Content of the zip file

  • VncSharpWpf.sln : Solution File.
  • VncSharpWPF : the Project which creates VncSharpWpf.dll - the dll of VNC Client User Control.
  • VncSharpWPF_Example : the sample appication which uses VncSharpWpf.

How to use

Step1. Build the Project "VncSharpWPF", and VncSharpWPF.dll is created.
Step2. Add VncSharpWPF.dll to the reference of your WPF project.
Step3. Create a instance of Class "VncSharpWPF.RemoteDesktopWpf", and deploy the instance where you want.

Case: Connect to VNC Server
Step4. Call method "Connect" to connect to VNC Server.
Step5. Call method "Disconnect" to disconnect a session.

Case: Wait for a connection from VNC Server
Step4. Call method "Listen" to start to wait a connection from VNC Server.
Step5. Method "StopListen" can stop waiting a connection.
Step6. After connected from VNC Server, You can disconnect a session by Method "Disconnect".

Problem

  • Compared to VncSharp, rendering speed is slow.
  • An enough test is not made because I developed VncSharpWpf with only one PC.

WPF用のVNCクライアント (VNC Client for WPF) その2

先日公開したWPF用のVNCクライアント(VncSharpWpf)にListenモードを追加しました。
Listenモードでは、VNCサーバからVncクライアントに接続することが出来ます。

VncSharpWPF - VNC Client UserControl for WPF

ダウンロード先:https://github.com/nakano531/VncSharpWpf

使い方

「VncSharpWPF_Example」のMainWindowをごらん頂ければほぼわかると思いますが、一応手順を記しておきます。

Step1. プロジェクト「VncSharpWPF_Example」をビルドして、VncSharpWPF.dllを作る。
Step2. VncSharpWPFを使いたいプロジェクトでVncSharpWPF.dllを参照に追加する。
Step3. クラス「VncSharpWPF.RemoteDesktopWpf」のインスタンスを生成・配置する。

●VncSharpWpfからVNCサーバに接続する場合
Step4. RemoteDesktopWpf.ConnectメソッドでVNCサーバに接続。
Step5. RemoteDesktopWpf.DisConnectメソッドでVNCサーバから切断。

VNCサーバからVncSharpWpfに接続する場合
Step4. RemoteDesktopWpf.ListenメソッドでVNCサーバからの接続を待ち受け。
Step5. VNCサーバからVncSharpWpfに接続。

課題

前回とほぼ同じですが、、、。

  • VncSharpと比べると、描画が遅い気がする。
  • ノートPC1台で作ったので、こまかい部分(特に文字入力)の動作確認が不十分。
  • Listenモードはあまり考えずに実装したので、エラー処理が適当というか動作確認が不十分。

不具合があればご連絡ください。出来る限り対応します。

WPF用のVNCクライアント (VNC Client for WPF)

WFPで使えるVNCクライアントを探していたが適当なのが無かったので、Windows Formで作られているVncSharpを改造してVNCクライアントのUserControlを作ってみました。

VncSharpWPF - VNC Client UserControl for WPF

ダウンロード先:VncSharpWpf-0.0.1.zip

ReadMeを入れ忘れたので、フォルダの簡単な説明です。

  • VncSharpWpf.sln : ソリューションファイル。
  • VncSharpWPF : VNCクライアントUserControl(VncSharpWPF)のdll(VncSharpWpf.dll)を生成するプロジェクト。
  • VncSharpWPF_Example : VncSharpWPFを使ったサンプルアプリのプロジェクト。
使い方

「VncSharpWPF_Example」のMainWindowを見たりいじったりすればだいたいわかると思いますが、一応手順を記しておきます。

Step1. プロジェクト「VncSharpWPF_Example」をビルドして、VncSharpWPF.dllを作る。
Step2. VncSharpWPFを使いたいプロジェクトでVncSharpWPF.dllを参照に追加する。
Step3. クラス「VncSharpWPF.RemoteDesktopWpf」のインスタンスを生成・配置する。
Step4. RemoteDesktopWpf.ConnectメソッドでVNCサーバに接続。
Step5. RemoteDesktopWpf.DisConnectメソッドでVNCサーバから切断。

課題
  • VncSharpと比べると、描画が遅い気がする。
  • ノートPC1台で作ったので、こまかい部分(特に文字入力)の動作確認が不十分。

不具合があればご連絡ください。出来る限り対応します。

ドキュメントはニーズがありそうだったら準備しようかな。。。

【Linux】WindowsマシンでXを表示する方法

Linuxでは「X」というウィンドウシステムが使われています。

Xではクライアント・サーバモデルが採用されています。
Xサーバはクライアントの要求に基づいてグラフィック描画を行うとともに、ユーザの入力をクライアントに送信します。
Xクライアントは、Xサーバを利用してグラフィックス描画を行う全てのプログラムをさします。

Xサーバはユーザのマシン上で動作し、Xクライアントはユーザのマシン上でも他のマシン上でも動作できます。
つまり、プログラム本体はリモートのマシンで実行し、描画をローカルのマシンで行わせることが可能で、これはよく「Xを飛ばす」と表現されます。

さて、WindowsマシンでXを表示するには、当然Windows用のXサーバが必要になります。
Windows用のXサーバで有名なのは、やはり「Xming」です。フリーですが、問題なく使えます。

ここでは、Xmingの組み合わせでXを飛ばす方法を説明します。
(PuTTyは既にインストール済みとします)

Step1. Xmingのインストール

Xminghttp://sourceforge.jp/projects/sfnet_xming/releases/からインストーラ(Xming-*-setup.exe)をダウンロードし、Xmingをインストールします。

Step2. Xmingの起動

インストールが完了したら、Xmingを起動します。初めて起動した場合、下のようなWidnowsセキュリティの警告が出るので「ブロックを解除する」を選択します。

Step2. SSHDの設定

Xmingのインストールが完了したら、LinuxマシンのSSHD設定を確認します。

/etc/ssh/sshd_configを開き、X11Forwardingが有効になっているか確認します。

変更前:#X11Forwarding no
               ↓
変更後:X11Forwarding yes

設定を変更した場合は、sshdを再起動します。

/etc/rc.d/init.d/sshd restart (Enter)

Step3. PuTTyの設定

(1) PuTTY を起動し、左側メニューから「接続」→「SSH」→「X11」と選択します。
(2) 「X11フォワーディングを有効にする」にチェックを入れます。
(3) Linuxマシンに接続します。
※保存済みセッションに「X11フォワーディングを有効にする」のチェックを入れてもOKです。

Step4. 接続テスト

Xが飛ばせるかテストします。例えば、

[test01@localhost ~] xeyes (Enter)

で下のような、目玉が表示されれば成功です。

【bash】コマンドプロンプトの表示を変更する方法

bashコマンドプロンプトは標準では、

 [test1@localhost ~]$ 

のように表示されます。
この表示は環境変数PS1を書き換えることで変更することができます。


例えば、プロンプトを">>"とするには次を実行します。

  [test1@localhost ~]$ PS1=">>" (Enter)
  >>  ← プロンプトが">>"になっている


PS1には設定可能は以下の特種文字が設定可能です。(出展:Man page of BASH)

表記 意味
\a ASCII のベル文字 (07)
\d "曜日 月 日" という形式の日付 (例: "Tue May 26")
\e ASCII のエスケープ文字 (033)
\h ホスト名のうち最初の `.' までの部分
\H ホスト名
\j シェルによって現在管理されているジョブの数
\l シェルの端末デバイスのベース名 (basename)
\n 改行
\r 復帰
\s シェルの名前。つまり $0 のベース名 (最後のスラッシュ以降の部分)
\t 24 時間の HH:MM:SS 形式の現在の時刻
\T 12 時間の HH:MM:SS 形式の現在の時刻
\@ 12 時間の HH:MM am/pm 形式の現在の時刻
\u 現在のユーザのユーザ名
\v bash のバージョン (例: 2.00)
\V bash のリリース。バージョンにパッチレベルを加えたもの (例 : 2.00.0)
\w 現在の作業ディレクト
\W 現在の作業ディレクトリのベース名
\! このコマンドの履歴番号
\# このコマンドのコマンド番号
\$ 実効 UID が 0 の場合に #、 それ以外の場合は $
\nnn 8進数 nnn に対応する文字
\\ バックスラッシュ
\[ 非表示文字のシーケンスの開始。 これを使うと、プロンプト中に端末の制御シーケンスを埋め込むことができます。
\] 非表示文字のシーケンスを終了します。


特種文字を利用して様々なコマンドプロンプトが実現できます。

例1 現在時刻を表示する

 [test1@localhost ~]$ PS1="(\t)[\u@\h \W]$ " (Enter)
 (16:24:49)[test1@localhost ~]$ ← 先頭に現在時刻が表示される

例2 コマンド番号を表示する

 [test1@localhost ~]$ PS1="(\#)[\u@\h \W]$ " (Enter)
 (45)[test1@localhost ~]$ ← 先頭にこのシェル上でのコマンド番号が表示される

【Linux】"sudo -s"を禁止する方法

前回書いたように、"sudo -s"は対話式シェルを起動できるので、root権限で色々と作業したいときに大変便利ですが、ログに起動したシェル上で行った作業が記録されないという問題があります。
ユーザに特定のコマンドしかsudoさせない場合、"sudo -s"の利用は禁止するのが望ましいです。

/etc/sudoersではオプション利用が禁止できない

sudoコマンドの設定は、visudoコマンドで/etc/sudoersファイルを編集して行います。
ところが、/etc/sudoersファイルでは特定のオプション禁止することができません。

シェルコマンドを1つ1つ禁止する

"sudo -s"は実行されると環境変数SHELLに設定されたシェルを起動します。
つまり、"sudo -s"は"sudo $SHELL"と同じです。

そのため、$SHELLに設定される可能性がある、/bin/bash、/bin/tsch、/bin/zshなどのコマンドを1つ1つ禁止する必要があります。 (とても面倒ですが他によい方法が見つかりません。。。)

【/etc/sudoersの設定例】
Cmnd_Alias SHELLS = /bin/bash/, /bin/tsch, /bin/zsh, /usr/local/bin/bash, /usr/local/bin/tcsh, ....
%wheel ALL = (ALL) ALL, !SHELLS  ← wheelグループのSHELLSに設定したコマンド利用を禁止

実は完璧ではない

実は上記の方法、シェルコマンド利用を完全に禁止できてはいません。 ちょっと知識があれば、すぐに抜け道を見つけられてしまいます。

例えば、シェルコマンドを別のディレクトリにコピーされたり、別名にされたりすると、sudoで使うことができます。 また、Linuxにはviコマンドやlessコマンドなど、外部コマンドを起動できるものが多くあり、ここからroot権限でコマンドを実行することもできてしまいます。

ですので、上記の方法はあくまで気休め程度ととらえてください。 本当になんか上手い方法はないんでしょうかね。。。

【Linux】sudoコマンドを"-s"オプションを付けて実行すると対話式シェルが起動できる

みんな意外と知らないのでメモ。

suコマンドが禁止されていてsudoコマンドしか使えない場合、コマンド毎にsudoしていませんか?
sudoコマンドを"-s"オプション付きで実行するとroot権限で対話式シェルを起動することができます。

【使用例】
[test01@localhost ~] sudo -s (Enter)
[sudo] password for test01: ******** (Enter)
[root@localhost ~]# 

こうすればroot権限が必要なコマンドを多く使う場合に、いちいちsudoする必要がなくなり便利です。

※運用面から見ると、「sudo -s」で起動したシェル上で実行したコマンドはログに記録されない、というセキュリティ上の問題があります。利用には十分注意する必要があります。