显示标签为“VNC”的博文。显示所有博文
显示标签为“VNC”的博文。显示所有博文

2008年4月13日星期日

vnc-java 一个 VNC 的 Java applet 客户端

见 vnc-java 包内容,
/usr/bin/jvncviewer
/usr/share/java/vncviewer-3.3.3r2.jar
/usr/share/vnc-java
/usr/share/vnc-java/animatedMemoryImageSource.class
/usr/share/vnc-java/authenticationPanel.class
/usr/share/vnc-java/clipboardFrame.class
/usr/share/vnc-java/DesCipher.class
/usr/share/vnc-java/optionsFrame.class
/usr/share/vnc-java/rfbProto.class
/usr/share/vnc-java/vncCanvas.class
/usr/share/vnc-java/vncviewer.class
/usr/share/vnc-java/hextile.vnc
/usr/share/vnc-java/index.vnc
/usr/share/vnc-java/noshared.vnc
/usr/share/vnc-java/shared.vnc
/usr/share/vnc-java/tight.vnc
/usr/share/vnc-java/zlib.vnc
/usr/share/man/man1/jvncviewer.1.gz
/usr/share/java/vncviewer.jar
/usr/share/vnc-java/vncviewer.jar
其实主要就是 /usr/share/vnc-java 这个目录了,里面的 class 文件就是 applet 需要的东西,vnc 文件是一套模板。怎么用这个东西呢?

比如我们把上面文件放在 ~/vnc-html 里面,则可以如下调用 vncserver,
$ vncserver :1 -geometry 640x480 -depth 16 -httpd ~/vnc-html -httpPort 5678
这样,将在本地 5678 端口建立一个 mini http 的服务器(Xvnc 这个进程负责),并用 vnc 文件作为模板生成页面(上面含有 java applet)。这样在浏览器上输入 http://ur-ip-or-url:5678 即可打开该页面,如果你的浏览器支持 java applet(现在使用的 jre 1.5 可以正常浏览,但是 1.6 不行),就应该看到登录界面了。

那么这是什么原理呢?是否可以用一个一般性的 http 服务器实现这个过程呢?那么我们来看看上面那些 vnc 文件都有些什么吧!
<!-- index.vnc - default html page for Java VNC viewer applet.  On any file
ending in .vnc, the HTTP server embedded in Xvnc will substitute the
following variables when preceded by a dollar: USER, DESKTOP, DISPLAY,
APPLETWIDTH, APPLETHEIGHT, WIDTH, HEIGHT, PORT. Use two dollar signs
($$) to get a dollar sign in the generated html. -->

<HTML>
<TITLE>
$USER's $DESKTOP desktop ($DISPLAY)
</TITLE>
<APPLET CODE=vncviewer.class ARCHIVE=vncviewer.jar
WIDTH=$APPLETWIDTH HEIGHT=$APPLETHEIGHT>
<param name=PORT value=$PORT>
</APPLET>
<A href="http://www.tightvnc.com/">www.TightVNC.com</A>
</HTML>
注意,其中一些 $ 开始的是关于 VNC server 的一些参数,由 Xvnc 运行时替换。这样我们不难知道,实现一般 http server 的方式就是将这些对应的页面放在 http server 的合适目录下面,然后将这些 vnc 文件通过某种方式变成 html(估计写个 sed 或者直接 shell 就可以替换掉这些东西了)。

但是这个 applet 必须直接能访问到 vnc server,如果中间被防火墙隔开了,也就没有用了。

2008年4月7日星期一

vino 远程控制已有的 X

前面的输出中说道 vino 是 gnome 的 VNC server,这其实是说它是 GNOME 的子项目,事实上你不在 GNOME 里面一样可以用 vino。我们观察一下下面的命令,这里仅仅列出了感兴趣的东西:
...
/usr/lib/bonobo/servers
/usr/lib/bonobo/servers/GNOME_RemoteDesktop.server
/usr/lib/vino
/usr/lib/vino/vino-server
/usr/bin
/usr/bin/vino-preferences
...
/usr/share/doc/vino/changelog.Debian.gz
/usr/share/doc/vino/README
/usr/share/doc/vino/copyright
/usr/share/doc/vino/AUTHORS
/usr/share/doc/vino/NEWS.gz
/usr/share/doc/vino/changelog.gz
...
/usr/share/applications/vino-preferences.desktop
...
/usr/share/vino/vino-prompt.glade
/usr/share/vino/vino-preferences.glade
/usr/share/gconf
/usr/share/gconf/schemas
/usr/share/gconf/schemas/vino-server.schemas
我们依次来研究这些文件是什么。如果你需要急着用 vino,那么直接运行 vino-preferences 设定密码等参数,然后 /usr/lib/vino/vino-server 打开它就好了。默认情况下它使用和 VNC 一样的端口。

