显示标签为“远程控制”的博文。显示所有博文
显示标签为“远程控制”的博文。显示所有博文

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。

2008年4月5日星期六

xrdp 远程桌面协议服务器

其实 Linux 实现的仅仅是 RDP 本身,而像 Windows 使用的远程桌面一个重要特点就是可以尽量避免传输 bitmap 信息,由于传输的是高级画图信息,这使得传输的数据量有明显减少,从而在一定的网络负荷下仍然可用。而 xrdp 一般仅仅是做一个 bitmap cache,并通过压缩减少网络流量,除非使用 libxup.so 模块(由于使用 X11rdp,传输的信息也是高层绘图信息)。

xrdp 说穿了是一个 proxy,它通过几个 lib*.so 与底层交互,如可以用服务器端的 VNC server,或者将 RDP 请求传送到一台 Windows 上进行共享。我们来看一看一个典型的 xrdp 服务是如何提供给用户的:一个 rdp client 连接到 xrdp,首先通过交换公钥建立可靠的数据通道,client 要求对应的屏幕大小和色彩深度,server 返回一个简易的模块选择界面,并要求 client 登录认证。client 完成了登录信息以后,server 首先依靠 sesman 进行认证,然后依照其选择的模块激活对应的功能,如 libvnc.so,建立连接。

client 可以选择的模块是由 server 在 /etc/xrdp/xrdp.ini 里面定义的。该文件有一个 global 的 section,主要是定义一些控制服务器的参数,如是否打开 bitmap cache,是否是用压缩等。后面一般是根据连接类型产生的 section,例如
[xrdp1]
name=sesman-Xvnc
lib=libvnc.so
username=ask
password=ask
ip=127.0.0.1
port=-1
是一段 debian 中默认的配置,[] 里面是第一个 xrdp 模块,对应的 name 是显示给 client 看见的,调用的是 libvnc.so 和 VNC 服务器交互,username 使用 ask 表明向用户询问,也可以固定下来,ip 和 port 就是连接的 VNC 服务器地址。port=-1 表明使用默认的可用地址。又比如
[xrdp5]
name=rdp-any
lib=librdp.so
ip=ask
port=ask3389
是使用上级 RDP server,比如可以通过该连接访问处于 xrdp 后的 Windows 主机。另外还有一种
[xrdp6]
name=sesman-X11rdp
lib=libxup.so
username=ask
password=ask
ip=127.0.0.1
port=-1
是利用 X11rdp,理论上应该是最快捷的了,可惜现在的 debian 并没有实现 X11rdp 的模块,有人已经在呼唤了。

关于 sesman,作用很简单认证,启动合适的 X,如 Xvnc 或者是 X11rdp,或者是连接到远程 Windows 上。控制其行为的是 /etc/xrdp/sesman.ini 文件,分为四个 section,global、logging、security、sessions。global 中重要的是设置了用户 WM,
[Globals]
ListenAddress=127.0.0.1
ListenPort=3350
EnableUserWindowManager=1
UserWindowManager=/etc/xrdp/startwm.sh
DefaultWindowManager=/etc/xrdp/startwm.sh
这使得我们可以依据自己的喜好定义自己的脚本。其实 startwm.sh 本身就是指向 /etc/X11/Xsession 的。

RDP Clients 远程桌面协议客户端

在 Linux 里面有时需要远程控制 Windows 里面的东西。我们都知道在 Windows 里面通过 [Windows]\System32\mstcs.exe 可以建立远程桌面控制连接。这种连接使用的协议在 Linux 里面一般叫 RDP(Remote Desktop Protocol),这里我们就讨论一下相关的客户端。

这是一段命令输出:
$ apt-cache search rdesktop
grcm - GNOME application to initiate connections to remote machines
grdesktop - GNOME frontend for the rdesktop client
osso-af-settings - pkg-config based registry for maemo directories
rdesktop - RDP client for Windows NT/2000 Terminal Server
remotedesk.app - Remote Windows access tool for GNUstep
tsclient - front-end for viewing of remote desktops in GNOME
xrdp - Remote Desktop Protocol (RDP) server
krdc - Remote Desktop Connection for KDE4
这里我们仅仅讨论 rdesktop 和 grdesktop。

前者作为命令行上的 RDP 客户端简洁易用,一般学会
rdesktop -u 用户名 主机地址
就行了,高级的参看 man page。比较有用的选项一个是 -f 选择全屏(C-M-ENT 退出该模式),再就是 -g 选择窗口大小,-A 激活 seamless RDP,-r 将设备做出映射,使得客户端的设备出现在服务器端,比如串口、打印口(并口)、磁盘、声音(服务器到客户端)。

grdesktop 简化了你对这些东西记忆的需要,并且可以保存连接供将来使用。