我们看见了一个叫 bonobo 的东西,在 libbonobo2-common 里面解释道它是 a set of language and system independent COBRA interfaces for creating reusable components, controls and creating compound documents,该库是 gtk+ 上的一个实现,因此这是 vino 成为 GNOME 一个组件的方式。后面将研究这种关系的细节。通过对 vino-server 使用 ldd 就能看见它的确与 libbonobo 进行了连接。

在 vino-preferences.desktop 里面可以看见很多 name 和 comment,这是根据不同的 locale 设定的。而 /usr/share/applications 就是用来存放这些“快捷方式”的。

两个 glade 文件表明 vino 本身很可能利用了 glade 来动态的产生界面,这是 gkt+ 的一个很有意思的地方,和 Qt 使用 Qt-designer 设计界面类似,glade 是 gkt+ 的界面设计程序,存下来的 glade 文件被 libglade 解析,动态的产生界面。

最后是 gconf,根据 libgconf-dev 的解释,gconf 用于用于存储应用程序配置的一个数据库,这样我们就知道 vino 所存储的密码信息其实应该是通过 gconf 放在了某处。GNOME 的程序可以通过它获得较为一致的存储风格,具体我们会在后面分析。

好,既然有了 x0vncserver,那么为什么还要有 vino 呢?我们可以尝试一下两者是否可以替换。首先通过 vncpasswd 设置密码,然后打开 x0vncserver,

$ x0vncserver PasswordFile=~/.vnc/passwd
这时可以用 vncviewer 连接到该服务器,同样,对于 vino 而言设置好后也可以。又比如打开后通过 xrdp 的 libvnc.so 都可以正常工作。因此两者实现了相同的功能。但是 x0vncviewer 不允许使用长度超过 8 的密码,不知道 vino 是否取消了该规定。如果怕 VNC 协议上没考虑这个问题,那么可以用 x0vncviewer 关闭非 localhost 的连接,而仅仅使用 xrdp 的认证,由于 xrdp 使用了加密的隧道,因此要安全一些。vino 似乎没有多少帮助文件,仅仅只能通过 vino-preferences 来设置。在 2.22 以前的版本 vino 没提供完整的设置功能。现在用起来倒是差不多了,如果你不讨厌 vino-server 连接上的 N 个 so,习惯了 GNOME 环境,那么用 vino 也未尝不可。个人倾向于 x0vncserver,因为它提供的功能更加正交一些,呵呵。

2008年4月6日星期日

使用 VNC 进行远程控制

先看一段命令的输出吧,
$ apt-cache search vnc
autocutsel - Keep the X clipboard and the cutbuffer in sync
conspy - Remote control of Linux virtual consoles
directvnc - VNC client using the framebuffer as display
gnome-rdp - remote desktop client for GNOME
iprelay - User-space bandwidth shaping TCP proxy daemon
kcemirror - Windows CE remote control tool like VNC
libgtk-vnc-1.0-0 - A VNC viewer widget for GTK+ (runtime libraries)
libgtk-vnc-1.0-dev - A VNC viewer widget for GTK+ (development files)
libsvncpp-dev - Subversion C++ library (development files)
libsvncpp0c2a - Subversion C++ shared library
libsvnqt4 - Qt wrapper library for subversion
libvncserver-dev - API to write one's own vnc server - development files
libvncserver0 - API to write one's own vnc server
libvncserver0-dbg - debugging symbols for libvncserver
linuxvnc - VNC server to allow remote access to a tty
python-gtk-vnc - A VNC viewer widget for GTK+ (python binding)
pyvnc2swf - screen recording tool to SWF movie
qemulator - a solution for easy setup and management of qemu
screenkast - Record your activities on the screen
tightvncserver - virtual network computing server software
tkvnc - Displays a list of (defined) machines to start VNC to
tsclient - front-end for viewing of remote desktops in GNOME
vinagre - VNC client for the GNOME Desktop
vino - VNC server for GNOME
virt-manager - desktop application for managing virtual machines
virt-viewer - Displaying the graphical console of a virtual machine
vnc4server - Virtual network computing server software
vncsnapshot - A utility that takes JPEG snapshots from VNC servers
vtgrab - A VNC like console monitoring
x11vnc - VNC server to allow remote access to an existing X session
x2vnc - A dual-screen hack - link an MS-Windows and X display
xrdp - Remote Desktop Protocol (RDP) server
xtightvncviewer - virtual network computing client software for X
xvnc4viewer - Virtual network computing client software for X
xwnc - Mix of Xvnc and XDarwin with improved protocol
tightvnc-java - TightVNC java applet and command line program
vnc-java - VNC java applet and command line program
krdc - Remote Desktop Connection for KDE4
krfb - Desktop Sharing for KDE4
vnc4-common - Virtual network computing server software
xvncviewer - Virtual network computing client software for X
也不知道为什么 VNC 也可以把 RDP 搜索出来。这里我们主要关心 xvncviewer、vnc4-common 和 vnc4server。

我们都知道用 vncviewer 在命令行上激活 VNC 的客户端,其实 debian 里面耍了个小滑头,/usr/bin/vncviewer 其实是一个符号链接,指向了 /etc/alternatives/vncviewer,这个目录里面的几乎全部是符号链接,里面都是一些可能存在多个可能的程序,如 window manager、yacc 等,这里相当于给出了选择,顺藤摸瓜可知 /etc/alternatives/vncviewer 其实是 xvncviewer 里面的 /usr/bin/xrealvncviewer。这样你就明白如果上面列表里面你装了多个 VNC clients 怎么选择一个默认的作为你常用的 vncviewer 命令了吧。

VNC clients 只能与 VNC 的 server 连接,在 Linux 里面每一个 server 其实就是一个 X 服务器(后面详细解释)。因此 vncviewer 很多命令和 X 启动的参数很像,同时命令对象就是 host:#display 的形式。这一点比较麻烦,因为如果每个用户都打开了自己的 VNC server,那么必须得记住自己的 #display,否则就不知道怎么连接了。这里介绍几个比较有意思的参数:-via host,建立一个从本地到 host 的 ssh 通道,由该通道将 VNC 连接 forward 到 host 一端。关于 ssh tunnel 的东西我们将在后面介绍。-listen 用作反向连接,-shared 使得同时连接在同一个 server 上的 client 不会掉线,-fullscreen 进入全屏模式(F8 打开 client 的菜单)。

这里我们提到了所谓的反向连接,那么让我们看看 server 有些什么。类似的 /usr/bin/vncserver -> /etc/alternatives/vncserver -> /usr/bin/vnc4server。vnc4server 包里面还有 vnc4config、Xvnc4、x0vncserver 等工具。vnc4server 的作用类似于 startx 脚本,就是用来激活 Xvnc4 这个 X server 的,注意X server 有好几种,如 X(xorg 的)、Xvnc4、以及前面提到的 x11rdp,它们的作用就是接受 X client 的显示输入,并以合适的方式显示(显示在本地屏幕上、通过 VNC 连接显示在客户端、通过 RDP 传输到客户端)。VNC server 需要配置一个类似于 .xinitrc 的文件,一般放在 ~/.vnc/xstartup 里面,我们可以让它指向 ~/.xinitrc 文件,这样 Xvnc4 就和我们本地的 X 起来的时候干相同的事情(启用相同的 Window Manager 和其他的应用程序)。另外还要一个登录密码,这会保存在 ~/.vnc/passwd 里面。比较常用的参数也就是设置 -name、-geometry 和 -depth 了。另外可以通过 -kill 结束某一个 VNC server。

Xvnc 作为 X server 自然是最复杂的东西了,除了前面 xvnc4server 传递的信息以外,另外有 -httpd dir 表示将 dir 目录作为一个 mini http 服务器的根,这是为了方便利用 java applet 访问该 VNC 服务器,该服务器的端口可用 -httpPort 指定。如果需要这些 applet,前面的列表中有 vnc-java 或 xtightvnc-java 供使用,也可以看出来 xtightvncviewer 是 vnc4viewer 的另一种选择。为了使得两边的剪切板能共用,可以用 -SendCutText 和 -AcceptCutText。-QueryConnect 会对本地进行询问确认是否建立连接。Xvnc4 的行为可以用 vnc4config 来控制,如 -disconnect 将会去掉所有的 clients,而通过 -list、-set、-get 和 -desc 将能更加细致的控制其行为。如,
$ vncconfig -display :1 -list
localhost
desktop
rfbport
rfbwait
httpPort
httpd
rfbauth
QueryConnectTimeout
AlwaysSetDeferUpdateTimer
DeferUpdate
Log
QueryConnect
SendCutText
AcceptCutText
AcceptPointerEvents
AcceptKeyEvents
DisconnectClients
NeverShared
AlwaysShared
Protocol3.3
CompareFB
ClientWaitTimeMillis
IdleTimeout
Password
PasswordFile
ReverseSecurityTypes
SecurityTypes
BlacklistTimeout
BlacklistThreshold
RemapKeys
ZlibLevel
MaxCutText
可见几乎所有的 Xvnc4 的 man page 里面的属性都可以通过该命令进行配置。其中 -connect 可以使得 server 主动连接向 -listen 的 client。一种可能的应用在于从一个服务器端向瘦客户端批量进行连接,这样使得每个 client 桌面上都显示出完全一样的结果,hmm 似乎可以用在教学上...

我们来看看神秘的 x0vncserver 是什么吧。它的 man page 中写道 x0vncserver is a VNC server which continuously polls any X display, allowing it to be controlled via VNC,换句话说其实就是和 vino 类似咯。我们将在后面讨论 vino。

为了创建 VNC 的密码,应该用 vnc4-common 的 vnc4passwd。