|  | 
 | Copyright (C) 2002-2010 Karl J. Runge <[email protected]> | 
 | All rights reserved. | 
 |  | 
 | x11vnc README file                         Date: Mon Dec 27 20:58:57 EST 2010 | 
 |  | 
 | The following information is taken from these URLs: | 
 |  | 
 | 	http://www.karlrunge.com/x11vnc/index.html | 
 | 	http://www.karlrunge.com/x11vnc/x11vnc_opts.html | 
 | 	... | 
 |  | 
 | they contain the most up to date info. | 
 |  | 
 | 	 | 
 | ======================================================================= | 
 | http://www.karlrunge.com/x11vnc/index.html: | 
 |  | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 | x11vnc: a VNC server for real X displays | 
 |                 (to FAQ)    (to Downloads)    (to Building)    (to Beta Test) | 
 |   (to Donations) [PayPal]  | 
 |  | 
 |    x11vnc allows one to view remotely and interact with real X displays | 
 |    (i.e. a display corresponding to a physical monitor, keyboard, and | 
 |    mouse) with any VNC viewer. In this way it plays the role for Unix/X11 | 
 |    that WinVNC plays for Windows. | 
 |  | 
 |    It has built-in SSL/TLS encryption and 2048 bit RSA authentication, | 
 |    including VeNCrypt support; UNIX account and password login support; | 
 |    server-side scaling; single port HTTPS/HTTP+VNC; Zeroconf service | 
 |    advertising; and TightVNC and UltraVNC file-transfer. It has also been | 
 |    extended to work with non-X devices: natively on Mac OS X Aqua/Quartz, | 
 |    webcams and TV tuner capture devices, and embedded Linux systems such | 
 |    as Qtopia Core. Full IPv6 support is provided. More features are | 
 |    described here. | 
 |  | 
 |    It also provides an encrypted Terminal Services mode (-create, -svc, | 
 |    or -xdmsvc options) based on Unix usernames and Unix passwords where | 
 |    the user does not need to memorize his VNC display/port number. | 
 |    Normally a virtual X session (Xvfb) is created for each user, but it | 
 |    also works with X sessions on physical hardware. See the tsvnc | 
 |    terminal services mode of the SSVNC viewer for one way to take | 
 |    advantage of this mode. | 
 |  | 
 |    I wrote x11vnc back in 2002 because x0rfbserver was basically | 
 |    impossible to build on Solaris and had poor performance. The primary | 
 |    x0rfbserver build problems centered around esoteric C++ toolkits. | 
 |    x11vnc is written in plain C and needs only standard libraries and so | 
 |    should work on nearly all Unixes, even very old ones. I also created | 
 |    enhancements to improve the interactive response, added many features, | 
 |    and etc. | 
 |  | 
 |    This page including the FAQ contains much information [*]; solutions | 
 |    to many problems; and interesting applications, but nevertheless | 
 |    please feel free to contact me if you have problems or questions (and | 
 |    if I save you time or expense by giving you some of my time, please | 
 |    consider a PayPal Donation.) Do check the FAQ and this page first; I | 
 |    realize the pages are massive, but you can often use your browser's | 
 |    find-in-page search action using a keyword to find the answer to your | 
 |    problem or question. | 
 |  | 
 |    SSVNC:  An x11vnc side-project provides an Enhanced TightVNC Viewer | 
 |    package (SSVNC) for Unix, Windows, and Mac OS X with automatic SSL | 
 |    and/or SSH tunnelling support, SSL Certificate creation, Saved | 
 |    connection profiles, Zeroconf, VeNCrypt, and built-in Proxy support. | 
 |    Added features for the TightVNC Unix viewer: NewFBSize, ZRLE encoding, | 
 |    Viewer-side Scaling, cursor alphablending, low color modes, and | 
 |    enhanced popup menu; UltraVNC extensions support for: File Transfer, | 
 |    Text Chat, Single Window, Server Input, and 1/n Scaling extensions, | 
 |    and UltraVNC DSM encryption. The SSVNC bundle could be placed on, say, | 
 |    a USB memory stick for SSL/SSH VNC viewing from nearly any networked | 
 |    computer. | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |     Announcements: | 
 |  | 
 |    Important: If you created any permanent SSL certificates (e.g. via | 
 |    "x11vnc -ssl SAVE ...") on a Debian or Ubuntu system from Sept. 2006 | 
 |    through May 2008, then those keys are likely extremely weak and can be | 
 |    easily cracked. The certificate files should be deleted and recreated | 
 |    on a non-Debian system or an updated one. See | 
 |    http://www.debian.org/security/2008/dsa-1571 for details. The same | 
 |    applies to SSH keys (not used by x11vnc directly, but many people use | 
 |    SSH tunnels for VNC access.) | 
 |  | 
 |    FAQ moved: The huge FAQ has finally been moved to its own page. If you | 
 |    are trying to follow someone's link to an FAQ once on this page it is | 
 |    now a broken link. Try inserting the string "faq.html", e.g.: | 
 | from:   http://www.karlrunge.com/x11vnc/#faq-singleclick | 
 | to:     http://www.karlrunge.com/x11vnc/faq.html#faq-singleclick | 
 |  | 
 |    Apologies for the inconvenience, unfortunately it is not possible to | 
 |    automatically redirect to the new page since the '#' anchor is not | 
 |    sent to the webserver. | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |     Background: | 
 |  | 
 |    VNC (Virtual Network Computing) is a very useful network graphics | 
 |    protocol (applications running on one computer but displaying their | 
 |    windows on another) in the spirit of X, however, unlike X, the | 
 |    viewing-end is very simple and maintains no state. It is a remote | 
 |    framebuffer (RFB) protocol. | 
 |  | 
 |    Some VNC links: | 
 |      * http://www.realvnc.com | 
 |      * http://www.tightvnc.com | 
 |      * http://www.ultravnc.com/ | 
 |      * http://www.testplant.com/products/vine_server/OS_X | 
 |  | 
 |    For Unix, the traditional VNC implementation includes a "virtual" X11 | 
 |    server Xvnc (usually launched via the vncserver command) that is not | 
 |    associated with a physical display, but provides a "fake" one X11 | 
 |    clients (xterm, firefox, etc.) can attach to. A remote user then | 
 |    connects to Xvnc via the VNC client vncviewer from anywhere on the | 
 |    network to view and interact with the whole virtual X11 desktop. | 
 |  | 
 |    The VNC protocol is in most cases better suited for remote connections | 
 |    with low bandwidth and high latency than is the X11 protocol because | 
 |    it involves far fewer "roundtrips" (an exception is the cached pixmap | 
 |    data on the viewing-end provided by X.) Also, with no state maintained | 
 |    the viewing-end can crash, be rebooted, or relocated and the | 
 |    applications and desktop continue running. Not so with X11. | 
 |  | 
 |    So the standard Xvnc/vncserver program is very useful, I use it for | 
 |    things like: | 
 |      * Desktop conferencing with other users (e.g. code reviews.) | 
 |      * Long running apps/tasks I want to be able to view from many places | 
 |        (e.g. from home and work.) | 
 |      * Motif, GNOME, and similar applications that would yield very poor | 
 |        performance over a high latency link. | 
 |  | 
 |    However, sometimes one wants to connect to a real X11 display (i.e. | 
 |    one attached to a physical monitor, keyboard, and mouse: a Workstation | 
 |    or a SunRay session) from far away. Maybe you want to close down an | 
 |    application cleanly rather than using kill, or want to work a bit in | 
 |    an already running application, or would like to help a distant | 
 |    colleague solve a problem with their desktop, or would just like to | 
 |    work out on the deck for a while. This is where x11vnc is useful. | 
 |      _________________________________________________________________ | 
 |  | 
 |     How to use x11vnc: | 
 |  | 
 |    In this basic example let's assume the remote machine with the X | 
 |    display you wish to view is "far-away.east:0" and the workstation you | 
 |    are presently working at is "sitting-here.west". | 
 |  | 
 |    Step 0. Download x11vnc (see below) and have it available to run on | 
 |    far-away.east (on some linux distros it is as easy as "apt-get install | 
 |    x11vnc", "emerge x11vnc", etc.) Similarly, have a VNC viewer (e.g. | 
 |    vncviewer) ready to run on sitting-here.west. We recommend TightVNC | 
 |    Viewers (see also our SSVNC viewer.) | 
 |  | 
 |    Step 1. By some means log in to far-away.east and get a command shell | 
 |    running there. You can use ssh, or even rlogin, telnet, or any other | 
 |    method to do this. We do this because the x11vnc process needs to be | 
 |    run on the same machine the X server process is running on (otherwise | 
 |    things would be extremely slow.) | 
 |  | 
 |    Step 2. In that far-away.east shell (with command prompt "far-away>" | 
 |    in this example) run x11vnc directed at the far-away.east X session | 
 |    display: | 
 |  | 
 |   far-away> x11vnc -display :0 | 
 |  | 
 |    You could have also set the environment variable DISPLAY=:0 instead of | 
 |    using "-display :0". This step attaches x11vnc to the far-away.east:0 | 
 |    X display (i.e. no viewer clients yet.) | 
 |  | 
 |    Common Gotcha: To get X11 permissions right, you may also need to set | 
 |    the XAUTHORITY environment variable (or use the -auth option) to point | 
 |    to the correct MIT-MAGIC-COOKIE file (e.g. /home/joe/.Xauthority.) If | 
 |    x11vnc does not have the authority to connect to the display it exits | 
 |    immediately. More on how to fix this below. | 
 |  | 
 |    If you suspect an X11 permissions problem do this simple test: while | 
 |    sitting at the physical X display open a terminal window | 
 |    (gnome-terminal, xterm, etc.) You should be able to run x11vnc | 
 |    successfully in that terminal without any need for command line | 
 |    options. If that works OK then you know X11 permissions are the only | 
 |    thing preventing it from working when you try to start x11vnc via a | 
 |    remote shell. Then fix this with the tips below. | 
 |  | 
 |    Note as of Feb/2007 you can also try the -find option instead of | 
 |    "-display ..." and see if that finds your display and Xauthority. Note | 
 |    as of Dec/2009 the -findauth and "-auth guess" options may be helpful | 
 |    as well. | 
 |    (End of Common Gotcha) | 
 |  | 
 |    When x11vnc starts up there will then be much chatter printed out (use | 
 |    "-q" to quiet it), until it finally says something like: | 
 |   . | 
 |   . | 
 |   13/05/2004 14:59:54 Autoprobing selected port 5900 | 
 |   13/05/2004 14:59:54 screen setup finished. | 
 |   13/05/2004 14:59:54 | 
 |   13/05/2004 14:59:54 The VNC desktop is far-away:0 | 
 |   PORT=5900 | 
 |  | 
 |    which means all is OK, and we are ready for the final step. | 
 |  | 
 |    Step 3. At the place where you are sitting (sitting-here.west in this | 
 |    example) you now want to run a VNC viewer program. There are VNC | 
 |    viewers for Unix, Windows, MacOS, Java-enabled web browsers, and even | 
 |    for PDA's like the Palm Pilot and Cell Phones! You can use any of them | 
 |    to connect to x11vnc (see the above VNC links under "Background:" on | 
 |    how to obtain a viewer for your platform or see this FAQ. For Solaris, | 
 |    vncviewer is available in the Companion CD package SFWvnc.) | 
 |  | 
 |    In this example we'll use the Unix vncviewer program on sitting-here | 
 |    by typing the following command in a second terminal window: | 
 |  | 
 |   sitting-here> vncviewer far-away.east:0 | 
 |  | 
 |    That should pop up a viewer window on sitting-here.west showing and | 
 |    allowing interaction with the far-away.east:0  X11 desktop. Pretty | 
 |    nifty! When finished, exit the viewer: the remote x11vnc process will | 
 |    shutdown automatically (or you can use the -forever option to have it | 
 |    wait for additional viewer connections.) | 
 |  | 
 |    Common Gotcha: Nowadays there will likely be a host-level firewall on | 
 |    the x11vnc side that is blocking remote access to the VNC port (e.g. | 
 |    5900.) You will either have to open up that port (or a range of ports) | 
 |    in your firewall administration tool, or try the SSH tunnelling method | 
 |    below (even still the firewall must allow in the SSH port, 22.) | 
 |  | 
 |  | 
 |    Shortcut: Of course if you left x11vnc running on far-away.east:0 in a | 
 |    terminal window with the -forever option or as a service, you'd only | 
 |    have to do Step 3 as you moved around. Be sure to use a VNC Password | 
 |    or other measures if you do that. | 
 |  | 
 |  | 
 |    Super Shortcut: Here is a potentially very easy way to get all of it | 
 |    working. | 
 |      * Have x11vnc (0.9.3 or later) available to run on the remote host | 
 |        (i.e. in $PATH.) | 
 |      * Download and unpack a SSVNC bundle (1.0.19 or later, e.g. | 
 |        ssvnc_no_windows-1.0.28.tar.gz) on the Viewer-side machine. | 
 |      * Start the SSVNC Terminal Services mode GUI: ./ssvnc/bin/tsvnc | 
 |      * Enter your remote username@hostname (e.g. [email protected]) in | 
 |        the "VNC Terminal Server" entry. | 
 |      * Click "Connect". | 
 |  | 
 |    That will do an SSH to username@hostname and start up x11vnc and then | 
 |    connect a VNC Viewer through the SSH encrypted tunnel. | 
 |  | 
 |    There are a number of things assumed here, first that you are able to | 
 |    SSH into the remote host; i.e. that you have a Unix account there and | 
 |    the SSH server is running. On Unix and MacOS X it is assumed that the | 
 |    ssh client command is available on the local machine (on Windows a | 
 |    plink binary is included in the SSVNC bundle.) Finally, it is assumed | 
 |    that you are already logged into an X session on the remote machine, | 
 |    e.g. your workstation (otherwise, a virtual X server, e.g. Xvfb, will | 
 |    be started for you.) | 
 |  | 
 |    In some cases the remote SSH server will not run commands with the | 
 |    same $PATH that you normally have in your shell there. In this case | 
 |    click on Options -> Advanced -> X11VNC Options, and type in the | 
 |    location of the x11vnc binary under "Full Path". (End of Super | 
 |    Shortcut) | 
 |  | 
 |  | 
 |    Desktop Sharing: The above more or less assumed nobody was sitting at | 
 |    the workstation display "far-away.east:0". This is often the case: a | 
 |    user wants to access her workstation remotely. Another usage pattern | 
 |    has the user sitting at "far-away.east:0" and invites one or more | 
 |    other people to view and interact with his desktop. Perhaps the user | 
 |    gives a demo or presentation this way (using the telephone for vocal | 
 |    communication.) A "Remote Help Desk" mode would be similar: a | 
 |    technician connects remotely to the user's desktop to interactively | 
 |    solve a problem the user is having. | 
 |  | 
 |    For these cases it should be obvious how it is done. The above steps | 
 |    will work, but more easily the user sitting at far-away.east:0 simply | 
 |    starts up x11vnc from a terminal window, after which the guests would | 
 |    start their VNC viewers. For this usage mode the "-connect | 
 |    host1,host2" option may be of use to automatically connect to the | 
 |    vncviewers in "-listen" mode on the list of hosts. | 
 |      _________________________________________________________________ | 
 |  | 
 |     Tunnelling x11vnc via SSH: | 
 |  | 
 |    The above example had no security or privacy at all. When logging into | 
 |    remote machines (certainly when going over the internet) it is best to | 
 |    use ssh, or use a VPN (for a VPN, Virtual Private Network, the above | 
 |    example should be pretty safe.) | 
 |  | 
 |    For x11vnc one can tunnel the VNC protocol through an encrypted ssh | 
 |    channel. It would look something like running the following commands: | 
 |   sitting-here> ssh -t -L 5900:localhost:5900 far-away.east 'x11vnc -localhost | 
 | -display :0' | 
 |  | 
 |    (you will likely have to provide passwords/passphrases to login from | 
 |    sitting-here into your far-away.east Unix account; we assume you have | 
 |    a login account on far-away.east and it is running the SSH server) | 
 |  | 
 |    And then in another terminal window on sitting-here run the command: | 
 |   sitting-here> vncviewer -encodings "copyrect tight zrle hextile" localhost:0 | 
 |  | 
 |    Note: The -encodings option is very important: vncviewer will often | 
 |    default to "raw" encoding if it thinks the connection is to the local | 
 |    machine, and so vncviewer gets tricked this way by the ssh | 
 |    redirection. "raw" encoding will be extremely slow over a networked | 
 |    link, so you need to force the issue with -encodings "copyrect tight | 
 |    ...". Nowadays, not all viewers use the -encodings option, try | 
 |    "-PreferredEncoding=ZRLE" (although the newer viewers seem to | 
 |    autodetect well when to use raw or not.) | 
 |  | 
 |    Note that "x11vnc -localhost ..." limits incoming vncviewer | 
 |    connections to only those from the same machine. This is very natural | 
 |    for ssh tunnelling (the redirection appears to come from the same | 
 |    machine.) Use of a VNC password is also strongly recommended. | 
 |  | 
 |    Note also the -t we used above (force allocate pseudoterminal), it | 
 |    actually seems to improve interactive typing response via VNC! | 
 |  | 
 |    You may want to add the -C option to ssh to enable compression. The | 
 |    VNC compression is not perfect, and so this may help a bit. However, | 
 |    over a fast LAN you probably don't want to enable SSH compression | 
 |    because it can slow things down. Try both and see which is faster. | 
 |  | 
 |    If your username is different on the remote machine use something | 
 |    like: "[email protected]" in the above ssh command line. | 
 |  | 
 |    Some VNC viewers will do the ssh tunnelling for you automatically, the | 
 |    TightVNC Unix vncviewer does this when the "-via far-away.east" option | 
 |    is supplied to it (this requires x11vnc to be already running on | 
 |    far-away.east or having it started by inetd(8).) See the 3rd script | 
 |    example below for more info. | 
 |  | 
 |    SSVNC:  You may also want to look at the Enhanced TightVNC Viewer | 
 |    (ssvnc) bundles because they contain scripts and GUIs to automatically | 
 |    set up SSH tunnels (e.g. the GUI, "ssvnc", does it automatically and | 
 |    so does this command: "ssvnc_cmd -ssh [email protected]:0") and can | 
 |    even start up x11vnc as well. | 
 |  | 
 |    The Terminal Services mode of SSVNC is perhaps the easiest way to use | 
 |    x11vnc. You just need to have x11vnc available in $PATH on the remote | 
 |    side (and can SSH to the host), and then on the viewer-side you type | 
 |    something like: | 
 |   tsvnc [email protected] | 
 |  | 
 |    everything else is done automatically for you. Normally this will | 
 |    start a virtual Terminal Services X session (RAM-only), but if you | 
 |    already have a real X session up on the physical hardware it will find | 
 |    that one for you. | 
 |  | 
 |    Gateways:  If the machine you SSH into is not the same machine with | 
 |    the X display you wish to view (e.g. your company provides incoming | 
 |    SSH access to a gateway machine), then you need to change the above | 
 |    to, e.g.: "-L 5900:OtherHost:5900": | 
 |   sitting-here> ssh -t -L 5900:OtherHost:5900 gateway.east | 
 |  | 
 |    Where gateway.east is the internet hostname (or IP) of the gateway | 
 |    machine (SSH server.) 'OtherHost' might be, e.g., freds-pc or | 
 |    192.168.2.33 (it is OK for these to be private hostnames or private IP | 
 |    addresses, the host in -L is relative to the remote server side.) | 
 |  | 
 |    Once logged in, you'll need to do a second login (ssh, rsh, etc.) to | 
 |    the workstation machine 'OtherHost' and then start up x11vnc on it (if | 
 |    it isn't already running.) (The "-connect gateway:59xx" option may be | 
 |    another alternative here with the viewer already in -listen mode.) For | 
 |    an automatic way to use a gateway and have all the network traffic | 
 |    encrypted (including inside the firewall) see Chaining SSH's. | 
 |  | 
 |    These gateway access modes also can be done automatically for you via | 
 |    the "Proxy/Gateway" setting in SSVNC (including the Chaining SSH's | 
 |    case, "Double Proxy".) | 
 |  | 
 |    Firewalls/Routers: | 
 |  | 
 |    A lot of people have inexpensive devices for home or office that act | 
 |    as a Firewall and Router to the machines inside on a private LAN. One | 
 |    can usually configure the Firewall/Router from inside the LAN via a | 
 |    web browser. | 
 |  | 
 |    Often having a Firewall/Router sitting between the vncviewer and | 
 |    x11vnc will make it impossible for the viewer to connect to x11vnc. | 
 |  | 
 |    One thing that can be done is to redirect a port on the | 
 |    Firewall/Router to, say, the SSH port (22) on an inside machine (how | 
 |    to do this depends on your particular Firewall/Router, often the | 
 |    router config URL is http://192.168.100.1 See www.portforward.com for | 
 |    more info.) This way you reach these computers from anywhere on the | 
 |    Internet and use x11vnc to view X sessions running on them. | 
 |  | 
 |    Suppose you configured the Firewall/Router to redirect these ports to | 
 |    two internal machines: | 
 |   Port 12300 -> 192.168.1.3, Port 22 (SSH) | 
 |   Port 12301 -> 192.168.1.4, Port 22 (SSH) | 
 |  | 
 |    (where 192.168.1.3 is "jills-pc" and 192.168.1.4 is "freds-pc".) Then | 
 |    the ssh's would look something like: | 
 |   sitting-here> ssh -t -p 12300 -L 5900:localhost:5900 [email protected] 'x11v | 
 | nc -localhost -display :0' | 
 |   sitting-here> ssh -t -p 12301 -L 5900:localhost:5900 [email protected] 'x11v | 
 | nc -localhost -display :0' | 
 |  | 
 |    Where far-away.east means the hostname (or IP) that the | 
 |    Router/Firewall is using (for home setups this is usually the IP | 
 |    gotten from your ISP via DHCP, the site http://www.whatismyip.com/ is | 
 |    a convenient way to determine what it is.) | 
 |  | 
 |    It is a good idea to add some obscurity to accessing your system via | 
 |    SSH by using some high random port (e.g. 12300 in the above example.) | 
 |    If you can't remember it, or are otherwise not worried about port | 
 |    scanners detecting the presence of your SSH server and there is just | 
 |    one internal PC involved you could map 22: | 
 |   Port 22 -> 192.168.1.3, Port 22 (SSH) | 
 |  | 
 |    Again, this SSH gateway access can be done automatically for you via | 
 |    the "Proxy/Gateway" setting in SSVNC. And under the "Remote SSH | 
 |    Command" setting you can enter the x11vnc -localhost -display :0. | 
 |  | 
 |    Host-Level-Firewalls: even with the hardware Firewall/Router problem | 
 |    solved via a port redirection, most PC systems have their own Host | 
 |    level "firewalls" enabled to protect users from themselves. I.e. the | 
 |    system itself blocks all incoming connections. So you will need to see | 
 |    what is needed to configure it to allow in the port (e.g. 22) that you | 
 |    desire. E.g. Yast, Firestarter, iptables(1), etc.. | 
 |  | 
 |    VNC Ports and Firewalls: The above discussion was for configuring the | 
 |    Firewall/Router to let in port 22 (SSH), but the same thing can be | 
 |    done for the default VNC port 5900: | 
 |   Port 5900 -> 192.168.1.3, Port 5900 (VNC) | 
 |   Port 5901 -> 192.168.1.4, Port 5900 (VNC) | 
 |  | 
 |    (where 192.168.1.3 is "jills-pc" and 192.168.1.4 is "freds-pc".) This | 
 |    could be used for normal, unencrypted connections and also for SSL | 
 |    encrypted ones. | 
 |  | 
 |    The VNC displays to enter in the VNC viewer would be, say, | 
 |    "far-away.east:0" to reach jills-pc and "far-away.east:1" to reach | 
 |    freds-pc. We assume above that x11vnc is using port 5900 (and any | 
 |    Host-Level-firewalls on jills-pc has been configured to let that port | 
 |    in.) Use the "-rfbport" option to tell which port x11vnc should listen | 
 |    on. | 
 |  | 
 |    For a home system one likely does not have a hostname and would have | 
 |    to use the IP address, say, "24.56.78.93:0". E.g.: | 
 |   vncviewer 24.56.78.93:0 | 
 |  | 
 |    You may want to choose a more obscure port on the router side, e.g. | 
 |    5944, to avoid a lot of port scans finding your VNC server. For 5944 | 
 |    you would tell the viewer to use: | 
 |   vncviewer 24.56.78.93:44 | 
 |  | 
 |    The IP address would need to be communicated to the person running the | 
 |    VNC Viewer. The site http://www.whatismyip.com/ can help here. | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |    Scripts to automate ssh tunneling: As discussed below, there may be | 
 |    some problems with port 5900 being available. If that happens, the | 
 |    above port and display numbers may change a bit (e.g. -> 5901 and :1). | 
 |    However, if you "know" port 5900 will be free on the local and remote | 
 |    machines, you can easily automate the above two steps by using the | 
 |    x11vnc option -bg (forks into background after connection to the | 
 |    display is set up) or using the -f option of ssh. Some example scripts | 
 |    are shown below. Feel free to try the ssh -C to enable its compression | 
 |    and see if that speeds things up noticeably. | 
 |      _________________________________________________________________ | 
 |  | 
 |    #1. A simple example script, assuming no problems with port 5900 being | 
 |    taken on the local or remote sides, looks like: | 
 | #!/bin/sh | 
 | # usage: x11vnc_ssh <host>:<xdisplay> | 
 | #  e.g.: x11vnc_ssh snoopy.peanuts.com:0 | 
 | #  (user@host:N also works) | 
 |  | 
 | host=`echo $1 | awk -F: '{print $1}'` | 
 | disp=`echo $1 | awk -F: '{print $2}'` | 
 | if [ "x$disp" = "x" ]; then disp=0; fi | 
 |  | 
 | cmd="x11vnc -display :$disp -localhost -rfbauth .vnc/passwd" | 
 | enc="copyrect tight zrle hextile zlib corre rre raw" | 
 |  | 
 | ssh -f -t -L 5900:localhost:5900 $host "$cmd" | 
 |  | 
 | for i in 1 2 3 | 
 | do | 
 |         sleep 2 | 
 |         if vncviewer -encodings "$enc" :0; then break; fi | 
 | done | 
 |  | 
 |    See also rx11vnc.pl below. | 
 |      _________________________________________________________________ | 
 |  | 
 |    #2. Another method is to start the VNC viewer in listen mode | 
 |    "vncviewer -listen" and have x11vnc initiate a reverse connection | 
 |    using the -connect option: | 
 | #!/bin/sh | 
 | # usage: x11vnc_ssh <host>:<xdisplay> | 
 | #  e.g.: x11vnc_ssh snoopy.peanuts.com:0 | 
 | #  (user@host:N also works) | 
 |  | 
 | host=`echo $1 | awk -F: '{print $1}'` | 
 | disp=`echo $1 | awk -F: '{print $2}'` | 
 | if [ "x$disp" = "x" ]; then disp=0; fi | 
 |  | 
 | cmd="x11vnc -display :$disp -localhost -connect localhost"   # <== note new opt | 
 | ion | 
 | enc="copyrect tight zrle hextile zlib corre rre raw" | 
 |  | 
 | vncviewer -encodings "$enc" -listen & | 
 | pid=$! | 
 | ssh -t -R 5500:localhost:5500 $host "$cmd" | 
 | kill $pid | 
 |  | 
 |    Note the use of the ssh option "-R" instead of "-L" to set up a remote | 
 |    port redirection. | 
 |      _________________________________________________________________ | 
 |  | 
 |    #3. A third way is specific to the TightVNC vncviewer special option | 
 |    -via for gateways. The only tricky part is we need to start up x11vnc | 
 |    and give it some time (5 seconds in this example) to start listening | 
 |    for connections (so we cannot use the TightVNC default setting for | 
 |    VNC_VIA_CMD): | 
 | #!/bin/sh | 
 | # usage: x11vnc_ssh <host>:<xdisplay> | 
 | #  e.g.: x11vnc_ssh snoopy.peanuts.com:0 | 
 |  | 
 | host=`echo $1 | awk -F: '{print $1}'` | 
 | disp=`echo $1 | awk -F: '{print $2}'` | 
 | if [ "x$disp" = "x" ]; then disp=0; fi | 
 |  | 
 | VNC_VIA_CMD="ssh -f -t -L %L:%H:%R %G x11vnc -localhost -rfbport 5900 -display | 
 | :$disp; sleep 5" | 
 | export VNC_VIA_CMD | 
 |  | 
 | vncviewer -via $host localhost:0      # must be TightVNC vncviewer. | 
 |  | 
 |    Of course if you already have the x11vnc running waiting for | 
 |    connections (or have it started out of inetd(8)), you can simply use | 
 |    the TightVNC "vncviewer -via gateway host:port" in its default mode to | 
 |    provide secure ssh tunnelling. | 
 |      _________________________________________________________________ | 
 |  | 
 |  | 
 |  | 
 |    VNC password file: Also note in the #1. example script that the option | 
 |    "-rfbauth .vnc/passwd" provides additional protection by requiring a | 
 |    VNC password for every VNC viewer that connects. The vncpasswd or | 
 |    storepasswd programs, or the x11vnc -storepasswd option can be used to | 
 |    create the password file. x11vnc also has the slightly less secure | 
 |    -passwdfile and "-passwd XXXXX" options to specify passwords. | 
 |  | 
 |    Very Important: It is up to YOU to tell x11vnc to use password | 
 |    protection (-rfbauth or -passwdfile), it will NOT do it for you | 
 |    automatically or force you to (use -usepw if you want to be forced | 
 |    to.) The same goes for encrypting the channel between the viewer and | 
 |    x11vnc: it is up to you to use ssh, stunnel, -ssl mode, a VPN, etc. | 
 |    (use the Enhanced TightVNC Viewer (SSVNC) GUI if you want to be forced | 
 |    to use SSL or SSH.) For additional safety, also look into the -allow | 
 |    and -localhost options and building x11vnc with tcp_wrappers support | 
 |    to limit host access. | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |     Tunnelling x11vnc via SSL/TLS: | 
 |  | 
 |    One can also encrypt the VNC traffic using an SSL/TLS tunnel such as | 
 |    stunnel.mirt.net (also stunnel.org) or using the built-in (Mar/2006) | 
 |    -ssl openssl mode. A SSL-enabled Java applet VNC Viewer is also | 
 |    provided in the x11vnc package (and https can be used to download it.) | 
 |  | 
 |    Although not as ubiquitous as ssh, SSL tunnelling still provides a | 
 |    useful alternative. See this FAQ on -ssl and -stunnel modes for | 
 |    details and examples. | 
 |  | 
 |    The Enhanced TightVNC Viewer (SSVNC) bundles contain some convenient | 
 |    utilities to automatically set up an SSL tunnel from the viewer-side | 
 |    (i.e. to connect to "x11vnc -ssl ...".) And many other enhancements | 
 |    too. | 
 |      _________________________________________________________________ | 
 |  | 
 |     Downloading x11vnc: | 
 |  | 
 |    x11vnc is a contributed program to the LibVNCServer project at | 
 |    SourceForge.net. I use libvncserver for all of the VNC aspects; I | 
 |    couldn't have done without it. The full source code may be found and | 
 |    downloaded (either file-release tarball or GIT tree) from the above | 
 |    link. As of Sep 2010, the x11vnc-0.9.12.tar.gz source package is | 
 |    released (recommended download). The x11vnc 0.9.12 release notes. | 
 |  | 
 |    The x11vnc package is the subset of the libvncserver package needed to | 
 |    build the x11vnc program. Also, you can get a copy of my latest, | 
 |    bleeding edge x11vnc-0.9.13-dev.tar.gz tarball to build the most up to | 
 |    date one. | 
 |  | 
 |    Precompiled Binaries/Packages:  See the FAQ below for information | 
 |    about where you might obtain a precompiled x11vnc binary from 3rd | 
 |    parties and some ones I create. | 
 |  | 
 |    VNC Viewers:  To obtain VNC viewers for the viewing side (Windows, Mac | 
 |    OS, or Unix) try these links: | 
 |      * http://www.tightvnc.com/download.html | 
 |      * http://www.realvnc.com/download-free.html | 
 |      * http://sourceforge.net/projects/cotvnc/ | 
 |      * http://www.ultravnc.com/ | 
 |      * Our Enhanced TightVNC Viewer (SSVNC) | 
 |  | 
 |        [ssvnc.gif] | 
 |  | 
 |  | 
 |    More tools: Here is a ssh/rsh wrapper script rx11vnc that attempts to | 
 |    automatically do the above Steps 1-3 for you (provided you have | 
 |    ssh/rsh login permission on the machine x11vnc is to be run on.) The | 
 |    above example would be: "rx11vnc far-away.east:0" typed into a shell | 
 |    on sitting-here.west. Also included is an experimental script | 
 |    rx11vnc.pl that attempts to tunnel the vnc traffic through an ssh port | 
 |    redirection (and does not assume port 5900 is free.) Have a look at | 
 |    them to see what they do and customize as needed: | 
 |      * rx11vnc wrapper script | 
 |      * rx11vnc.pl wrapper script to tunnel traffic thru ssh | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |     Building x11vnc: | 
 |  | 
 |    Make sure you have all the needed build/compile/development packages | 
 |    installed (e.g. Linux distributions foolishly don't install them by | 
 |    default.) See this build FAQ for more details. | 
 |  | 
 |    If your OS has libjpeg.so and libz.so in standard locations you can | 
 |    build as follows (example given for the 0.9.12 release of x11vnc: | 
 |    replace with the version you downloaded): | 
 | (un-tar the x11vnc+libvncserver tarball) | 
 | # gzip -dc x11vnc-0.9.12.tar.gz | tar -xvf - | 
 |  | 
 | (cd to the source directory) | 
 | # cd x11vnc-0.9.12 | 
 |  | 
 | (run configure and then run make) | 
 | # ./configure | 
 | # make | 
 |  | 
 | (if all went OK, copy x11vnc to the desired destination, e.g. $HOME/bin) | 
 | # cp ./x11vnc/x11vnc $HOME/bin | 
 |  | 
 |    Or do make install, it will probably install to /usr/local/bin (run | 
 |    ./configure --help for information on customizing your configuration, | 
 |    e.g. --prefix=/my/place.) You can now run it via typing "x11vnc", | 
 |    "x11vnc -help | more", "x11vnc -forever -shared -display :0", etc. | 
 |  | 
 |  | 
 |    Note: Currently gcc is recommended to build libvncserver. In some | 
 |    cases it will build with non-gcc compilers, but the resulting binary | 
 |    sometimes fails to run properly. For Solaris pre-built gcc binaries | 
 |    are at http://www.sunfreeware.com/. Some Solaris pre-built x11vnc | 
 |    binaries are here. | 
 |  | 
 |    However, one user reports it does work fine when built with Sun Studio | 
 |    10, so YMMV. In fact, here is a little build script to do this on | 
 |    Solaris 10: | 
 | #!/bin/sh | 
 | PATH=/usr/ccs/bin:/opt/SUNWspro/bin:$PATH; export PATH | 
 |  | 
 | CC='cc' \ | 
 | CFLAGS='-xO4' \ | 
 | LDFLAGS='-L/usr/sfw/lib -L/usr/X11/lib -R/usr/sfw/lib -R/usr/X11/lib' \ | 
 | CPPFLAGS='-I /usr/sfw/include -I/usr/X11/include' \ | 
 | ./configure | 
 |  | 
 | MAKE="make -e" | 
 | AM_CFLAGS="" | 
 | export MAKE AM_CFLAGS | 
 | $MAKE | 
 |  | 
 |    In general you can use the "make -e" trick if you don't like | 
 |    libvncserver's choice of AM_CFLAGS. See the build scripts below for | 
 |    more ideas. Scripts similar to the above have been shown to work with | 
 |    vendor C compilers on HP-UX (ccom: HP92453-01) and Tru64 (Compaq C | 
 |    V6.5-011.) | 
 |  | 
 |    You can find information on Misc. Build problems here. | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |    Building on Solaris, FreeBSD, etc:   Depending on your version of | 
 |    Solaris or other Unix OS the jpeg and/or zlib libraries may be in | 
 |    non-standard places (e.g. /usr/local, /usr/sfw, /opt/sfw, etc.) | 
 |  | 
 |    Note: If configure cannot find these two libraries then TightVNC and | 
 |    ZRLE encoding support will be disabled, and you don't want that!!! The | 
 |    TightVNC encoding gives very good compression and performance, it even | 
 |    makes a noticeable difference over a fast LAN. | 
 |  | 
 |  | 
 |    Shortcuts: On Solaris 10 you can pick up almost everything just by | 
 |    insuring that your PATH has /usr/sfw/bin (for gcc) and /usr/ccs/bin | 
 |    (for other build tools), e.g.: | 
 |   env PATH=/usr/sfw/bin:/usr/ccs/bin:$PATH sh -c './configure; make' | 
 |  | 
 |    (The only thing this misses is /usr/X11/lib/libXrandr.so.2, which is | 
 |    for the little used -xrandr option, see the script below to pick it up | 
 |    as well.) | 
 |  | 
 |  | 
 |    libjpeg is included in Solaris 9 and later (/usr/sfw/include and | 
 |    /usr/sfw/lib), and zlib in Solaris 8 and later (/usr/include and | 
 |    /usr/lib.) So on Solaris 9 you can pick up everything with something | 
 |    like this: | 
 |   env PATH=/usr/local/bin:/usr/ccs/bin:$PATH sh -c './configure --with-jpeg=/us | 
 | r/sfw; make' | 
 |  | 
 |    assuming your gcc is in /usr/local/bin and x11vnc 0.7.1 or later. | 
 |    These are getting pretty long, see those assignments split up in the | 
 |    build script below. | 
 |  | 
 |  | 
 |    If your system does not have these libraries at all you can get the | 
 |    source for the libraries to build them: libjpeg is available at | 
 |    ftp://ftp.uu.net/graphics/jpeg/ and zlib at http://www.gzip.org/zlib/. | 
 |    See also http://www.sunfreeware.com/ for Solaris binary packages of | 
 |    these libraries as well as for gcc. Normally they will install into | 
 |    /usr/local but you can install them anywhere with the | 
 |    --prefix=/path/to/anywhere, etc. | 
 |  | 
 |  | 
 |    Here is a build script that indicates one way to pass the library | 
 |    locations information to the libvncserver configuration via the | 
 |    CPPFLAGS and LDFLAGS environment variables. | 
 | ---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8 | 
 | <--- | 
 | #!/bin/sh | 
 |  | 
 | # Build script for Solaris, etc, with gcc, libjpeg and libz in | 
 | # non-standard locations. | 
 |  | 
 | # set to get your gcc, etc: | 
 | # | 
 | PATH=/path/to/gcc/bin:/usr/ccs/bin:/usr/sfw/bin:$PATH | 
 |  | 
 | JPEG=/path/to/jpeg      # set to maybe "/usr/local", "/usr/sfw", or "/opt/sfw" | 
 | ZLIB=/path/to/zlib      # set to maybe "/usr/local", "/usr/sfw", or "/opt/sfw" | 
 |  | 
 | # Below we assume headers in $JPEG/include and $ZLIB/include and the | 
 | # shared libraries are in $JPEG/lib and $ZLIB/lib.  If your situation | 
 | # is different change the locations in the two lines below. | 
 | # | 
 | CPPFLAGS="-I $JPEG/include -I $ZLIB/include" | 
 | LDFLAGS="-L$JPEG/lib -R $JPEG/lib -L$ZLIB/lib -R $ZLIB/lib" | 
 |  | 
 | # These two lines may not be needed on more recent Solaris releases: | 
 | # | 
 | CPPFLAGS="$CPPFLAGS -I /usr/openwin/include" | 
 | LDFLAGS="$LDFLAGS -L/usr/openwin/lib -R /usr/openwin/lib" | 
 |  | 
 | # These are for libXrandr.so on Solaris 10: | 
 | # | 
 | CPPFLAGS="$CPPFLAGS -I /usr/X11/include" | 
 | LDFLAGS="$LDFLAGS -L/usr/X11/lib -R /usr/X11/lib" | 
 |  | 
 | # Everything needs to built with _REENTRANT for thread safe errno: | 
 | # | 
 | CPPFLAGS="$CPPFLAGS -D_REENTRANT" | 
 |  | 
 | export PATH CPPFLAGS LDFLAGS | 
 |  | 
 | ./configure | 
 | make | 
 |  | 
 | ls -l ./x11vnc/x11vnc | 
 |  | 
 | ---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8<---8 | 
 | <--- | 
 |  | 
 |    Then do make install or copy the x11vnc binary to your desired | 
 |    destination. | 
 |  | 
 |    BTW, To run a shell script, just cut-and-paste the above into a file, | 
 |    say "myscript", then modify the "/path/to/..." items to correspond to | 
 |    your system/environment, and then type: "sh myscript" to run it. | 
 |  | 
 |    Note that on Solaris make is /usr/ccs/bin/make, so that is why the | 
 |    above puts /usr/ccs/bin in PATH. Other important build utilities are | 
 |    there too: ld, ar, etc. Also, it is probably a bad idea to have | 
 |    /usr/ucb in your PATH while building. | 
 |  | 
 |    Starting with the 0.7.1 x11vnc release the "configure --with-jpeg=DIR | 
 |    --with-zlib=DIR" options are handy if you want to avoid making a | 
 |    script. | 
 |  | 
 |    If you need to link OpenSSL libssl.a on Solaris see this method. | 
 |  | 
 |    If you need to build on Solaris 2.5.1 or earlier or other older Unix | 
 |    OS's, see this workaround FAQ. | 
 |  | 
 |  | 
 |    Building on FreeBSD, OpenBSD, ...:   The jpeg libraries seem to be in | 
 |    /usr/local or /usr/pkg on these OS's. You won't need the openwin stuff | 
 |    in the above script (but you may need /usr/X11R6/....) Also starting | 
 |    with the 0.7.1 x11vnc release, this usually works: | 
 |   ./configure --with-jpeg=/usr/local | 
 |   make | 
 |  | 
 |  | 
 |    Building on HP-UX:   For jpeg and zlib you will need to do the same | 
 |    sort of thing as described above for Solaris. You set CPPFLAGS and | 
 |    LDFLAGS to find them (see below for an example.) You do not need to do | 
 |    any of the above /usr/openwin stuff. Also, HP-UX does not seem to | 
 |    support -R, so get rid of the -R items in LDFLAGS. Because of this, at | 
 |    runtime you may need to set LD_LIBRARY_PATH or SHLIB_PATH to indicate | 
 |    the directory paths so the libraries can be found. It is a good idea | 
 |    to have static archives, e.g. libz.a and libjpeg.a for the nonstandard | 
 |    libraries so that they get bolted into the x11vnc binary (and so won't | 
 |    get "lost".) | 
 |  | 
 |    Here is what we recently did to build x11vnc 0.7.2 on HP-UX 11.11 | 
 | ./configure --with-jpeg=$HOME/hpux/jpeg --with-zlib=$HOME/hpux/zlib | 
 | make | 
 |  | 
 |    Where we had static archives (libjpeg.a, libz.a) only and header files | 
 |    in the $HOME/hpux/... directories as discussed for the build script. | 
 |  | 
 |    On HP-UX 11.23 and 11.31 we have had problems compiling with gcc. | 
 |    "/usr/include/rpc/auth.h:87: error: field 'syncaddr' has incomplete | 
 |    type". As a workaround for x11vnc 0.9.4 and later set your CPPFLAGS to | 
 |    include: | 
 |   CPPFLAGS="-DIGNORE_GETSPNAM" | 
 |   export CPPFLAGS | 
 |  | 
 |    This disables a very rare usage mode for -unixpw_nis by not trying | 
 |    getspnam(3). | 
 |  | 
 |    Using HP-UX's C compiler on 11.23 and 11.31 we have some severe | 
 |    compiler errors that have not been worked around yet. If you need to | 
 |    do this, contact me and I will give you a drastic recipe that will | 
 |    produce a working binary. | 
 |  | 
 |  | 
 |    Building on AIX:   AIX: one user had to add the "X11.adt" package to | 
 |    AIX 4.3.3 and 5.2 to get build header files like XShm.h, etc. You may | 
 |    also want to make sure that /usr/lpp/X11/include, etc is being picked | 
 |    up by the configure and make. | 
 |  | 
 |    For a recent build on AIX 5.3 we needed to add these CFLAGS to be able | 
 |    to build with gcc: | 
 |   env CFLAGS='-maix64 -Xlinker -bbigtoc' ./configure ... | 
 |  | 
 |    we also built our own libjpeg and libz using -maix64. | 
 |  | 
 |    BTW, one way to run an Xvfb-like virtual X server for testing on AIX | 
 |    is something like "/usr/bin/X11/X -force -vfb -ac :1". | 
 |  | 
 |  | 
 |    Building on Mac OS X:   There is now native Mac OS X support for | 
 |    x11vnc by using the raw framebuffer feature. This mode does not use or | 
 |    need X11 at all. To build you may need to disable X11: | 
 | ./configure --without-x ... | 
 | make | 
 |  | 
 |    However, if your system has the Mac OS X build package for X11 apps | 
 |    you will not need to supply the "--without-x" option (in this case the | 
 |    resulting x11vnc would be able to export both the native Mac OS X | 
 |    display and windows displayed in the XDarwin X server.) Be sure to | 
 |    include the ./configure option to find libjpeg on your system. | 
 |  | 
 |  | 
 |    OpenSSL:   Starting with version 0.8.3 x11vnc can now be built with | 
 |    SSL/TLS support. For this to be enabled the libssl.so library needs to | 
 |    be available at build time. So you may need to have additional | 
 |    CPPFLAGS and LDFLAGS items if your libssl.so is in a non-standard | 
 |    place. As of x11vnc 0.9.4 there is also the --with-ssl=DIR configure | 
 |    option. | 
 |  | 
 |    On Solaris using static archives libssl.a and libcrypto.a instead of | 
 |    .so shared libraries (e.g. from www.sunfreeware.com), we found we | 
 |    needed to also set LDFLAGS as follows to get the configure to work: | 
 | env LDFLAGS='-lsocket -ldl' ./configure --with-ssl=/path/to/openssl ... | 
 | make | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |     Beta Testing: | 
 |  | 
 |    I don't have any formal beta-testers for the releases of x11vnc, so | 
 |    I'd appreciate any additional testing very much. | 
 |  | 
 |    Thanks to those who suggested features and helped beta test x11vnc | 
 |    0.9.12 released in Sep 2010! | 
 |  | 
 |    Please help test and debug the 0.9.13 version for release sometime in | 
 |    Winter 2010. | 
 |  | 
 |    The version 0.9.13 beta tarball is kept here: | 
 |    x11vnc-0.9.13-dev.tar.gz | 
 |  | 
 |    There are also some Linux, Solaris, Mac OS X, and other OS test | 
 |    binaries here. Please kick the tires and report bugs, performance | 
 |    regressions, undesired behavior, etc. to me. | 
 |  | 
 |    To aid testing of the built-in SSL/TLS support for x11vnc, a number of | 
 |    VNC Viewer packages for Unix, Mac OS X, and Windows have been created | 
 |    that provide SSL Support for the TightVNC Viewer (this is done by | 
 |    wrapper scripts and a GUI that starts STUNNEL.) It should be pretty | 
 |    convenient for automatic SSL and SSH connections. It is described in | 
 |    detail at and can be downloaded from the Enhanced TightVNC Viewer | 
 |    (SSVNC) page. The SSVNC Unix viewer also supports x11vnc's symmetric | 
 |    key encryption ciphers (see the 'UltraVNC DSM Encryption Plugin' | 
 |    settings panel.) | 
 |  | 
 |  | 
 |    Here are some features that will appear in the 0.9.13 release: | 
 |      * Improved support for non-X11 touchscreen devices (e.g. handheld or | 
 |        cell phone) via Linux uinput input injection. Additional tuning | 
 |        parameters are added. TSLIB touchscreen calibration is supported. | 
 |        Tested on Qtmoko Neo Freerunner. A tool, misc/uinput.pl, is | 
 |        provided to diagnose uinput behavior on new devices. The env. | 
 |        vars. X11VNC_UINPUT_BUS and X11VNC_UINPUT_VERSION are available if | 
 |        leaving them unset does not work. | 
 |      * The Linux uinput non-X11 input injection can now be bypassed: | 
 |        events can be directly written to the /dev/input/event devices | 
 |        specified by the user (direct_abs=..., etc.) A -pipeinput input | 
 |        injection helper script, misc/qt_tslib_inject.pl is provided as a | 
 |        tweakable non-builtin direct input injection method. | 
 |      * The list of new uinput parameters for the above two features is: | 
 |        pressure, tslib_cal, touch_always, dragskip, btn_touch; | 
 |        direct_rel, direct_abs, direct_btn, direct_key. | 
 |      * The MacOSX native server can now use OpenGL for the screen | 
 |        capture. In nearly all cases this is faster than the raw | 
 |        framebuffer capture method. There are build and run time flags, | 
 |        X11VNC_MACOSX_NO_DEPRECATED, etc. to disable use of deprecated | 
 |        input injection and screen access interfaces. Cursor shape now | 
 |        works for 64bit binaries. | 
 |      * The included SSL enabled Java VNC Viewers now handle Mouse Wheel | 
 |        events. | 
 |      * miscellaneous new features and changes: | 
 |      * In -reflect mode, the libvncclient connection can now have the | 
 |        pixel format modified via the environment variables | 
 |        X11VNC_REFLECT_bitsPerSample, X11VNC_REFLECT_samplesPerPixel, and | 
 |        X11VNC_REFLECT_bytesPerPixel | 
 |      * In -create mode the following environment variables are added to | 
 |        fine tune the behavior: FIND_DISPLAY_NO_LSOF: do not use lsof(1) | 
 |        to try to determine the Linux VT, FIND_DISPLAY_NO_VT_FIND: do not | 
 |        try to determine the Linux VT at all, X11VNC_CREATE_LC_ALL_C_OK: | 
 |        do not bother undoing the setting LC_ALL=C that the create_display | 
 |        script sets. The performance of the -create script has been | 
 |        improved for large installations (100's of user sessions on one | 
 |        machine.) | 
 |      * In -unixpw mode, one can now Tab from login: to Password. | 
 |      * An environment variable, X11VNC_SB_FACTOR, allows one to scale the | 
 |        -sb screenblank sleep time from the default 2 secs. | 
 |      * An experimental option -unixsock is available for testing. Note, | 
 |        however, that it requires a manual change to | 
 |        libvncserver/rfbserver.c for it to work. | 
 |      * Documented that -grabkbd is no longer working with some/most | 
 |        window managers (it can prevent resizing and menu posting.) | 
 |  | 
 |  | 
 |    Here are some features that appeared in the 0.9.12 release (Sep/2010): | 
 |      * One can now specify the maximum number of displays that can be | 
 |        created in -create mode via the env. var. | 
 |        X11VNC_CREATE_MAX_DISPLAYS | 
 |      * The X11VNC_NO_LIMIT_SHM env. var. is added to skip any automatic | 
 |        shared memory reduction. | 
 |      * The kdm display manager is now detected when trying not to get | 
 |        killed by the display manager. | 
 |      * A compile time bug is fixed so that configuring using | 
 |        --with-system-libvncserver pointing to LibVNCServer 0.9.7 works | 
 |        again. A bug from forced use of Xdefs.h is worked around. | 
 |  | 
 |  | 
 |    Here are some features that appeared in the 0.9.11 release (Aug/2010): | 
 |      * The source tree is synchronized with the most recent libvncclient | 
 |        (this only affects -reflect mode.) Build is fixed for | 
 |        incompatibilities when using an external LibVNCServer (e.g. | 
 |        ./configure --with-system-libvncserver...) Please help test these | 
 |        build and runtime aspects and report back what you find, thanks. | 
 |      * The SSL enabled Java VNC Viewer Makefile has been modified so that | 
 |        the jar files that are built are compatible back to Java 1.4. | 
 |      * In -create/-unixpw mode, the env. var. FD_USERPREFS may be set to | 
 |        a filename in the user's home directory that includes default | 
 |        username:options values (so the options do not need to be typed | 
 |        every time at the login prompt.) | 
 |      * In -reflect mode cursor position updates are now handled | 
 |        correctly. | 
 |  | 
 |  | 
 |    Here are some features that appeared in the 0.9.10 release (May/2010): | 
 |      * The included SSL enabled Java applet viewer now supports Chained | 
 |        SSL Certificates. The debugCerts=yes applet parameter aids | 
 |        troubleshooting certificate validation. The x11vnc -ssl mode has | 
 |        always supported chained SSL certificates (simply put the | 
 |        intermediate certificates, in order, after the server certificate | 
 |        in the pem file.) | 
 |      * A demo CGI script desktop.cgi shows how to create an SSL | 
 |        encrypted, multi-user x11vnc web login desktop service. The script | 
 |        requires x11vnc version 0.9.10. The user logs into a secure web | 
 |        site and gets his/her own virtual desktop (Xvfb.) x11vnc's SSL | 
 |        enabled Java Viewer Applet is launched by the web browser for | 
 |        secure viewing (and so no software needs to be installed on the | 
 |        viewer-side.) One can use the desktop.cgi script for ideas to | 
 |        create their own fancier or customized web login desktop service | 
 |        (e.g. user-creation, PHP, SQL, specialized desktop application, | 
 |        etc.) More info here. There is also an optional 'port redirection' | 
 |        mode that allows redirection to other SSL enabled VNC servers | 
 |        running inside the firewall. | 
 |      * Built-in support for IPv6 (128 bit internet addresses) is now | 
 |        provided. See the -6 and -connect options for details. | 
 |        Additionally, in case there are still problems with built-in IPv6 | 
 |        support, a transitional tool is provided in inet6to4 that allows | 
 |        x11vnc (or any other IPv4 application) to receive connections over | 
 |        IPv6. | 
 |      * The Xdummy wrapper script for Xorg's dummy driver is updated and | 
 |        no longer requires being run as root. New service options are | 
 |        provided to select Xdummy over Xvfb as the virtual X server to be | 
 |        created. | 
 |      * The "%" unix password verification tricks for the -unixpw option | 
 |        are now documented. They have also been extended to run a command | 
 |        as the user if one sets the environment variable UNIXPW_CMD. The | 
 |        desktop.cgi demo script takes advantage of this new feature. | 
 |      * A bug has been fixed that would prevent the Java applet viewer | 
 |        from being downloaded successfully in single-port HTTPS/VNC inetd | 
 |        mode. The env. var. X11VNC_HTTPS_DOWNLOAD_WAIT_TIME can be used to | 
 |        adjust for how many seconds a -inetd or -https httpd download is | 
 |        waited for (default 15 seconds.) The applet will now autodetect | 
 |        x11vnc and use GET=1 for faster connecting. Many other | 
 |        improvements and fixes. | 
 |      * The TightVNC security type (TightVNC features enabler) now works | 
 |        for RFB version 3.8. | 
 |      * The X property X11VNC_TRAP_XRANDR can be set on a desktop to force | 
 |        x11vnc to use the -xrandr screen size change trapping code. | 
 |      * New remote control query options: pointer_x, pointer_y, | 
 |        pointer_same, pointer_root, and pointer_mask. A demo script using | 
 |        them misc/panner.pl is provided. | 
 |      * The -sslScripts option prints out the SSL certificate management | 
 |        scripts. | 
 |  | 
 |  | 
 |    Here are some features that appeared in the 0.9.9 release (Dec/2009): | 
 |      * The -unixpw_system_greeter option, when used in combined unixpw | 
 |        and XDMCP FINDCREATEDISPLAY mode (for example: -xdmsvc), enables | 
 |        the user to press Escape to jump directly to the XDM/GDM/KDM login | 
 |        greeter screen. This way the user avoids entering his unix | 
 |        password twice at X session creation time. Also, the unixpw login | 
 |        panel now has a short help displayed if the user presses 'F1'. | 
 |      * x11vnc now tries to be a little bit more aggressive in keeping up | 
 |        with VNC client's framebuffer update requests. Some broken VNC | 
 |        clients like Eggplant and JollysFastVNC continuously spray these | 
 |        requests at VNC servers (regardless of whether they have received | 
 |        any updates or not.) Under some circumstances this could lead to | 
 |        x11vnc falling behind. The -extra_fbur option allows one to fine | 
 |        tune the setting. Additionally, one may also dial down delays: | 
 |        e.g. "-defer 5" and "-wait 5" (or to 1 or even 0) or -nonap or | 
 |        -allinput to keep up with these VNC clients at the expense of | 
 |        increased system load. | 
 |      * Heuristics are applied to try to determine if the X display is | 
 |        currently in a Display Manager Greeter Login panel (e.g. GDM) If | 
 |        so, x11vnc's creation of any windows and use of XFIXES are | 
 |        delayed. This is to try to avoid x11vnc being killed after the | 
 |        user logs in if the GDM KillInitClients=true is in effect. So one | 
 |        does not need to set KillInitClients=false. Note that in recent | 
 |        GDM the KillInitClients option has been removed. Also delayed is | 
 |        the use of the XFIXES cursor fetching functionality; this avoids | 
 |        an Xorg bug that causes Xorg to crash right after the user logs | 
 |        in. | 
 |      * A new option -findauth runs the FINDDISPLAY script that applies | 
 |        heuristics that try to determine the XAUTHORITY file. The use of | 
 |        '-auth guess' will use the XAUTHORITY that -findauth reveals. This | 
 |        can be handy in with the lastest GDM where the ability to store | 
 |        cookies in ~/.Xauthority has been removed. If x11vnc is running as | 
 |        root (e.g. inetd) and you add -env FD_XDM=1 to the above -findauth | 
 |        or -auth guess command lines, it will find the correct XAUTHORITY | 
 |        for the given display (this works for XDM/GDM/KDM if the login | 
 |        greeter panel is up or if someone has already logged into an X | 
 |        session.) | 
 |      * The FINDDISPLAY and FINDCREATEDISPLAY modes (i.e. "-display | 
 |        WAIT:cmd=...", -find, -create) now work correctly for the | 
 |        user-supplied login program scheme "-unixpw_cmd ...", as long as | 
 |        the login program supports running commands specified in the | 
 |        environment variable "RFB_UNIXPW_CMD_RUN" as the logged-in user. | 
 |        The mode "-unixpw_nis ..." has also been made more consistent. | 
 |      * The -stunnel option (like -ssl but uses stunnel as an external | 
 |        helper program) now works with the -ssl "SAVE" and "TMP" special | 
 |        certificate names. The -sslverify and -sslCRL options now work | 
 |        correctly in -stunnel mode. Single port HTTPS connections are also | 
 |        supported for this mode. | 
 |      * There is an experimental Application Sharing mode that improves | 
 |        upon the -id/-sid single window sharing: -appshare (run "x11vnc | 
 |        -appshare -help" for more info.) It is still very primitive and | 
 |        approximate, but at least it displays multiple top-level windows. | 
 |      * The remote control command -R can be used to instruct x11vnc to | 
 |        resend its most recent copy of the Clipboard, Primary, or | 
 |        Cutbuffer selections: "x11vnc -R resend_clipboard", "x11vnc -R | 
 |        resend_primary", and "x11vnc -R resend_cutbuffer". | 
 |      * The fonts in the GUI (-gui) can now by set via environment | 
 |        variables, e.g. -env X11VNC_FONT_BOLD='Helvetica -16 bold' and | 
 |        -env X11VNC_FONT_FIXED='Courier -14'. | 
 |      * The XDAMAGE mechanism is now automatically disabled for a period | 
 |        of time if a game or screensaver generates too many XDAMAGE | 
 |        rectangles per second. This avoids the X11 event queue from | 
 |        soaking up too much memory. | 
 |      * There is an experimental workaround: "-env X11VNC_WATCH_DX_DY=1" | 
 |        that tries to avoid problems with poorly constructed menu themes | 
 |        that place the initial position of the mouse cursor inside a menu | 
 |        item's active zone. More information can be found here. | 
 |  | 
 |  | 
 |    Here are some features that appeared in the 0.9.8 release (Jul/2009): | 
 |      * Stability improvements to -threads mode. Running x11vnc this way | 
 |        is more reliable now. Threaded operation sometimes gives better | 
 |        interactive response and faster updates: try it out. The threaded | 
 |        mode now supports multiple VNC viewers using the same VNC | 
 |        encoding. The threaded mode can also yield a performance | 
 |        enhancement in the many client case (e.g. class-room broadcast.) | 
 |        We have tested with 30 to 50 simultaneous clients. See also | 
 |        -reflect. | 
 |        For simultaneous clients: the ZRLE encoding is thread safe on all | 
 |        platforms, and the Tight and Zlib encodings are currently only | 
 |        thread safe on Linux where thread local storage, __thread, is | 
 |        used. If your non-Linux system and compiler support __thread one | 
 |        can supply -DTLS=__thread to enable it. When there is only one | 
 |        connected client, all encodings are safe on all platforms. Note | 
 |        that some features (e.g. scroll detection and -ncache) may be | 
 |        disabled or run with reduced functionality in -threads mode. | 
 |      * Automatically tries to work around an Xorg server and GNOME bug | 
 |        involving infinitely repeating keys when turning off key | 
 |        repeating. Use -repeat if the automatic workaround fails. | 
 |      * Improved reliability of the Single Port SSL VNC and HTTPS java | 
 |        viewer applet delivery mechanism. | 
 |      * The -clip mode works under -rawfb. | 
 |  | 
 |  | 
 |    Here are some features that appeared in the 0.9.7 release (Mar/2009): | 
 |      * Support for polling Linux Virtual Terminals (also called virtual | 
 |        consoles) directly instead of using /dev/fb. The option to use is, | 
 |        for example, "-rawfb vt2" for Virtual Terminal 2, etc. In this | 
 |        case the special file /dev/vcsa2 is used to retrieve vt2's current | 
 |        text. Text and colors are shown, but no graphics. | 
 |      * Support for less than 8 bits per pixel framebuffers (e.g. 4 or 1 | 
 |        bpp) in the -rawfb mode. | 
 |      * The SSL enabled UltraVNC Java viewer applet now has a [Home] entry | 
 |        in the "drives" drop down menu. This menu can be configured with | 
 |        the ftpDropDown applet parameter. All of the applet parameters are | 
 |        documented in classes/ssl/README. | 
 |      * Experimental support for VirtualGL's TurboVNC (an enhanced | 
 |        TightVNC for fast LAN high framerate usage.) | 
 |      * The CUPS Terminal Services helper mode has been improved. | 
 |      * Improvements to the -ncache_cr that allows smooth opaque window | 
 |        motions using the 'copyrect' encoding when using -ncache mode. | 
 |      * The -rmflag option enables a way to indicate to other processes | 
 |        x11vnc has exited. | 
 |      * Reverse connections using anonymous Diffie Hellman SSL encryption | 
 |        now work. | 
 |  | 
 |  | 
 |    Here are some features that appeared in the 0.9.6 release (Dec/2008): | 
 |      * Support for VeNCrypt SSL/TLS encrypted connections. It is enabled | 
 |        by default in the -ssl mode. VNC Viewers like vinagre, | 
 |        gvncviewer/gtk-vnc, the vencrypt package, SSVNC, and others | 
 |        support this encryption mode. It can also be used with the -unixpw | 
 |        option to enable Unix username and password authentication | 
 |        (VeNCrypt's "*Plain" modes.) A similar but older VNC security type | 
 |        "ANONTLS" (used by vino) is supported as well. See the -vencrypt | 
 |        and -anontls options for additional control. The difference | 
 |        between x11vnc's normal -ssl mode and VeNCrypt is that the former | 
 |        wraps the entire VNC connection in SSL (like HTTPS does for HTTP, | 
 |        i.e. "vncs://") while VeNCrypt switches on the SSL/TLS at a | 
 |        certain point during the VNC handshake. Use -sslonly to disable | 
 |        both VeNCrypt and ANONTLS (vino.) | 
 |      * The "-ssl ANON" option enables Anonymous Diffie-Hellman (ADH) key | 
 |        exchange for x11vnc's normal SSL/TLS operation. Note that | 
 |        Anonymous Diffie-Hellman uses encryption for privacy, but provides | 
 |        no authentication and so is susceptible to Man-In-The-Middle | 
 |        attacks (and so we do not recommend it: we prefer you use "-ssl | 
 |        SAVE", etc. and have the VNC viewer verify the cert.) The ANONTLS | 
 |        mode (vino) only supports ADH. VeNCrypt mode supports both ADH and | 
 |        regular X509 SSL certificates modes. For these ADH is enabled by | 
 |        default. See -vencrypt and -anontls for how to disable ADH. | 
 |      * For x11vnc's SSL/TLS modes, one can now specify a Certificate | 
 |        Revocation List (CRL) with the -sslCRL option. This will only be | 
 |        useful for wide deployments: say a company-wide x11vnc SSL access | 
 |        deployment using a central Certificate Authority (CA) via | 
 |        -sslGenCA and -sslGenCert. This way if a user has his laptop lost | 
 |        or stolen, you only have to revoke his key instead of creating a | 
 |        new Certificate Authority and redeploying new keys to all users. | 
 |      * The default SSL/TLS mode, "-ssl" (no pem file parameter supplied), | 
 |        is now the same as "-ssl SAVE" and will save the generated | 
 |        self-signed cert in "~/.vnc/certs/server.pem". Previously "-ssl" | 
 |        would create a temporary self-signed cert that was discarded when | 
 |        x11vnc exited. The reason for the change is to at least give the | 
 |        chance for the VNC Viewer side (e.g. SSVNC) to remember the cert | 
 |        to authenticate subsequent connections to the same x11vnc server. | 
 |        Use "-ssl TMP" to regain the previous behavior. Use "-ssl | 
 |        SAVE_NOPROMPT" to avoid being prompted about using passphrase when | 
 |        the certificate is created. | 
 |      * The option -http_oneport enables single-port HTTP connections via | 
 |        the Java VNC Viewer. So, for example, the web browser URL | 
 |        "http://myhost.org:5900" works the same as | 
 |        "http://myhost.org:5800", but with the convenience of only | 
 |        involving one port instead of two. This works for both unencrypted | 
 |        connections and for SSH tunnels (see -httpsredir if the tunnel | 
 |        port differs.) Note that HTTPS single-port operation in -ssl SSL | 
 |        encrypted mode has been available since x11vnc version 0.8.3. | 
 |      * For the -avahi/-zeroconf Service Advertizing mode, if x11vnc was | 
 |        not compiled with the avahi-client library, then an external | 
 |        helper program, either avahi-publish(1) (on Unix) or dns-sd(1) (on | 
 |        Mac OS X), is used instead. | 
 |      * The "-rfbport PROMPT" option will prompt the user via the GUI to | 
 |        select the VNC port (e.g. 5901) to listen on, and a few other | 
 |        basic settings. This enables a handy GUI mode for naive users: | 
 |    x11vnc -gui tray=setpass -rfbport PROMPT -logfile $HOME/.x11vnc.log.%VNCDISP | 
 | LAY | 
 |        suitable for putting in a launcher or menu, e.g. x11vnc.desktop. | 
 |        The -logfile expansion is new too. In the GUI, the tray=setpass | 
 |        Properties panel has been improved. | 
 |      * The -solid solid background color option now works for the Mac OS | 
 |        X console. | 
 |      * The -reopen option instructs x11vnc to try to reopen the X display | 
 |        if it is prematurely closed by, say, the display manager (e.g. | 
 |        GDM.) | 
 |  | 
 |  | 
 |    Here are some features that appeared in the 0.9.5 release (Oct/2008): | 
 |      * Symmetric key encryption ciphers. ARC4, AES-128, AES-256, | 
 |        blowfish, and 3des are supported. Salt and initialization vector | 
 |        seeding is provided. These compliment the more widely used SSL and | 
 |        SSH encryption access methods. SSVNC also supports these | 
 |        encryption modes. | 
 |      * Scaling differently along the X- and Y-directions. E.g. "-scale | 
 |        1280x1024" or "-scale 0.8x0.75"    Also, "-geometry WxH" is an | 
 |        alias for "-scale WxH" | 
 |      * By having SSVNC version 1.0.21 or later available in your $PATH, | 
 |        the -chatwindow option allows a UltraVNC Text Chat window to | 
 |        appear on the local X11 console/display (this way the remote | 
 |        viewer can chat with the person at the physical display; e.g. | 
 |        helpdesk mode.) This also works on the Mac OS X console if the | 
 |        Xquartz X11 server (enabled by default on leopard) is running for | 
 |        the chatwindow. | 
 |      * The HTTP Java viewer applet jar, classes/VncViewer.jar, has been | 
 |        updated with an improved implementation based on the code used by | 
 |        the classes/ssl applets. | 
 |  | 
 |  | 
 |    Here are some features that appeared in the 0.9.4 release (Sep/2008): | 
 |      * Improvements to the -find and -create X session finding or | 
 |        creating modes: new desktop types and service redirection options. | 
 |        Personal cupsd daemon and SSH port redirection helper for use with | 
 |        SSVNC's Terminal Services feature. | 
 |      * Reverse VNC connections via -connect work in the -find, -create | 
 |        and related -display WAIT:... modes. | 
 |      * Reverse VNC connections (either normal or SSL) can use a Web Proxy | 
 |        or a SOCKS proxy, or a SSH connection, or even a CGI URL to make | 
 |        the outgoing connection. See: -proxy. Forward connections can also | 
 |        use: -ssh. | 
 |      * Reverse VNC connections via the UltraVNC repeater proxy (either | 
 |        normal or SSL) are supported. Use either the "-connect | 
 |        repeater=ID:NNNN+host:port" or "-connect | 
 |        repeater://host:port+ID:NNNN" notation. The SSVNC VNC viewer also | 
 |        supports the UltraVNC repeater. Also, a perl repeater implemention | 
 |        is here: ultravnc_repeater.pl | 
 |      * Support for indexed colormaps (PseudoColor) with depths other than | 
 |        8 (from 1 to 16 now work) for non-standard hardware. Option | 
 |        "-advertise_truecolor" to handle some workaround in this mode. | 
 |      * Support for the ZYWRLE encoding, this is the RealVNC ZRLE encoding | 
 |        extended to do motion video and photo regions more efficiently by | 
 |        way of a Wavelet based transformation. | 
 |      * The -finddpy and -listdpy utilities help to debug and configure | 
 |        the -find, -create, and -display WAIT:... modes. | 
 |      * Some automatic detection of screen resizes are handled even if the | 
 |        -xrandr option is not supplied. | 
 |      * The -autoport options gives more control over the VNC port x11vnc | 
 |        chooses. | 
 |      * The -ping secs can be used to help keep idle connections alive. | 
 |      * Pasting of the selection/clipboard into remote applications (e.g. | 
 |        Java) has been improved. | 
 |      * Fixed a bug if a client disconnects during the 'speed-estimation' | 
 |        phase. | 
 |      * To unset Caps_Lock, Num_Lock and raise all keys in the X server | 
 |        use -clear_all. | 
 |      * Usage with dvorak keyboards has been improved. See also: -xkb. | 
 |      * The Java Viewer applet source code is now included in the | 
 |        x11vnc-0.9.*.tar.gz tarball. This means you can now build the Java | 
 |        viewer applet jar files from source. If you stopped shipping the | 
 |        Java viewer applet jar files due to lack of source code, you can | 
 |        start again. | 
 |  | 
 |  | 
 |    Here are some features that appeared in the 0.9.3 release (Oct/2007): | 
 |      * Viewer-side pixmap caching. A large area of pixels (at least 2-3 | 
 |        times as big as the framebuffer itself; the bigger the better... | 
 |        default is 10X) is placed below the framebuffer to act as a | 
 |        buffer/cache area for pixel data. The VNC CopyRect encoding is | 
 |        used to move it around, so any viewer can take advantage of it. | 
 |        Until we start modifying viewers you will be able to see the cache | 
 |        area if you scroll down (this makes it easier to debug!) For | 
 |        testing the default is "-ncache 10". The unix Enhanced TightVNC | 
 |        Viewer ssvnc has a nice -ycrop option to help hide the pixel cache | 
 |        area from view. | 
 |  | 
 |  | 
 |    Here are some features that appeared in the 0.9.2 release (Jun/2007): | 
 |      * Building with no OpenSSL libssl available (or with --without-ssl) | 
 |        has been fixed. | 
 |      * One can configure x11vnc via "./configure | 
 |        --with-system-libvncserver" to use a system installed libvncserver | 
 |        library instead of the one bundled in the release tarball. | 
 |      * If UltraVNC file transfer or chat is detected, then VNC clients | 
 |        are "pinged" more often to prevent these side channels from | 
 |        becoming serviced too infrequently. | 
 |      * In -unixpw mode in the username and password dialog no text will | 
 |        be echoed if the first character sent is "Escape". This enables a | 
 |        convenience feature in SSVNC to send the username and password | 
 |        automatically. | 
 |  | 
 |  | 
 |    Here are some features that appeared in the 0.9.1 release (May/2007): | 
 |      * The UltraVNC Java viewer has been enhanced to support SSL (as the | 
 |        TightVNC viewer had been previously.) The UltraVNC Java supports | 
 |        ultravnc filetransfer, and so can be used as a VNC viewer on Unix | 
 |        that supports ultravnc filetransfer. It is in the | 
 |        classes/ssl/UltraViewerSSL.jar file (that is pointed to by | 
 |        ultra.vnc.) The signed applet SignedUltraViewerSSL.jar version | 
 |        (pointed to by ultrasigned.vnc) will be needed to access the local | 
 |        drive if you are using it for file transfer via a Web browser. | 
 |        Some other bugs in the UltraVNC Java viewer were fixed and a few | 
 |        improvements to the UI made. | 
 |      * A new Unix username login mode for VNC Viewers authenticated via a | 
 |        Client SSL Certificate: "-users sslpeer=". The emailAddress | 
 |        subject field is inspected for username@hostname and then acts as | 
 |        though "-users +username" has been supplied. This way the Unix | 
 |        username is identified by (i.e. simply extracted from) the Client | 
 |        SSL Certificate. This could be useful with -find, -create and -svc | 
 |        modes if you are also have set up and use VNC Client SSL | 
 |        Certificate authentication. | 
 |      * For external display finding/creating programs (e.g. WAIT:cmd=...) | 
 |        if the VNC Viewer is authenticated via a Client SSL Certificate, | 
 |        then that Certificate is available in the environment variable | 
 |        RFB_SSL_CLIENT_CERT. | 
 |  | 
 |  | 
 |    Here are some features that appeared in the 0.9 release (Apr/2007): | 
 |      * VNC Service advertising via mDNS / ZeroConf / BonJour with the | 
 |        Avahi client library. Enable via "-avahi" or "-zeroconf". | 
 |      * Implementations of UltraVNC's TextChat, SingleWindow, and | 
 |        ServerInput extensions (requires ultravnc viewer or ssvnc Unix | 
 |        viewer.) They toggle the selection of a single window (-id), and | 
 |        disable (friendly) user input and viewing (monitor blank) at the | 
 |        VNC server. | 
 |      * Short aliases "-find", "-create", "-svc", and "-xdmsvc" for | 
 |        commonly used FINDCREATEDISPLAY usage modes. | 
 |      * Reverse VNC connections (viewer listening) now work in SSL (-ssl) | 
 |        mode. | 
 |      * New options to control the Monitor power state and keyboard/mouse | 
 |        grabbing: -forcedpms, -clientdpms, -noserverdpms, and -grabalways. | 
 |      * A simple way to emulate inetd(8) to some degree via the "-loopbg" | 
 |        option. | 
 |      * Monitor the accuracy of XDAMAGE and apply "-noxdamage" if it is | 
 |        not working well. OpenGL applications like like beryl and MythTv | 
 |        have been shown to make XDAMAGE not work properly. | 
 |      * For Java SSL connections involving a router/firewall port | 
 |        redirection, an option -httpsredir to spare the user from needing | 
 |        to include &PORT=NNN in the browser URL. | 
 |  | 
 |  | 
 |    Here are some features that appeared in the 0.8.4 release (Feb/2007): | 
 |      * Native Mac OS X Aqua/Quartz support. (i.e. OSXvnc alternative; | 
 |        some activities are faster) | 
 |      * A new login mode: "-display WAIT:cmd=FINDCREATEDISPLAY -unixpw | 
 |        ..." that will Create a new X session (either virtual or real and | 
 |        with or without a display manager, e.g. kdm) for the user if it | 
 |        cannot find the user's X session display via the FINDDISPLAY | 
 |        method. See the -svc and the -xdmsvc aliases. | 
 |      * x11vnc can act as a VNC reflector/repeater using the "-reflect | 
 |        host:N" option. Instead of polling an X display, the remote VNC | 
 |        Server host:N is connected to and re-exported via VNC. This is | 
 |        intended for use in broadcasting a display to many (e.g. > 16; | 
 |        classroom or large demo) VNC viewers where bandwidth and other | 
 |        resources are conserved by spreading the load over a number of | 
 |        repeaters. | 
 |      * Wireframe copyrect detection for local user activity (e.g. someone | 
 |        sitting at the physical display moving windows) Use | 
 |        -nowireframelocal to disable. | 
 |      * The "-N" option couples the VNC Display number to the X Display | 
 |        number. E.g. if your X DISPLAY is :2 then the VNC display will be | 
 |        :2 (i.e. using port 5902.) If that port is taken x11vnc will exit. | 
 |      * Option -nodpms to avoid problems with programs like KDE's | 
 |        kdesktop_lock that keep restarting the screen saver every few | 
 |        seconds. | 
 |      * To automatically fix the common mouse motion problem on XINERAMA | 
 |        (multi-headed) displays, the -xwarppointer option is enabled by | 
 |        default when XINERAMA is active. | 
 |  | 
 |    If you have a Mac please try out the native Mac OS X support, build | 
 |    with "./configure --without-x", or download a binary mentioned above, | 
 |    (even if you don't plan on ever using it in this mode!), and let me | 
 |    know how it went. Thanks. | 
 |  | 
 |  | 
 |    Here are some features that appeared in the 0.8.3 release (Nov/2006): | 
 |      * The -ssl option provides SSL encryption and authentication | 
 |        natively via the www.openssl.org library. One can use from a | 
 |        simple self-signed certificate server certificate up to full CA | 
 |        and client certificate authentication schemes. | 
 |      * Similar to -ssl, the -stunnel option starts up a SSL tunnel server | 
 |        stunnel (that must be installed separately on the system: | 
 |        stunnel.mirt.net ) to allow only encrypted SSL connections from | 
 |        the network. | 
 |      * The -sslverify option allows for authenticating VNC clients via | 
 |        their certificates in either -ssl or -stunnel modes. | 
 |      * Certificate creation and management tools are provide in the | 
 |        -sslGenCert, -sslGenCA, and related options. | 
 |      * An SSL enabled Java applet VNC Viewer applet is provided by x11vnc | 
 |        in classes/ssl/VncViewer.jar. In addition to normal HTTP, the | 
 |        applet may be loaded into the web browser via HTTPS (HTTP over | 
 |        SSL.) (one can use the VNC port, e.g. https://host:5900/, or also | 
 |        the separate -https port option.) A wrapper shell script | 
 |        ss_vncviewer is also provided that sets up a stunnel client-side | 
 |        tunnel on Unix systems. See Enhanced TightVNC Viewer (SSVNC) for | 
 |        other SSL/SSH viewer possibilities. | 
 |      * The -unixpw option supports Unix username and password | 
 |        authentication (a simpler variant is the -unixpw_nis option that | 
 |        works in environments where the encrypted passwords are readable, | 
 |        e.g. NIS.) The -ssl or -localhost + -stunnel options are enforced | 
 |        in this mode to prevent password sniffing. As a convenience, these | 
 |        requirements are lifted if a SSH tunnel can be deduced (but | 
 |        -localhost still applies.) | 
 |      * Coupling -unixpw with "-display WAIT:cmd=FINDDISPLAY" or "-display | 
 |        WAIT:cmd=FINDCREATEDISPLAY" provides a way to allow a user to | 
 |        login with their UNIX password and have their display connected to | 
 |        automatically. See the -svc and the -xdmsvc aliases. | 
 |      * Hooks are provided in the -unixpw_cmd and "-passwdfile | 
 |        cmd:,custom:..." options to allow you to supply your own | 
 |        authentication and password lookup programs. | 
 |      * x11vnc can be configured and built to not depend on X11 libraries | 
 |        "./configure --without-x" for -rawfb only operation (e.g. embedded | 
 |        linux console devices.) | 
 |      * The -rotate option enables you to rotate or reflect the screen | 
 |        before exporting via VNC. This is intended for use on handhelds | 
 |        and other devices where the rotation orientation is not "natural". | 
 |      * The "-ultrafilexfer" alias is provided and improved UltraVNC | 
 |        filetransfer rates have been achieved. | 
 |      * Under the "-connect_or_exit host" option x11vnc will exit | 
 |        immediately unless the reverse connection to host succeeds. The | 
 |        "-rfbport 0" option disables TCP listening for connections (useful | 
 |        for this mode.) | 
 |      * The "-rawfb rand" and "-rawfb none" options are useful for testing | 
 |        automation scripts, etc., without requiring a full desktop. | 
 |      * Reduced spewing of information at startup, use "-verbose" (also | 
 |        "-v") to turn it back on for debugging or if you are going to send | 
 |        me a problem report. | 
 |  | 
 |    Here are some Previous Release Notes | 
 |      _________________________________________________________________ | 
 |  | 
 |     Some Notes: | 
 |  | 
 |    Both a client and a server:   It is sometimes confusing to people that | 
 |    x11vnc is both a client and a server at the same time. It is an X | 
 |    client because it connects to the running X server to do the screen | 
 |    polls. Think of it as a rather efficient "screenshot" program running | 
 |    continuously. It is a server in the sense that it is a VNC server that | 
 |    VNC viewers on the network can connect to and view the screen | 
 |    framebuffer it manages. | 
 |  | 
 |    When trying to debug problems, remember to think of both roles. E.g. | 
 |    "how is x11vnc connecting to the X server?", "how is the vncviewer | 
 |    connecting to x11vnc?", "what permits/restricts the connection?". Both | 
 |    links may have reachability, permission, and other issues. | 
 |  | 
 |    Network performance:   Whether you are using Xvnc or x11vnc it is | 
 |    always a good idea to have a solid background color instead of a | 
 |    pretty background image. Each and every re-exposure of the background | 
 |    must be resent over the network: better to have that background be a | 
 |    solid color that compresses very well compared to a photo image. (This | 
 |    is one place where the X protocol has an advantage over the VNC | 
 |    protocol.) I suggest using xsetroot, dtstyle or similar utility to set | 
 |    a solid background while using x11vnc. You can turn the pretty | 
 |    background image back on when you are using the display directly. | 
 |    Update: As of Feb/2005 x11vnc has the -solid [color] option that works | 
 |    on recent GNOME, KDE, and CDE and also on classic X (background image | 
 |    is on the root window.) Update: As of Oct/2007 x11vnc has the -ncache | 
 |    option that does a reasonable job caching the background (and other) | 
 |    pixmap data on the viewer side. | 
 |  | 
 |    I also find the TightVNC encoding gives the best response for my usage | 
 |    (Unix <-> Unix over cable modem.) One needs a tightvnc-aware vncviewer | 
 |    to take advantage of this encoding. | 
 |  | 
 |    TCP port issues:   Notice the lines | 
 |   18/07/2003 14:36:31 Autoprobing selected port 5900 | 
 |   PORT=5900 | 
 |  | 
 |    in the output. 5900 is the default VNC listening port (just like 6000 | 
 |    is X11's default listening port.) Had port 5900 been taken by some | 
 |    other application, x11vnc would have next tried 5901. That would mean | 
 |    the viewer command above should be changed to vncviewer | 
 |    far-away.east:1. You can force the port with the "-rfbport NNNN" | 
 |    option where NNNN is the desired port number. If that port is already | 
 |    taken, x11vnc will exit immediately. The "-N" option will try to match | 
 |    the VNC display number to the X display.   (also see the "SunRay | 
 |    Gotcha" note below) | 
 |  | 
 |    Options:   x11vnc has (far too) many features that may be activated | 
 |    via its command line options. Useful options are, e.g., -scale to do | 
 |    server-side scaling, and -rfbauth passwd-file to use VNC password | 
 |    protection (the vncpasswd or storepasswd programs, or the x11vnc | 
 |    -storepasswd option can be used to create the password file.) | 
 |  | 
 |    Algorithm:   How does x11vnc do it? Rather brute-forcedly: it | 
 |    continuously polls the X11 framebuffer for changes using | 
 |    XShmGetImage(). When changes are discovered, it instructs libvncserver | 
 |    which rectangular regions of the framebuffer have changed, and | 
 |    libvncserver compresses the changes and sends them off to any | 
 |    connected VNC viewers. A number of applications do similar things, | 
 |    such as x0rfbserver, krfb, x0vncserver, vino. x11vnc uses a 32 x 32 | 
 |    pixel tile model (the desktop is decomposed into roughly 1000 such | 
 |    tiles), where changed tiles are found by pseudo-randomly polling 1 | 
 |    pixel tall horizontal scanlines separated vertically by 32 pixels. | 
 |    This is a surprisingly effective algorithm for finding changed | 
 |    regions. For keyboard and mouse user input the XTEST extension is used | 
 |    to pass the input events to the X server. To detect XBell "beeps" the | 
 |    XKEYBOARD extension is used. If available, the XFIXES extension is | 
 |    used to retrieve the current mouse cursor shape. Also, if available | 
 |    the X DAMAGE extension is used to receive hints from the X server | 
 |    where modified regions on the screen are. This greatly reduces the | 
 |    system load when not much is changing on the screen and also improves | 
 |    how quickly the screen is updated. | 
 |  | 
 |    Barbershop mirrors effect:   What if x11vnc is started up, and | 
 |    vncviewer is then started up on the same machine and displayed on the | 
 |    same display x11vnc is polling? One might "accidentally" do this when | 
 |    first testing out the programs. You get an interesting | 
 |    recursive/feedback effect where vncviewer images keep popping up each | 
 |    one contained in the previous one and slightly shifted a bit by the | 
 |    window manager decorations. There will be an even more interesting | 
 |    effect if -scale is used. Also, if the XKEYBOARD is supported and the | 
 |    XBell "beeps" once, you get an infinite loop of beeps going off. | 
 |    Although all of this is mildly exciting it is not much use: you will | 
 |    normally run and display the viewer on a different machine! | 
 |      _________________________________________________________________ | 
 |  | 
 |     Sun Ray Notes: | 
 |  | 
 |    You can run x11vnc on your (connected or disconnected) SunRay session. | 
 |    Here are some notes on SunRay usage with x11vnc. | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |     Limitations: | 
 |  | 
 |      * Due to the polling nature, some activities (opaque window moves, | 
 |        scrolling), can be pretty choppy/ragged and others (exposures of | 
 |        large areas) slow. Experiment with interacting a bit differently | 
 |        than you normally do to minimize the effects (e.g. do fullpage | 
 |        paging rather than line-by-line scrolling, and move windows in a | 
 |        single, quick motion.) Recent work has provided the | 
 |        -scrollcopyrect and -wireframe speedups using the CopyRect VNC | 
 |        encoding and other things, but they only speed up some activities, | 
 |        not all. | 
 |      * A rate limiting factor for x11vnc performance is that graphics | 
 |        hardware is optimized for writing, not reading (x11vnc reads the | 
 |        video framebuffer for the screen image data.) The difference can | 
 |        be a factor of 10 to 1000, and so it usually takes about 0.5-1 sec | 
 |        to read in the whole video hardware framebuffer (e.g. 5MB for | 
 |        1280x1024 at depth 24 with a read rate of 5-10MB/sec.) So whenever | 
 |        activity changes most of the screen (e.g. moving or iconifying a | 
 |        large window) there is a delay of 0.5-1 sec while x11vnc reads the | 
 |        changed regions in. | 
 |        A slow framebuffer read rate will often be the performance | 
 |        bottleneck on a fast LAN (whereas on slower links the reduced | 
 |        network bandwidth becomes the bottleneck.) | 
 |        Note: A quick way to get a 2X speedup of this for x11vnc is to | 
 |        switch your X server from depth 24 (32bpp) to depth 16 (16bpp.) | 
 |        You get a 4X speedup going to 8bpp, but the lack of color cells is | 
 |        usually unacceptable. | 
 |        To get a sense of the read and write speeds of your video card, | 
 |        you can run benchmarks like: "x11perf -getimage500",  "x11perf | 
 |        -putimage500",  "x11perf -shmput500" and for XFree86 displays with | 
 |        direct graphics access the "dga" command (press "b" to run the | 
 |        benchmark and then after a few seconds press "q" to quit.) Even | 
 |        this "dd if=/dev/fb0 of=/dev/null" often gives a good estimate. | 
 |        x11vnc also prints out its estimate: | 
 |   28/02/2009 11:11:07 Autoprobing TCP port | 
 |   28/02/2009 11:11:07 Autoprobing selected port 5900 | 
 |   28/02/2009 11:11:08 fb read rate: 10 MB/sec | 
 |   28/02/2009 11:11:08 screen setup finished. | 
 |        We have seen a few cases where the hardware fb read speed is | 
 |        greater than 65 MB/sec: on high end graphics workstations from SGI | 
 |        and Sun, and also from a Linux user using nvidia proprietary | 
 |        drivers for his nvidia video card. Update 2008: thankfully, these | 
 |        sped up drivers are becoming more common on Linux and *BSD systems | 
 |        and that makes x11vnc run somewhat more quickly. Sometimes they | 
 |        have a read rate of over 400 MB/sec. | 
 |        On XFree86/Xorg it is actually possible to increase the | 
 |        framebuffer read speed considerably (10-100 times) by using the | 
 |        Shadow Framebuffer (a copy of the framebuffer is kept in main | 
 |        memory and this can be read much more quickly.) To do this one | 
 |        puts the line Option "ShadowFB" "true" in the Device section of | 
 |        the /etc/X11/XF86Config or /etc/X11/xorg.conf file. Note that this | 
 |        disables 2D acceleration at the physical display and so that might | 
 |        be unacceptable if one plays games, etc. on the machine's local | 
 |        display. Nevertheless this could be handy in some circumstances, | 
 |        e.g. if the slower speed while sitting at the physical display was | 
 |        acceptable (this seems to be true for most video cards these | 
 |        days.) Unfortunately it does not seem shadowfb can be turned on | 
 |        and off dynamically... | 
 |        Another amusing thing one can do is use Xvfb as the X server, e.g. | 
 |        "xinit $HOME/.xinitrc -- /usr/X11R6/bin/Xvfb :1 -screen 0 | 
 |        1024x768x16" x11vnc can poll Xvfb efficiently via main memory. | 
 |        It's not exactly clear why one would want to do this instead of | 
 |        using vncserver/Xvnc, (perhaps to take advantage of an x11vnc | 
 |        feature, such as framebuffer scaling or built-in SSL encryption), | 
 |        but we mention it because it may be of use for special purpose | 
 |        applications. You may need to use the "-cc 4" option to force Xvfb | 
 |        to use a TrueColor visual instead of DirectColor. See also the | 
 |        description of the -create option that does all of this | 
 |        automatically for you (be sure to install the Xvfb package, e.g. | 
 |        apt-get install xvfb.) | 
 |        Also, a faster and more accurate way is to use the "dummy" | 
 |        Xorg/XFree86 device driver (or our Xdummy wrapper script.) See | 
 |        this FAQ for details. | 
 |      * Somewhat surprisingly, the X11 mouse (cursor) shape is write-only | 
 |        and cannot be queried from the X server. So traditionally in | 
 |        x11vnc the cursor shape stays fixed at an arrow. (see the "-cursor | 
 |        X" and "-cursor some" options, however, for a partial hack for the | 
 |        root window, etc.) However, on Solaris using the SUN_OVL overlay | 
 |        extension, x11vnc can show the correct mouse cursor when the | 
 |        -overlay option is also supplied. A similar thing is done on IRIX | 
 |        as well when -overlay is supplied. | 
 |        More generally, as of Dec/2004 x11vnc supports the new XFIXES | 
 |        extension (in Xorg and Solaris 10) to query the X server for the | 
 |        exact cursor shape, this works pretty well except that cursors | 
 |        with transparency (alpha channel) need to approximated to solid | 
 |        RGB values (some cursors look worse than others.) | 
 |      * Audio from applications is of course not redirected (separate | 
 |        redirectors do exist, e.g. esd, see the FAQ on this below.) The | 
 |        XBell() "beeps" will work if the X server supports the XKEYBOARD | 
 |        extension. (Note that on Solaris XKEYBOARD is disabled by default. | 
 |        Passing +kb to Xsun enables it.) | 
 |      * The scroll detection algorithm for the -scrollcopyrect option can | 
 |        give choppy or bunched up transient output and occasionally | 
 |        painting errors. | 
 |      * Using -threads can expose some bugs/crashes in libvncserver. | 
 |  | 
 |    Please feel free to contact me if you have any questions, problems, or | 
 |    comments about x11vnc, etc. Please be polite, thorough, and not | 
 |    demanding (sadly, the number of people contacting me that are rude and | 
 |    demanding is increasing dramatically.) | 
 |    Also, some people ask if they can make a donation, see this link for | 
 |    that. | 
 | 	 | 
 | ======================================================================= | 
 | http://www.karlrunge.com/x11vnc/faq.html: | 
 |  | 
 |  | 
 |    x11vnc Home    Donations | 
 |      _________________________________________________________________ | 
 |  | 
 |     x11vnc FAQ: | 
 |  | 
 |  | 
 |    [Building and Starting] | 
 |  | 
 |    Q-1: I can't get x11vnc to start up. It says "XOpenDisplay failed | 
 |    (null)" or "Xlib: connection to ":0.0" refused by server Xlib: No | 
 |    protocol specified" and then exits. What do I need to do?  | 
 |  | 
 |    Q-2: I can't get x11vnc and/or libvncserver to compile.  | 
 |  | 
 |    Q-3: I just built x11vnc successfully, but when I use it my keystrokes | 
 |    and mouse button clicks are ignored  (I am able to move the mouse | 
 |    though.)  | 
 |  | 
 |    Q-4: Help, I need to run x11vnc on Solaris 2.5.1 (or other old | 
 |    Unix/Linux) and it doesn't compile!  | 
 |  | 
 |    Q-5: Where can I get a precompiled x11vnc binary for my Operating | 
 |    System?  | 
 |  | 
 |    Q-6: Where can I get a VNC Viewer binary (or source code) for the | 
 |    Operating System I will be viewing from?  | 
 |  | 
 |    Q-7: How can I see all of x11vnc's command line options and | 
 |    documentation on how to use them?  | 
 |  | 
 |    Q-8: I don't like typing arcane command line options every time I | 
 |    start x11vnc. What can I do? Is there a config file? Or a GUI?  | 
 |  | 
 |    Q-9: How can I get the GUI to run in the System Tray, or at least be a | 
 |    smaller, simpler icon?  | 
 |  | 
 |    Q-10: How can I get x11vnc to listen on a different port besides the | 
 |    default VNC port (5900)?  | 
 |  | 
 |    Q-11: My Firewall/Router doesn't allow VNC Viewers to connect to | 
 |    x11vnc.  | 
 |  | 
 |    Q-12: Is it possible for a VNC Viewer and a VNC Server to connect to | 
 |    each other even though both are behind Firewalls that block all | 
 |    incoming connections?  | 
 |  | 
 |    Q-13: Can I make x11vnc more quiet and also go into the background | 
 |    after starting up?  | 
 |  | 
 |    Q-14: Sometimes when a VNC viewer dies abruptly, x11vnc also dies with | 
 |    the error message like: "Broken pipe". I'm using the -forever mode and | 
 |    I want x11vnc to keep running.  | 
 |  | 
 |    Q-15: The Windows TightVNC 1.3.9 Viewer cannot connect to x11vnc.  | 
 |  | 
 |    Q-16: KDE's krdc VNC viewer cannot connect to x11vnc.  | 
 |  | 
 |    Q-17: When I start x11vnc on an Alpha Tru64 workstation the X server | 
 |    crashes!  | 
 |  | 
 |    Q-18: When running x11vnc on an IBM AIX workstation after a few | 
 |    minutes the VNC connection freezes.  | 
 |  | 
 |    Q-19: Are there any build-time customizations possible, e.g. change | 
 |    defaults, create a smaller binary, etc?  | 
 |  | 
 |    [Win2VNC Related] | 
 |  | 
 |    Q-20: I have two separate machine displays in front of me, one Windows | 
 |    the other X11: can I use x11vnc in combination with Win2VNC in | 
 |    dual-screen mode to pass the keystrokes and mouse motions to the X11 | 
 |    display?  | 
 |  | 
 |    Q-21: I am running Win2VNC on my Windows machine and "x11vnc -nofb" on | 
 |    Unix to pass keyboard and mouse to the Unix monitor. Whenever I start | 
 |    Win2VNC it quickly disconnects and x11vnc says: | 
 |    rfbProcessClientNormalMessage: read: Connection reset by peer  | 
 |  | 
 |    Q-22: Can I run "x11vnc -nofb" on a Mac OS X machine to redirect mouse | 
 |    and keyboard input to it from Windows and X11 machines via Win2VNC and | 
 |    x2vnc, respectively?  | 
 |  | 
 |    [Color Issues] | 
 |  | 
 |    Q-23: The X display I run x11vnc on is only 8 bits per pixel (bpp) | 
 |    PseudoColor (i.e. only 256 distinct colors.) The x11vnc colors may | 
 |    start out OK, but after a while they are incorrect in certain windows. | 
 |     | 
 |    Q-24: Color problems: Why are the colors for some windows incorrect in | 
 |    x11vnc? BTW, my X display has nice overlay/multi-depth visuals of | 
 |    different color depths: e.g. there are both depth 8 and 24 visuals | 
 |    available at the same time.  | 
 |  | 
 |    Q-25: I am on a high color system (depth >= 24) but I seem to have | 
 |    colormap problems. They either flash or everything is very dark.  | 
 |  | 
 |    Q-26: How do I figure out the window id to supply to the -id windowid | 
 |    option?  | 
 |  | 
 |    Q-27: Why don't menus or other transient windows come up when I am | 
 |    using the -id windowid option to view a single application window?  | 
 |  | 
 |    Q-28: My X display is depth 24 at 24bpp (instead of the normal depth | 
 |    24 at 32bpp.) I'm having lots of color and visual problems with x11vnc | 
 |    and/or vncviewer. What's up?  | 
 |  | 
 |    [Xterminals] | 
 |  | 
 |    Q-29: Can I use x11vnc to view and interact with an Xterminal (e.g. | 
 |    NCD) that is not running UNIX and so x11vnc cannot be run on it | 
 |    directly?  | 
 |  | 
 |    Q-30: How do I get my X permissions (MIT-MAGIC-COOKIE file) correct | 
 |    for a Unix/Linux machine acting as an Xterminal?  | 
 |  | 
 |    [Sun Rays] | 
 |  | 
 |    Q-31: I'm having trouble using x11vnc with my Sun Ray session.  | 
 |  | 
 |    [Remote Control] | 
 |  | 
 |    Q-32: How do I stop x11vnc once it is running in the background?  | 
 |  | 
 |    Q-33: Can I change settings in x11vnc without having to restart it? | 
 |    Can I remote control it?  | 
 |  | 
 |    [Security and Permissions] | 
 |  | 
 |    Q-34: How do I create a VNC password for use with x11vnc?  | 
 |  | 
 |    Q-35: Can I make it so -storepasswd doesn't show my password on the | 
 |    screen?  | 
 |  | 
 |    Q-36: Can I have two passwords for VNC viewers, one for full access | 
 |    and the other for view-only access to the display?  | 
 |  | 
 |    Q-37: Can I have as many full-access and view-only passwords as I | 
 |    like?  | 
 |  | 
 |    Q-38: Does x11vnc support Unix usernames and passwords? Can I further | 
 |    limit the set of Unix usernames who can connect to the VNC desktop?  | 
 |  | 
 |    Q-39: Can I supply an external program to provide my own custom login | 
 |    method (e.g. Dynamic/One-time passwords or non-Unix (LDAP) usernames | 
 |    and passwords)?  | 
 |  | 
 |    Q-40: Why does x11vnc exit as soon as the VNC viewer disconnects? And | 
 |    why doesn't it allow more than one VNC viewer to connect at the same | 
 |    time?  | 
 |  | 
 |    Q-41: Can I limit which machines incoming VNC clients can connect | 
 |    from?  | 
 |  | 
 |    Q-42: How do I build x11vnc/libvncserver with libwrap (tcp_wrappers) | 
 |    support?  | 
 |  | 
 |    Q-43: Can I have x11vnc only listen on one network interface (e.g. | 
 |    internal LAN) rather than having it listen on all network interfaces | 
 |    and relying on -allow to filter unwanted connections out?  | 
 |  | 
 |    Q-44: Now that -localhost implies listening only on the loopback | 
 |    interface, how I can occasionally allow in a non-localhost via the -R | 
 |    allowonce remote control command?  | 
 |  | 
 |    Q-45: Can I fine tune what types of user input are allowed? E.g. have | 
 |    some users just be able to move the mouse, but not click or type | 
 |    anything?  | 
 |  | 
 |    Q-46: Can I prompt the user at the local X display whether the | 
 |    incoming VNC client should be accepted or not? Can I decide to make | 
 |    some clients view-only? How about running an arbitrary program to make | 
 |    the decisions?  | 
 |  | 
 |    Q-47: I start x11vnc as root because it is launched via inetd(8) or a | 
 |    display manager like gdm(1). Can I have x11vnc later switch to a | 
 |    different user?  | 
 |  | 
 |    Q-48: I use a screen-lock when I leave my workstation (e.g. | 
 |    xscreensaver or xlock.) When I remotely access my workstation desktop | 
 |    via x11vnc I can unlock the desktop fine, but I am worried people will | 
 |    see my activities on the physical monitor. What can I do to prevent | 
 |    this, or at least make it more difficult?  | 
 |  | 
 |    Q-49: Can I have x11vnc automatically lock the screen when I | 
 |    disconnect the VNC viewer?  | 
 |  | 
 |    [Encrypted Connections] | 
 |  | 
 |    Q-50: How can I tunnel my connection to x11vnc via an encrypted SSH | 
 |    channel between two Unix machines?  | 
 |  | 
 |    Q-51: How can I tunnel my connection to x11vnc via an encrypted SSH | 
 |    channel from Windows using an SSH client like Putty?  | 
 |  | 
 |    Q-52: How can I tunnel my connection to x11vnc via an encrypted SSL | 
 |    channel using an external tool like stunnel?  | 
 |  | 
 |    Q-53: Does x11vnc have built-in SSL tunneling?  | 
 |  | 
 |    Q-54: How do I use VNC Viewers with built-in SSL tunneling?  | 
 |  | 
 |    Q-55: How do I use the Java applet VNC Viewer with built-in SSL | 
 |    tunneling when going through a Web Proxy?  | 
 |  | 
 |    Q-56: Can Apache web server act as a gateway for users to connect via | 
 |    SSL from the Internet with a Web browser to x11vnc running on their | 
 |    workstations behind a firewall?  | 
 |  | 
 |    Q-57: Can I create and use my own SSL Certificate Authority (CA) with | 
 |    x11vnc?  | 
 |  | 
 |    [Display Managers and Services] | 
 |  | 
 |    Q-58: How can I run x11vnc as a "service" that is always available?  | 
 |  | 
 |    Q-59: How can I use x11vnc to connect to an X login screen like xdm, | 
 |    GNOME gdm, KDE kdm, or CDE dtlogin? (i.e. nobody is logged into an X | 
 |    session yet.)  | 
 |  | 
 |    Q-60: Can I run x11vnc out of inetd(8)? How about xinetd(8)?  | 
 |  | 
 |    Q-61: Can I have x11vnc advertise its VNC service and port via mDNS / | 
 |    Zeroconf (e.g. Avahi) so VNC viewers on the local network can detect | 
 |    it automatically?  | 
 |  | 
 |    Q-62: Can I have x11vnc allow a user to log in with her UNIX username | 
 |    and password and then have it find her X session display on that | 
 |    machine and then attach to it? How about starting an X session if one | 
 |    cannot be found?  | 
 |  | 
 |    Q-63: Can I have x11vnc restart itself after it terminates?  | 
 |  | 
 |    Q-64: How do I make x11vnc work with the Java VNC viewer applet in a | 
 |    web browser?  | 
 |  | 
 |    Q-65: Are reverse connections (i.e. the VNC server connecting to the | 
 |    VNC viewer) using "vncviewer -listen" and vncconnect(1) supported?  | 
 |  | 
 |    Q-66: Can reverse connections be made to go through a Web or SOCKS | 
 |    proxy or SSH?  | 
 |  | 
 |    Q-67: Can x11vnc provide a multi-user desktop web login service as an | 
 |    Apache CGI or PHP script?  | 
 |  | 
 |    Q-68: Can I use x11vnc as a replacement for Xvnc? (i.e. not for a real | 
 |    display, but for a virtual one I keep around.)  | 
 |  | 
 |    Q-69: How can I use x11vnc on "headless" machines? Why might I want | 
 |    to?  | 
 |  | 
 |    [Resource Usage and Performance] | 
 |  | 
 |    Q-70: I have lots of memory, but why does x11vnc fail with    shmget: | 
 |    No space left on device    or    Minor opcode of failed request: 1 | 
 |    (X_ShmAttach)?  | 
 |  | 
 |    Q-71: How can I make x11vnc use less system resources?  | 
 |  | 
 |    Q-72: How can I make x11vnc use MORE system resources?  | 
 |  | 
 |    Q-73: I use x11vnc over a slow link with high latency (e.g. dialup | 
 |    modem or broadband), is there anything I can do to speed things up?  | 
 |  | 
 |    Q-74: Does x11vnc support the X DAMAGE Xserver extension to find | 
 |    modified regions of the screen quickly and efficiently?  | 
 |  | 
 |    Q-75: My OpenGL application shows no screen updates unless I supply | 
 |    the -noxdamage option to x11vnc.  | 
 |  | 
 |    Q-76: When I drag windows around with the mouse or scroll up and down | 
 |    things really bog down (unless I do the drag in a single, quick | 
 |    motion.) Is there anything to do to improve things?  | 
 |  | 
 |    Q-77: Why not do something like wireframe animations to avoid the | 
 |    windows "lurching" when being moved or resized?  | 
 |  | 
 |    Q-78: Can x11vnc try to apply heuristics to detect when a window is | 
 |    scrolling its contents and use the CopyRect encoding for a speedup?  | 
 |  | 
 |    Q-79: Can x11vnc do client-side caching of pixel data? I.e. so when | 
 |    that pixel data is needed again it does not have to be retransmitted | 
 |    over the network.  | 
 |  | 
 |    Q-80: Does x11vnc support TurboVNC?  | 
 |  | 
 |    [Mouse Cursor Shapes] | 
 |  | 
 |    Q-81: Why isn't the mouse cursor shape (the little icon shape where | 
 |    the mouse pointer is) correct as I move from window to window?  | 
 |  | 
 |    Q-82: When using XFIXES cursorshape mode, some of the cursors look | 
 |    really bad with extra black borders around the cursor and other cruft. | 
 |    How can I improve their appearance?  | 
 |  | 
 |    Q-83: In XFIXES mode, are there any hacks to handle cursor | 
 |    transparency ("alpha channel") exactly?  | 
 |  | 
 |    [Mouse Pointer] | 
 |  | 
 |    Q-84: Why does the mouse arrow just stay in one corner in my | 
 |    vncviewer, whereas my cursor (that does move) is just a dot?  | 
 |  | 
 |    Q-85: Can I take advantage of the TightVNC extension to the VNC | 
 |    protocol where Cursor Positions Updates are sent back to all connected | 
 |    clients (i.e. passive viewers can see the mouse cursor being moved | 
 |    around by another viewer)?  | 
 |  | 
 |    Q-86: Is it possible to swap the mouse buttons (e.g. left-handed | 
 |    operation), or arbitrarily remap them? How about mapping button clicks | 
 |    to keystrokes, e.g. to partially emulate Mouse wheel scrolling?  | 
 |  | 
 |    [Keyboard Issues] | 
 |  | 
 |    Q-87: How can I get my AltGr and Shift modifiers to work between | 
 |    keyboards for different languages?  | 
 |  | 
 |    Q-88: When I try to type a "<" (i.e. less than) instead I get ">" | 
 |    (i.e. greater than)! Strangely, typing ">" works OK!!  | 
 |  | 
 |    Q-89: Extra Character Inserted, E.g.: When I try to type a "<" (i.e. | 
 |    less than) instead I get "<," (i.e. an extra comma.)  | 
 |  | 
 |    Q-90: I'm using an "international" keyboard (e.g. German "de", or | 
 |    Danish "dk") and the -modtweak mode works well if the VNC viewer is | 
 |    run on a Unix/Linux machine with a similar keyboard.   But if I run | 
 |    the VNC viewer on Unix/Linux with a different keyboard (e.g. "us") or | 
 |    Windows with any keyboard, I can't type some keys like:   "@", "$", | 
 |    "<", ">", etc. How can I fix this?  | 
 |  | 
 |    Q-91: When typing I sometimes get double, triple, or more of my | 
 |    keystrokes repeated. I'm sure I only typed them once, what can I do?  | 
 |  | 
 |    Q-92: The x11vnc -norepeat mode is in effect, but I still get repeated | 
 |    keystrokes!!  | 
 |  | 
 |    Q-93: After using x11vnc for a while, I find that I cannot type some | 
 |    (or any) characters or my mouse clicks and drags no longer have any | 
 |    effect, or they lead to strange effects. What happened?  | 
 |  | 
 |    Q-94: The machine where I run x11vnc has an AltGr key, but the local | 
 |    machine where I run the VNC viewer does not. Is there a way I can map | 
 |    a local unused key to send an AltGr? How about a Compose key as well?  | 
 |  | 
 |    Q-95: I have a Sun machine I run x11vnc on. Its Sun keyboard has just | 
 |    one Alt key labelled "Alt" and two Meta keys labelled with little | 
 |    diamonds. The machine where I run the VNC viewer only has Alt keys. | 
 |    How can I send a Meta keypress? (e.g. emacs needs this)  | 
 |  | 
 |    Q-96: Running x11vnc on HP-UX I cannot type "#" I just get a "3" | 
 |    instead.  | 
 |  | 
 |    Q-97: Can I map a keystroke to a mouse button click on the remote | 
 |    machine?  | 
 |  | 
 |    Q-98: How can I get Caps_Lock to work between my VNC viewer and | 
 |    x11vnc?  | 
 |  | 
 |    [Screen Related Issues and Features] | 
 |  | 
 |    Q-99: The remote display is larger (in number of pixels) than the | 
 |    local display I am running the vncviewer on. I don't like the | 
 |    vncviewer scrollbars, what I can do?  | 
 |  | 
 |    Q-100: Does x11vnc support server-side framebuffer scaling? (E.g. to | 
 |    make the desktop smaller.)  | 
 |  | 
 |    Q-101: Does x11vnc work with Xinerama? (i.e. multiple monitors joined | 
 |    together to form one big, single screen.)  | 
 |  | 
 |    Q-102: Can I use x11vnc on a multi-headed display that is not Xinerama | 
 |    (i.e. separate screens :0.0, :0.1, ... for each monitor)?  | 
 |  | 
 |    Q-103: Can x11vnc show only a portion of the display? (E.g. for a | 
 |    special purpose application or a very large screen.)  | 
 |  | 
 |    Q-104: Does x11vnc support the XRANDR (X Resize, Rotate and | 
 |    Reflection) extension? Whenever I rotate or resize the screen x11vnc | 
 |    just seems to crash.  | 
 |  | 
 |    Q-105: Independent of any XRANDR, can I have x11vnc rotate and/or | 
 |    reflect the screen that the VNC viewers see? (e.g. for a handheld | 
 |    whose screen is rotated 90 degrees.)  | 
 |  | 
 |    Q-106: Why is the view in my VNC viewer completely black? Or why is | 
 |    everything flashing around randomly?  | 
 |  | 
 |    Q-107: I use Linux Virtual Terminals (VT's) to implement 'Fast User | 
 |    Switching' between users' sessions (e.g. Betty is on Ctrl-Alt-F7, | 
 |    Bobby is on Ctrl-Alt-F8, and Sid is on Ctrl-Alt-F1: they use those | 
 |    keystrokes to switch between their sessions.)   How come the view in a | 
 |    VNC viewer connecting to x11vnc is either completely black or | 
 |    otherwise all messed up unless the X session x11vnc is attached to is | 
 |    in the active VT?  | 
 |  | 
 |    Q-108: I am using x11vnc where my local machine has "popup/hidden | 
 |    taskbars" and the remote display where x11vnc runs also has | 
 |    "popup/hidden taskbars" and they interfere and fight with each other. | 
 |    What can I do?  | 
 |  | 
 |    Q-109: Help! x11vnc and my KDE screensaver keep switching each other | 
 |    on and off every few seconds.  | 
 |  | 
 |    Q-110: I am running the compiz 3D window manager (or beryl, MythTv, | 
 |    Google Earth, or some other OpenGL app) and I do not get screen | 
 |    updates in x11vnc.  | 
 |  | 
 |    Q-111: Can I use x11vnc to view my VMWare session remotely?  | 
 |  | 
 |    [Exporting non-X11 devices via VNC] | 
 |  | 
 |    Q-112: Can non-X devices (e.g. a raw framebuffer) be viewed (and even | 
 |    controlled) via VNC with x11vnc?  | 
 |  | 
 |    Q-113: Can I export the Linux Console (Virtual Terminals) via VNC | 
 |    using x11vnc?  | 
 |  | 
 |    Q-114: Can I export via VNC a Webcam or TV tuner framebuffer using | 
 |    x11vnc?  | 
 |  | 
 |    Q-115: Can I connect via VNC to a Qt-embedded/Qt-enhanced/Qtopia | 
 |    application running on my handheld, cell phone, or PC using the Linux | 
 |    console framebuffer (i.e. not X11)?  | 
 |  | 
 |    Q-116: How do I inject touch screen input into an | 
 |    Qt-embedded/Qt-enhanced/Qtopia cell phone such as openmoko/qtmoko Neo | 
 |    Freerunner?  | 
 |  | 
 |    Q-117: Now that non-X11 devices can be exported via VNC using x11vnc, | 
 |    can I build it with no dependencies on X11 header files and libraries? | 
 |     | 
 |    Q-118: How do I cross compile x11vnc for a different architecture than | 
 |    my Linux i386 or amd64 PC?  | 
 |  | 
 |    Q-119: Does x11vnc support Mac OS X Aqua/Quartz displays natively | 
 |    (i.e. no X11 involved)?  | 
 |  | 
 |    Q-120: Can x11vnc be used as a VNC reflector/repeater to improve | 
 |    performance for the case of a large number of simultaneous VNC viewers | 
 |    (e.g. classroom broadcasting or a large demo)?  | 
 |  | 
 |    Q-121: Can x11vnc be used during a Linux, Solaris, etc. system | 
 |    Installation so the Installation can be done remotely?  | 
 |  | 
 |    [Misc: Clipboard, File Transfer/Sharing, Printing, Sound, Beeps, | 
 |    Thanks, etc.] | 
 |  | 
 |    Q-122: Does the Clipboard/Selection get transferred between the | 
 |    vncviewer and the X display?  | 
 |  | 
 |    Q-123: Can I use x11vnc to record a Shock Wave Flash (or other format) | 
 |    video of my desktop, e.g. to record a tutorial or demo?  | 
 |  | 
 |    Q-124: Can I transfer files back and forth with x11vnc?  | 
 |  | 
 |    Q-125: Which UltraVNC extensions are supported?  | 
 |  | 
 |    Q-126: Can x11vnc emulate UltraVNC's Single Click helpdesk mode for | 
 |    Unix? I.e. something very simple for a naive user to initiate a | 
 |    reverse vnc connection from their Unix desktop to a helpdesk | 
 |    operator's VNC Viewer.  | 
 |  | 
 |    Q-127: Can I (temporarily) mount my local (viewer-side) Windows/Samba | 
 |    File share on the machine where x11vnc is running?  | 
 |  | 
 |    Q-128: Can I redirect CUPS print jobs from the remote desktop where | 
 |    x11vnc is running to a printer on my local (viewer-side) machine?  | 
 |  | 
 |    Q-129: How can I hear the sound (audio) from the remote applications | 
 |    on the desktop I am viewing via x11vnc?  | 
 |  | 
 |    Q-130: Why don't I hear the "Beeps" in my X session (e.g. when typing | 
 |    tput bel in an xterm)?  | 
 |  | 
 |    Q-131: Does x11vnc work with IPv6?  | 
 |  | 
 |    Q-132: Thanks for your program or for your help! Can I make a | 
 |    donation?  | 
 |      _________________________________________________________________ | 
 |  | 
 |  | 
 |    [Building and Starting] | 
 |  | 
 |    Q-1: I can't get x11vnc to start up. It says "XOpenDisplay failed | 
 |    (null)" or "Xlib: connection to ":0.0" refused by server Xlib: No | 
 |    protocol specified" and then exits. What do I need to do? | 
 |  | 
 |    For the former error, you need to specify the X display to connect to | 
 |    (it also needs to be on the same machine the x11vnc process is to run | 
 |    on.) Set your DISPLAY environment variable (or use the -display | 
 |    option) to specify it. Nearly always the correct value will be ":0" | 
 |    (in fact, x11vnc will now assume :0 if given no other information.) | 
 |  | 
 |  | 
 |    For the latter error, you need to set up the X11 permissions | 
 |    correctly. | 
 |  | 
 |    To make sure X11 permissions are the problem do this simple test: | 
 |    while sitting at the physical X display open a terminal window | 
 |    (gnome-terminal, xterm, etc.) You should be able to run x11vnc | 
 |    successfully without any need for special steps or command line | 
 |    options in that terminal (i.e. just type "x11vnc".) If that works OK | 
 |    then you know X11 permissions are the only thing preventing it from | 
 |    working when you try to start x11vnc via, say, a remote shell. | 
 |  | 
 |    How to Solve:  See the xauth(1), Xsecurity(7), and xhost(1) man pages | 
 |    or this Howto for much info on X11 permissions. For example, you may | 
 |    need to set your XAUTHORITY environment variable (or use the -auth | 
 |    option) to point to the correct MIT-MAGIC-COOKIE file (e.g. | 
 |    /home/joe/.Xauthority or /var/gdm/:0.Xauth or /var/lib/kdm/A:0-crWk72K | 
 |    or /tmp/.gdmzndVlR, etc, etc.), or simply be sure you run x11vnc as | 
 |    the correct user (i.e. the user who is logged into the X session you | 
 |    wish to view.) | 
 |  | 
 |    Note: The MIT cookie file contains the secret key that allows x11vnc | 
 |    to connect to the desired X display. | 
 |  | 
 |    If, say, sshd has set XAUTHORITY to point to a random file it has | 
 |    created for X forwarding that will cause problems. (Under some | 
 |    circumstances even su(1) and telnet(1) can set XAUTHORITY. See also | 
 |    the gdm parameter NeverPlaceCookiesOnNFS that sets XAUTHORITY to a | 
 |    random filename in /tmp for the whole X session.) | 
 |  | 
 |    Running x11vnc as root is often not enough: you need to know where the | 
 |    MIT-MAGIC-COOKIE file for the desired X display is. | 
 |  | 
 |    Example solution: | 
 |   x11vnc -display :0 -auth /var/gdm/:0.Xauth | 
 |  | 
 |    (this is for the display manager gdm and requires root permission to | 
 |    read the gdm cookie file, see this faq for other display manager | 
 |    cookie file names.) | 
 |  | 
 |    Note as of Feb/2007 you can also try the -find option instead of | 
 |    "-display ..." and see if that finds your display and Xauthority. | 
 |  | 
 |    Less safe, but to avoid figuring out where the correct XAUTHORITY file | 
 |    is, if the person sitting at the physical X session types "xhost | 
 |    +localhost" then one should be able to attach x11vnc to the session | 
 |    (from the same machine.) The person could then type "xhost -localhost" | 
 |    after x11vnc has connected to go back to the default permissions. | 
 |    Also, for some situations the "-users lurk=" option may soon be of use | 
 |    (please read the documentation on the -users option.) | 
 |  | 
 |    To test out your X11 permissions from a remote shell, set DISPLAY and | 
 |    possibly XAUTHORITY (see your shell's man page, bash(1), tcsh(1), on | 
 |    how to set environment variables) and type xdpyinfo in the same place | 
 |    you will be typing (or otherwise running) x11vnc. If information is | 
 |    printed out about the X display (screen sizes, supported extensions, | 
 |    color visuals info) that means the X11 permissions are set up | 
 |    properly: xdpyinfo successfully connected to DISPLAY! You could also | 
 |    type xclock and make sure no errors are reported (a clock should | 
 |    appear on the X display, press Ctrl-C to stop it.) If these work, then | 
 |    typing "x11vnc" in the same environment should also work. | 
 |  | 
 |    Important: if you cannot get your X11 permissions so that the xdpyinfo | 
 |    or xclock tests work, x11vnc also will not work (all of these X | 
 |    clients must be allowed to connect to the X server to function | 
 |    properly.) | 
 |  | 
 |    Firewalls: Speaking of permissions, it should go without saying that | 
 |    the host-level firewall will need to be configured to allow | 
 |    connections in on a port. E.g. 5900 (default VNC port) or 22 (default | 
 |    SSH port for tunnelling VNC.) Most systems these days have firewalls | 
 |    turned on by default, so you will actively have to do something to | 
 |    poke a hole in the firewall at the desired port number. See your | 
 |    system administration tool for Firewall settings (Yast, Firestarter, | 
 |    etc.) | 
 |  | 
 |  | 
 |    Q-2: I can't get x11vnc and/or libvncserver to compile. | 
 |  | 
 |    Make sure you have gcc (or other C compiler) and all of the required | 
 |    libraries and the corresponding -dev/-devel packages installed. These | 
 |    include Xorg/XFree86, libX11, libjpeg, libz, libssl, ... and don't | 
 |    forget the devs: libjpeg-dev, libssl-dev ... | 
 |  | 
 |    The most common build problem that people encounter is that the | 
 |    necessary X11 libraries are installed on their system however it does | 
 |    not have the corresponding -dev/-devel packages installed. These dev | 
 |    packages include C header files and build-time .so symlink. It is a | 
 |    shame the current trend in distros is to not install the dev package | 
 |    by default when the the library runtime package is installed... (it | 
 |    diminishes the power of open source) | 
 |  | 
 |    As of Nov/2006 here is a list of libraries that x11vnc usually likes | 
 |    to use: | 
 | libc.so        libX11.so       libXtst.so       libXext.so | 
 | libXfixes.so   libXdamage.so   libXinerama.so   libXrandr.so | 
 | libz.so        libjpeg.so      libpthread.so | 
 | libssl.so      libcrypto.so    libcrypt.so | 
 |  | 
 |    although x11vnc will be pretty usable with the subset: libc.so, | 
 |    libX11.so, libXtst.so, libXext.so, libz.so, and libjpeg.so. | 
 |  | 
 |    After running the libvncserver configure, carefully examine the output | 
 |    and the messages in the config.log file looking for missing | 
 |    components. For example, if the configure output looks like: | 
 |   checking how to run the C preprocessor... gcc -E | 
 |   checking for X... no | 
 |   checking for XkbSelectEvents in -lX11... no | 
 |   checking for XineramaQueryScreens in -lXinerama... no | 
 |   checking for XTestFakeKeyEvent in -lXtst... no | 
 |  | 
 |    or even worse: | 
 |   checking for C compiler default output file name... configure: error: | 
 |   C compiler cannot create executables | 
 |   See `config.log' for more details. | 
 |  | 
 |    there is quite a bit wrong with the build environment. Hopefully | 
 |    simply adding -dev packages and/or gcc or make will fix it. | 
 |  | 
 |    For Debian the list seems to be: | 
 |   gcc | 
 |   make | 
 |   libc6-dev | 
 |   libjpeg8-dev           (formerly libjpeg62-dev) | 
 |   libx11-dev | 
 |   x11proto-core-dev      (formerly x-dev) | 
 |   libxext-dev | 
 |   libxtst-dev | 
 |   libxdamage-dev | 
 |   libxfixes-dev | 
 |   libxrandr-dev | 
 |   libxinerama-dev | 
 |   libxss-dev             (formerly xlibs-static-dev) | 
 |   zlib1g-dev | 
 |   libssl-dev | 
 |   libavahi-client-dev | 
 |   linux-libc-dev         (only needed for linux console rawfb support) | 
 |  | 
 |    Note that depending on your OS version the above names may have been | 
 |    changed and/or additional packages may be needed. | 
 |  | 
 |    For Redhat the list seems to be: | 
 |   gcc | 
 |   make | 
 |   glibc-devel | 
 |   libjpeg-devel | 
 |   libX11-devel | 
 |   xorg-x11-proto-devel | 
 |   libXdamage-devel | 
 |   libXfixes-devel | 
 |   libXrandr-devel | 
 |   zlib-devel | 
 |   openssl-devel | 
 |   avahi-devel | 
 |   kernel-headers         (only needed for linux console rawfb support) | 
 |  | 
 |    For other distros or OS's the package names may not be the same but | 
 |    will look similar. Also, distros tend to rename packages as well so | 
 |    the above list may be out of date. So only use the above lists as | 
 |    hints for the package names that are needed. | 
 |  | 
 |    Have a look at Misc. Build Problems for additional fixes. | 
 |  | 
 |    Note: there is growing trend in Linux and other distros to slice up | 
 |    core X11 software into more and smaller packages. So be prepared for | 
 |    more headaches compiling software... | 
 |  | 
 |  | 
 |    Q-3: I just built x11vnc successfully, but when I use it my keystrokes | 
 |    and mouse button clicks are ignored  (I am able to move the mouse | 
 |    though.) | 
 |  | 
 |    This is most likely due to you not having a working build environment | 
 |    for the XTEST client library libXtst.so. The library is probably | 
 |    present on your system, but the package installing the build header | 
 |    file is missing. | 
 |  | 
 |    If you were watching carefully while configure was running you would | 
 |    have seen: | 
 |   checking for XTestFakeKeyEvent in -lXtst... no | 
 |  | 
 |    The solution is to add the necessary build environment package (and | 
 |    the library package if that is missing too.) On Debian the build | 
 |    package is libxtst-dev. Other distros/OS's may have it in another | 
 |    package. | 
 |  | 
 |    x11vnc will build without support for this library (e.g. perhaps one | 
 |    wants a view-only x11vnc on a stripped down or embedded system...) And | 
 |    at runtime it will also continue to run even if the X server it | 
 |    connects to does not support XTEST. In both cases it cannot inject | 
 |    keystrokes or button clicks since XTEST is needed for that (it can | 
 |    still move the mouse pointer using the X API XWarpPointer().) | 
 |  | 
 |    You will see a warning message something like this at run time: | 
 |   20/03/2005 22:33:09 WARNING: XTEST extension not available (either missing fr | 
 | om | 
 |   20/03/2005 22:33:09   display or client library libXtst missing at build time | 
 | .) | 
 |   20/03/2005 22:33:09   MOST user input (pointer and keyboard) will be DISCARDE | 
 | D. | 
 |   20/03/2005 22:33:09   If display does have XTEST, be sure to build x11vnc wit | 
 | h | 
 |   20/03/2005 22:33:09   a working libXtst build environment (e.g. libxtst-dev, | 
 |   20/03/2005 22:33:09   or other packages.) | 
 |   20/03/2005 22:33:09 No XTEST extension, switching to -xwarppointer mode for | 
 |   20/03/2005 22:33:09   pointer motion input. | 
 |  | 
 |    Also, as of Nov/2006 there will be a configure build time warning as | 
 |    well: | 
 |   ... | 
 |   checking for XFixesGetCursorImage in -lXfixes... yes | 
 |   checking for XDamageQueryExtension in -lXdamage... yes | 
 |   configure: WARNING: | 
 |   ========================================================================== | 
 |   A working build environment for the XTEST extension was not found (libXtst). | 
 |   An x11vnc built this way will be only barely usable.  You will be able to | 
 |   move the mouse but not click or type.  There can also be deadlocks if an | 
 |   application grabs the X server. | 
 |  | 
 |   It is recommended that you install the necessary development packages | 
 |   for XTEST (perhaps it is named something like libxtst-dev) and run | 
 |   configure again. | 
 |   ========================================================================== | 
 |  | 
 |  | 
 |    Q-4: Help, I need to run x11vnc on Solaris 2.5.1 (or other old | 
 |    Unix/Linux) and it doesn't compile! | 
 |  | 
 |    We apologize that x11vnc does not build cleanly on older versions of | 
 |    Solaris, Linux, etc.: very few users are on these old releases. | 
 |  | 
 |    We have heard that since Dec/2004 a Solaris 2.6 built x11vnc will run | 
 |    on Solaris Solaris 2.5 and 2.5.1 (since a workaround for XConvertCase | 
 |    is provided.) | 
 |  | 
 |    In any event, here is a workaround for Solaris 2.5.1 (and perhaps | 
 |    earlier and perhaps non-Solaris): | 
 |  | 
 |    First use the environment settings (CPPFLAGS, LDFLAGS, etc.) in the | 
 |    above Solaris build script to run the configure command. That should | 
 |    succeed without failure. Then you have to hand edit the autogenerated | 
 |    rfb/rfbconfig.h file in the source tree, and just before the last | 
 |    #endif at the bottom of that file insert these workaround lines: | 
 | struct timeval _tmp_usleep_tv; | 
 | #define usleep(x) \ | 
 |     _tmp_usleep_tv.tv_sec  = (x) / 1000000; \ | 
 |     _tmp_usleep_tv.tv_usec = (x) % 1000000; \ | 
 |     select(0, NULL, NULL, NULL, &_tmp_usleep_tv); | 
 | int gethostname(char *name, int namelen); | 
 | long random(); | 
 | int srandom(unsigned int seed); | 
 | #undef LIBVNCSERVER_HAVE_LIBPTHREAD | 
 | #define SHUT_RDWR 2 | 
 | typedef unsigned int in_addr_t; | 
 | #define snprintf(a, n, args...) sprintf((a), ## args) | 
 |  | 
 |    Then run make with the Solaris build script environment, everything | 
 |    should compile without problems, and the resulting x11vnc binary | 
 |    should work OK. If some non-x11vnc related programs fail (e.g. test | 
 |    programs) and the x11vnc binary is not created try "make -k" to have | 
 |    it keep going. Similar sorts of kludges in rfb/rfbconfig.h can be done | 
 |    on other older OS (Solaris, Linux, ...) releases. | 
 |  | 
 |    Here are some notes for similar steps that need to be done to build on | 
 |    SunOS 4.x | 
 |  | 
 |    Please let us know if you had to use the above workaround (and whether | 
 |    it worked or not.) If there is enough demand we will try to push clean | 
 |    compilations back to earlier Solaris, Linux, etc, releases. | 
 |  | 
 |  | 
 |    Q-5: Where can I get a precompiled x11vnc binary for my Operating | 
 |    System? | 
 |  | 
 |    Hopefully the build steps above and FAQ provide enough info for a | 
 |    painless compile for most environments. Please report problems with | 
 |    the x11vnc configure, make, etc. on your system (if your system is | 
 |    known to compile other GNU packages successfully.) | 
 |  | 
 |    There are precompiled x11vnc binaries built by other groups that are | 
 |    available at the following locations: | 
 |     Slackware:      (.tgz)  http://www.linuxpackages.net/ | 
 |  | 
 |    SuSE: (.rpm) http:/software.opensuse.org/ Gentoo: (info) | 
 |    http://gentoo-wiki.com/ and http://gentoo-portage.com/ FreeBSD: (.tbz) | 
 |    http://www.freebsd.org/ http://www.freshports.org/net/x11vnc NetBSD: | 
 |    (src) http://pkgsrc.se/x11/x11vnc OpenBSD: (.tgz) http://openports.se/ | 
 |    Arch Linux: (.tgz) http://www.archlinux.org/ Nokia 770 (.deb) | 
 |    http://mike.saunby.googlepages.com/x11vncfornokia7702 Sharp Zaurus | 
 |    http://www.focv.com/ Debian: (.deb) http://packages.debian.org/x11vnc | 
 |    Redhat/Fedora: (.rpm) http://packages.sw.be/x11vnc RPMforge | 
 |    http://dag.wieers.com/rpm/packages/x11vnc/ (N.B.: unmaintained after | 
 |    0.9.3) Solaris: (pkg) http://www.sunfreeware.com/ | 
 |  | 
 |    If the above binaries don't work and building x11vnc on your OS fails | 
 |    (and all else fails!) you can try one of My Collection of x11vnc | 
 |    Binaries for various OS's and x11vnc releases. | 
 |  | 
 |    As a general note, the x11vnc program is simple enough you don't | 
 |    really need to install a package: the binary will in most cases work | 
 |    as is and from any location (as long as your system libraries are not | 
 |    too old, etc.) So, for Linux distributions that are not one of the | 
 |    above, the x11vnc binary from the above packages has a good chance of | 
 |    working. You can "install" it by just copying the x11vnc binary to the | 
 |    desired directory in your PATH. Tip on extracting files from a Debian | 
 |    package: extract the archive via a command like: "ar x | 
 |    x11vnc_0.6-2_i386.deb" and then you can find the binary in the | 
 |    resulting data.tar.gz tar file. Also, rpm2cpio(1) is useful in | 
 |    extracting files from rpm packages. | 
 |  | 
 |    If you use a standalone binary like this and also want x11vnc to serve | 
 |    up the Java VNC Viewer jar file (either SSL enabled or regular one), | 
 |    then you will need to extract the classes subdirectory from the source | 
 |    tarball and point x11vnc to it via the -httpdir option. E.g.: | 
 |     x11vnc -httpdir /path/to/x11vnc-0.9.9/classes/ssl ... | 
 |  | 
 |  | 
 |    Q-6: Where can I get a VNC Viewer binary (or source code) for the | 
 |    Operating System I will be viewing from? | 
 |  | 
 |    To obtain VNC viewers for the viewing side (Windows, Mac OS, or Unix) | 
 |    try here: | 
 |      * http://www.tightvnc.com/download.html | 
 |      * http://www.realvnc.com/download-free.html | 
 |      * http://sourceforge.net/projects/cotvnc/ | 
 |      * http://www.ultravnc.com/ | 
 |      * Our Enhanced TightVNC Viewer (SSVNC) | 
 |  | 
 |        [ssvnc.gif] | 
 |  | 
 |  | 
 |    Q-7: How can I see all of x11vnc's command line options and | 
 |    documentation on how to use them? | 
 |  | 
 |    Run:  x11vnc -opts   to list just the option names or run:  x11vnc | 
 |    -help   for long descriptions about each option. The output is listed | 
 |    here as well. Yes, x11vnc does have a lot of options, doesn't it... | 
 |  | 
 |  | 
 |    Q-8: I don't like typing arcane command line options every time I | 
 |    start x11vnc. What can I do? Is there a config file? Or a GUI? | 
 |  | 
 |    You could create a shell script that calls x11vnc with your options: | 
 | #!/bin/sh | 
 | # | 
 | # filename: X11vnc  (i.e. not "x11vnc") | 
 | # It resides in a directory in $PATH. "chmod 755 X11vnc" has been run on it. | 
 | # | 
 | x11vnc -wait 50 -localhost -rfbauth $HOME/.vnc/passwd -display :0 $* | 
 |  | 
 |    a similar thing can be done via aliases in your shell (bash, tcsh, | 
 |    csh, etc..) | 
 |  | 
 |    Or as of Jun/2004 you can use the simple $HOME/.x11vncrc config file | 
 |    support. If that file exists, each line is taken as a command line | 
 |    option. E.g. the above would be: | 
 | # this is a comment in my ~/.x11vncrc file | 
 | wait 50        # this is a comment to the end of the line. | 
 | -localhost     # note: the leading "-" is optional. | 
 | rfbauth  /home/fred/.vnc/passwd | 
 | display :0 | 
 |  | 
 |    As of Dec/2004 there is now a simple Tcl/Tk GUI based on the | 
 |    remote-control functionality ("-R") that was added. The /usr/bin/wish | 
 |    program is needed for operation. The gui is not particularly | 
 |    user-friendly, it just provides a point and click mode to set all the | 
 |    many x11vnc parameters and obtain help on them. It is also very useful | 
 |    for testing. See the -gui option for more info. Examples: "x11vnc ... | 
 |    -gui" and "x11vnc ... -gui other:0" in the latter case the gui is | 
 |    displayed on other:0, not the X display x11vnc is polling. There is | 
 |    also a "-gui tray" system tray mode. | 
 |  | 
 |    [tkx11vnc.gif] | 
 |  | 
 |    NOTE: You may need to install the "wish" or "tk" or "tk8.4" package | 
 |    for the gui mode to work (the package name depends on your OS/distro.) | 
 |    The tcl/tk "wish" interpreter is used. In debian (and so ubuntu too) | 
 |    one would run "apt-get install tk" or perhaps "apt-get install tk8.4" | 
 |  | 
 |  | 
 |    Q-9: How can I get the GUI to run in the System Tray, or at least be a | 
 |    smaller, simpler icon? | 
 |  | 
 |    As of Jul/2005 the gui can run in a more friendly small icon mode | 
 |    "-gui icon" or in the system tray: "-gui tray". It has balloon status, | 
 |    a simple menu, and a Properities dialog. The full, complicated, gui is | 
 |    only available under "Advanced". Other improvements were added as | 
 |    well. Try "Misc -> simple_gui" for a gui with fewer esoteric menu | 
 |    items. | 
 |  | 
 |    If the gui fails to embed itself in the system tray, do a retry via | 
 |    "Window View -> icon" followed by "Window View -> tray" with the popup | 
 |    menu. | 
 |  | 
 |    For inexperienced users starting up x11vnc and the GUI while sitting | 
 |    at the physical X display (not remotely), using something like "x11vnc | 
 |    -display :0 -gui tray=setpass" might be something for them that they | 
 |    are accustomed to in a Desktop environment (it prompts for an initial | 
 |    password, etc.) This is a basic "Share My Desktop" usage mode. | 
 |  | 
 |    As of Nov/2008 in x11vnc 0.9.6 there is a desktop menu item | 
 |    (x11vnc.desktop) that runs this command: | 
 |    x11vnc -gui tray=setpass -rfbport PROMPT -logfile %HOME/.x11vnc.log.%VNCDISP | 
 | LAY | 
 |  | 
 |    which also prompts for which VNC port to use and a couple other | 
 |    parameters. | 
 |  | 
 |  | 
 |    Q-10: How can I get x11vnc to listen on a different port besides the | 
 |    default VNC port (5900)? | 
 |  | 
 |    Use something like, e.g., "x11vnc -rfbport 5901" to force it to use | 
 |    port 5901 (this is VNC display :1.) If something else is using that | 
 |    port x11vnc will exit immediately. If you do not supply the -rfbport | 
 |    option, it will autoprobe starting at 5900 and work its way up to 5999 | 
 |    looking for a free port to listen on. In that case, watch for the | 
 |    PORT=59xx line to see which port it found, then subtract 5900 from it | 
 |    for the VNC display number to enter into the VNC Viewer(s). | 
 |  | 
 |    The "-N" option will try to match the VNC display number to the X | 
 |    display (e.g. X11 DISPLAY of :5 (port 6005) will have VNC display :5 | 
 |    (port 5905).) | 
 |  | 
 |    Also see the "-autoport n" option to indicated at which value the auto | 
 |    probing should start at. | 
 |  | 
 |  | 
 |    Q-11: My Firewall/Router doesn't allow VNC Viewers to connect to | 
 |    x11vnc. | 
 |  | 
 |    See the Firewalls/Routers discussion. | 
 |  | 
 |  | 
 |    Q-12: Is it possible for a VNC Viewer and a VNC Server to connect to | 
 |    each other even though both are behind Firewalls that block all | 
 |    incoming connections? | 
 |  | 
 |    This is very difficult or impossible to do unless a third machine, | 
 |    reachable by both, is used as a relay. So we assume a third machine is | 
 |    somehow being used as a relay. | 
 |  | 
 |    (Update: It may be possible to do "NAT-2-NAT" without a relay machine | 
 |    by using a UDP tunnel such as http://samy.pl/pwnat/. All that is | 
 |    required is that both NAT firewalls allow in UDP packets from an IP | 
 |    address to which a UDP packet has recently been sent to. If you try it | 
 |    out let us know how it went.) | 
 |  | 
 |    In the following discussion, we will suppose port 5950 is being used | 
 |    on the relay machine as the VNC port for the rendezvous. | 
 |  | 
 |    A way to rendezvous is to have the VNC Server start a reverse | 
 |    connection to the relay machine: | 
 |    x11vnc -connect third-machine.net:5950 ... | 
 |  | 
 |    and the VNC viewer forward connects as usual: | 
 |    vncviewer third-machine.net:50 | 
 |  | 
 |    Or maybe two ports would be involved, e.g. the viewer goes to display | 
 |    :51 (5951.) It depends on the relay software being used. | 
 |  | 
 |    What software to run on third-machine? A TCP relay of some sort could | 
 |    be used... Try a google search on "tcp relay" or "ip relay". However, | 
 |    note that this isn't a simple redirection because it hooks up two | 
 |    incoming connections. You can look at our UltraVNC repeater | 
 |    implementation ultravnc_repeater.pl for ideas and possibly to | 
 |    customize. | 
 |  | 
 |    Also, if you are not the admin of third-machine you'd have to convince | 
 |    the owner to allow you to install this software (and he would likely | 
 |    need to open his server's firewall to allow the port through.) | 
 |  | 
 |    It is recommended that SSL is used for encryption (e.g. "-ssl SAVE") | 
 |    when going over the internet. | 
 |  | 
 |    We have a prototype for performing a rendezvous via a Web Server | 
 |    acting as the relay machine. Download the vncxfer CGI script and see | 
 |    the instructions at the top. | 
 |  | 
 |    Once that CGI script is set up on the website, both users go to, say, | 
 |    http://somesite.com/vncxfer (or maybe a "/cgi-bin" directory or ".cgi" | 
 |    suffix must be used.) Previously, both have agreed on the same session | 
 |    name (say by phone or email) , e.g. "5cows", and put that into the | 
 |    entry form on the vncxfer starting page (hopefully separated by a few | 
 |    seconds, so the relay helper can fully start up at the first request.) | 
 |  | 
 |    The page returned tells them the hostname and port number and possible | 
 |    command to use for forward (VNC Viewer) and reverse (VNC Server, i.e. | 
 |    x11vnc) connections as described above. | 
 |  | 
 |    Also since Oct/2007, x11vnc can connect directly (no web browser), | 
 |    like this: | 
 |    x11vnc ... -connect localhost:0 -proxy 'http://somesite.com/vncxfer?session= | 
 | 5cows&' | 
 |  | 
 |    Unfortunately the prototype requires that the Web server's firewall | 
 |    allow in the port (e.g. 5950) used for the rendezvous. Most web | 
 |    servers are not configured to do this, so you would need to ask the | 
 |    admin to do this for you. Nearly all free webspace sites, e.g. | 
 |    www.zendurl.com, will not allow your CGI script to be an open relay | 
 |    like this. (If you find one that does allow this, let me know!) | 
 |  | 
 |    Maybe someday a clever trick will be thought up to relax the listening | 
 |    port requirement (e.g. use HTTP/CGI itself for the transfer... it is | 
 |    difficult to emulate a full-duplex TCP connection with them.) | 
 |  | 
 |    See also the Firewalls/Routers discussion and Reverse Connection Proxy | 
 |    discussion. | 
 |  | 
 |  | 
 |    SSH method: If both users (i.e. one on Viewer-side and the other on | 
 |    x11vnc server side) have SSH access to a common machine on the | 
 |    internet (or otherwise mutually reachable), then SSH plumbing can be | 
 |    used to solve this problem. The users create SSH tunnels going through | 
 |    the SSH login machine. | 
 |  | 
 |    Instead of assuming port 5900 is free on the SSH machine, we will | 
 |    assume both users agreed to use 5933. This will illustrate how to use | 
 |    a different port for the redir. It could be any port, what matters is | 
 |    that both parties refer to the same one. | 
 |  | 
 |    Set up the Tunnel from the VNC Server side: | 
 |    ssh -t -R 5933:localhost:5900 [email protected] | 
 |  | 
 |    Set up the Tunnel from the VNC Viewer side: | 
 |    ssh -t -L 5900:localhost:5933 [email protected] | 
 |  | 
 |    Run Server on the VNC Server side: | 
 |    x11vnc -rfbport 5900 -localhost ... | 
 |  | 
 |    Run Viewer on the VNC Viewer side: | 
 |    vncviewer -encodings "copyrect tight zrle hextile" localhost:0 | 
 |  | 
 |    (we assume the old-style -encodings option needs to be used. See here | 
 |    for details.) | 
 |  | 
 |    If the SSH machine has been configured (see sshd_config(5)) with the | 
 |    option GatewayPorts=yes, then the tunnel set up by the VNC Server will | 
 |    be reachable directly by the VNC viewer (as long as the SSH machine's | 
 |    firewall does not block the port, 5933 in this example.) So in that | 
 |    case the Viewer side does not need to run any ssh command, but rather | 
 |    only runs: | 
 |    vncviewer third-machine.net:33 | 
 |  | 
 |    In this case we recommend SSL be used for encryption. | 
 |  | 
 |    The creation of both tunnels can be automated. As of Oct/2007 the -ssh | 
 |    x11vnc option is available and so only this command needs to be run on | 
 |    the VNC Server side: | 
 |    x11vnc -ssh [email protected]:33 ... | 
 |  | 
 |    (the SSH passphrase may need to be supplied.) | 
 |  | 
 |    To automate on the VNC Viewer side, the user can use the Enhanced | 
 |    TightVNC Viewer (SSVNC) by: | 
 |      * Clicking on 'Use SSH' | 
 |      * Entering [email protected]:33 into 'VNC Host:Display' entry | 
 |        box | 
 |      * Clicking on 'Connect' | 
 |  | 
 |    As above, if the SSH GatewayPorts=yes setting is configured the Viewer | 
 |    side doesn't need to create a SSH tunnel. In SSVNC the Viewer user | 
 |    could instead select 'Use SSL' and then, e.g., on the Server side | 
 |    supply "-ssl SAVE" to x11vnc. Then end-to-end SSL encryption would be | 
 |    used (in addition to the SSH encryption on the Server-side leg.) | 
 |  | 
 |  | 
 |    Q-13: Can I make x11vnc more quiet and also go into the background | 
 |    after starting up? | 
 |  | 
 |    Use the -q and -bg options, respectively.  (also: -quiet is an alias | 
 |    for -q) | 
 |  | 
 |    Note that under -bg the stderr messages will be lost unless you use | 
 |    the "-o logfile" option. | 
 |  | 
 |  | 
 |    Q-14: Sometimes when a VNC viewer dies abruptly, x11vnc also dies with | 
 |    the error message like: "Broken pipe". I'm using the -forever mode and | 
 |    I want x11vnc to keep running. | 
 |  | 
 |    As of Jan/2004 the SIGPIPE signal is ignored. So if a viewer client | 
 |    terminates abruptly, libvncserver will notice on the next I/O | 
 |    operation and will close the connection and continue on. | 
 |  | 
 |    Up until of Apr/2004 the above fix only works for BSD signal systems | 
 |    (Linux, FreeBSD, ...) For SYSV systems there is a workaround in place | 
 |    since about Jun/2004. | 
 |  | 
 |  | 
 |    Q-15: The Windows TightVNC 1.3.9 Viewer cannot connect to x11vnc. | 
 |  | 
 |    This appears to be fixed in x11vnc version 0.9 and later. If you need | 
 |    to use an earlier version of x11vnc, try using the "-rfbversion 3.7" | 
 |    option. In general sometimes one can get a misbehaving viewer to work | 
 |    by supplying rfb versions 3.7 or 3.3. | 
 |  | 
 |  | 
 |    Q-16: KDE's krdc VNC viewer cannot connect to x11vnc. | 
 |  | 
 |    This has been fixed in x11vnc version 0.8.4. More info here, here, and | 
 |    here. | 
 |  | 
 |  | 
 |    Q-17: When I start x11vnc on an Alpha Tru64 workstation the X server | 
 |    crashes! | 
 |  | 
 |    This is a bug in the X server obviously; an X client should never be | 
 |    able to crash it. | 
 |  | 
 |    The problem seems to be with the RECORD X extension and so a | 
 |    workaround is to use the "-noxrecord" x11vnc command line option. | 
 |  | 
 |  | 
 |    Q-18: When running x11vnc on an IBM AIX workstation after a few | 
 |    minutes the VNC connection freezes. | 
 |  | 
 |    One user reports when running x11vnc on AIX 5.3 in his CDE session | 
 |    after a few minutes or seconds x11vnc will "freeze" (no more updates | 
 |    being sent, etc.) The freezing appeared to be worse for versions later | 
 |    than 0.9.2. | 
 |  | 
 |    The problem seems to be with the RECORD X extension on AIX and so a | 
 |    workaround is to use the "-noxrecord" x11vnc command line option. The | 
 |    user found no freezes occurred when using that option. | 
 |  | 
 |  | 
 |    Q-19: Are there any build-time customizations possible, e.g. change | 
 |    defaults, create a smaller binary, etc? | 
 |  | 
 |    There are some options. They are enabled by adding something like | 
 |    -Dxxxx=1 to the CPPFLAGS environment variable before running configure | 
 |    (see the build notes for general background.) | 
 | /* | 
 |  * Mar/2006 | 
 |  * Build-time customization via CPPFLAGS. | 
 |  * | 
 |  * Summary of options to include in CPPFLAGS for custom builds: | 
 |  * | 
 |  * -DVNCSHARED  to have the vnc display shared by default. | 
 |  * -DFOREVER  to have -forever on by default. | 
 |  * -DNOREPEAT=0  to have -repeat on by default. | 
 |  * -DADDKEYSYMS=0  to have -noadd_keysyms the default. | 
 |  * | 
 |  * -DREMOTE_DEFAULT=0  to disable remote-control on by default (-yesremote.) | 
 |  * -DREMOTE_CONTROL=0  to disable remote-control mechanism completely. | 
 |  * -DEXTERNAL_COMMANDS=0  to disable the running of all external commands. | 
 |  * -DFILEXFER=0  disable filexfer. | 
 |  * | 
 |  * -DHARDWIRE_PASSWD=...      hardwired passwords, quoting necessary. | 
 |  * -DHARDWIRE_VIEWPASSWD=... | 
 |  * -DNOPW=1                   make -nopw the default (skip warning) | 
 |  * -DUSEPW=1                  make -usepw the default | 
 |  * -DPASSWD_REQUIRED=1        exit unless a password is supplied. | 
 |  * -DPASSWD_UNLESS_NOPW=1     exit unless a password is supplied and no -nopw. | 
 |  * | 
 |  * -DWIREFRAME=0  to have -nowireframe as the default. | 
 |  * -DWIREFRAME_COPYRECT=0  to have -nowirecopyrect as the default. | 
 |  * -DWIREFRAME_PARMS=...   set default -wirecopyrect parameters. | 
 |  * -DSCROLL_COPYRECT=0     to have -noscrollcopyrect as the default. | 
 |  * -DSCROLL_COPYRECT_PARMS=...  set default -scrollcopyrect parameters. | 
 |  * -DSCALING_COPYRECT=0 | 
 |  * -DXDAMAGE=0    to have -noxdamage as the default. | 
 |  * -DSKIPDUPS=0   to have -noskip_dups as the default or vice versa. | 
 |  * | 
 |  * -DPOINTER_MODE_DEFAULT={0,1,2,3,4}  set default -pointer_mode. | 
 |  * -DBOLDLY_CLOSE_DISPLAY=0  to not close X DISPLAY under -rawfb. | 
 |  * -DSMALL_FOOTPRINT=1  for smaller binary size (no help, no gui, etc) | 
 |  *                      use 2 or 3 for even smaller footprint. | 
 |  * -DNOGUI  do not include the gui tkx11vnc. | 
 |  * -DPOLL_8TO24_DELAY=N | 
 |  * -DDEBUG_XEVENTS=1  enable printout for X events. | 
 |  * | 
 |  * Set these in CPPFLAGS before running configure. E.g.: | 
 |  * | 
 |  *   % env CPPFLAGS="-DFOREVER -DREMOTE_CONTROL=0" ./configure | 
 |  *   % make | 
 |  */ | 
 |  | 
 |    If other things (e.g. "-I ...") are needed in CPPFLAGS add them as | 
 |    well. | 
 |  | 
 |    On some systems is seems you need to set LC_ALL=C for configure to | 
 |    work properly... | 
 |  | 
 |    Be careful the following two variables: HARDWIRE_PASSWD and | 
 |    HARDWIRE_VIEWPASSWD. If set (remember to include the double quotes | 
 |    around the string), they will be used as default values for the | 
 |    -passwd and -viewpasswd options. Of course the strings will exist | 
 |    unobscured in the x11vnc binary: it better not be readable by | 
 |    unintendeds. Perhaps this is of use in remote access for an embedded | 
 |    application, etc... | 
 |  | 
 |    Let us know if more build-time customizations would be useful. | 
 |  | 
 |  | 
 |    [Win2VNC Related] | 
 |  | 
 |    Q-20: I have two separate machine displays in front of me, one Windows | 
 |    the other X11: can I use x11vnc in combination with Win2VNC in | 
 |    dual-screen mode to pass the keystrokes and mouse motions to the X11 | 
 |    display? | 
 |  | 
 |    Yes, for best response start up x11vnc with the "-nofb" option | 
 |    (disables framebuffer polling, and does other optimizations) on the | 
 |    secondary display (X11) machine. Then start up Win2VNC on the primary | 
 |    display (Windows) referring it to the secondary display. | 
 |  | 
 |    This will also work X11 to X11 using x2vnc, however you would probably | 
 |    just want to avoid VNC and use x2x for that. | 
 |  | 
 |    For reference, here are some links to Win2VNC-like programs for | 
 |    multiple monitor setups: | 
 |      * Original Win2VNC | 
 |      * Enhanced Win2VNC (broken?) and sourceforge link | 
 |      * x2vnc | 
 |      * x2x | 
 |      * zvnc (MorphOS) | 
 |  | 
 |    All of them will work with x11vnc (except x2x where it is not needed.) | 
 |  | 
 |  | 
 |    Q-21: I am running Win2VNC on my Windows machine and "x11vnc -nofb" on | 
 |    Unix to pass keyboard and mouse to the Unix monitor. Whenever I start | 
 |    Win2VNC it quickly disconnects and x11vnc says: | 
 |    rfbProcessClientNormalMessage: read: Connection reset by peer | 
 |  | 
 |    Is the default visual of the X display you run x11vnc on low color | 
 |    (e.g. 8 bit per pixel PseudoColor)? (you can run xdpyinfo to check, | 
 |    look in the "screen" section.) There seems to be a bug in Win2VNC in | 
 |    that it cannot deal correctly with colormaps (PseudoColor is the most | 
 |    common example of a visual with a colormap.) | 
 |  | 
 |    If so, there are a couple options. 1) Can you set the default visual | 
 |    on your display to be depth 24 TrueColor? Sun machines often have 8+24 | 
 |    overlay/multi-depth visuals, and you can make the default visual depth | 
 |    24 TrueColor (see fbconfig(1) and Xsun(1).) 2) As of Feb/2004 x11vnc | 
 |    has the -visual option to allow you to force the framebuffer visual to | 
 |    whatever you want (this usually messes up the colors unless you are | 
 |    very clever.) In this case, the option provides a convenient | 
 |    workaround for the Win2VNC bug: | 
 |   x11vnc -nofb -visual TrueColor -display :0 ... | 
 |  | 
 |    So the visual will be set to 8bpp TrueColor and Win2VNC can handle | 
 |    this. Since Win2VNC does not use the framebuffer data there should be | 
 |    no problems in doing this. | 
 |  | 
 |    Q-22: Can I run "x11vnc -nofb" on a Mac OS X machine to redirect mouse | 
 |    and keyboard input to it from Windows and X11 machines via Win2VNC and | 
 |    x2vnc, respectively? | 
 |  | 
 |    Yes, as of Nov/2006 you can. There may be a trick or two you'll need | 
 |    to do to get the Clipboard exchange between the machines to work. | 
 |  | 
 |  | 
 |  | 
 |    [Color Issues] | 
 |  | 
 |    Q-23: The X display I run x11vnc on is only 8 bits per pixel (bpp) | 
 |    PseudoColor (i.e. only 256 distinct colors.) The x11vnc colors may | 
 |    start out OK, but after a while they are incorrect in certain windows. | 
 |  | 
 |    Use the -flashcmap option to have x11vnc watch for changes in the | 
 |    colormap, and propagate those changes back to connected clients. This | 
 |    can be slow (since the whole screen must be updated over the network | 
 |    whenever the colormap changes.) This flashing colormap behavior often | 
 |    happens if an application installs its own private colormap when the | 
 |    mouse is in its window. "netscape -install" is a well-known historical | 
 |    example of this. Consider reconfiguring the system to 16 bpp or depth | 
 |    24 TrueColor if at all possible. | 
 |  | 
 |    Also note the option -8to24 (Jan/2006) can often remove the need for | 
 |    flashing the colormap. Everything is dynamically transformed to depth | 
 |    24 at 32 bpp using the colormaps. There may be painting errors however | 
 |    (see the following FAQ for tips on reducing and correcting them.) | 
 |  | 
 |    In some rare cases (SCO unixware) the -notruecolor option has | 
 |    corrected colors on 8bpp displays. The red, green, and blue masks were | 
 |    non-zero in 8bpp PseudoColor on an obscure setup, and this option | 
 |    corrected the problems. | 
 |  | 
 |  | 
 |    Q-24: Color problems: Why are the colors for some windows incorrect in | 
 |    x11vnc? BTW, my X display has nice overlay/multi-depth visuals of | 
 |    different color depths: e.g. there are both depth 8 and 24 visuals | 
 |    available at the same time. | 
 |  | 
 |    You may want to review the previous question regarding 8 bpp | 
 |    PseudoColor. | 
 |  | 
 |    On some hardware (Sun/SPARC and SGI), the -overlay option discussed a | 
 |    couple paragraphs down may solve this for you (you may want to skip to | 
 |    it directly.) On other hardware the less robust -8to24 option may help | 
 |    (also discussed below.) | 
 |  | 
 |    Run xdpyinfo(1) to see what the default visual is and what the depths | 
 |    of the other visuals are. Does the default visual have a depth of 8 | 
 |    but there are other visuals of depth 24? If it does, can you possibly | 
 |    re-configure your X server to make a depth 24 visual the default? If | 
 |    you can do it, this will save you a lot of grief WRT colors and x11vnc | 
 |    (and for general usage too!) Here is how I do this on an old | 
 |    Sparcstation 20 running Solaris 9 with SX graphics | 
 |   xinit -- -dev /dev/fb defclass TrueColor defdepth 24 | 
 |  | 
 |    and it works nicely (note: to log into console from the dtlogin | 
 |    window, select "Options -> Command Line Login", then login and enter | 
 |    the above command.) See the -dev section of the Xsun(1) manpage for a | 
 |    description of the above arguments. If you have root permission, a | 
 |    more permanent and convenient thing to do is to record the arguments | 
 |    in a line like: | 
 |   :0  Local local_uid@console root /usr/openwin/bin/Xsun -dev /dev/fb defclass | 
 | TrueColor defdepth 24 | 
 |  | 
 |    in /etc/dt/config/Xservers (copy /usr/dt/config/Xservers.) Also look | 
 |    at the fbconfig(1) and related manpages (e.g. ffbconfig, m64config, | 
 |    pgxconfig, SUNWjfb_config, etc ...) for hardware framebuffer settings | 
 |    that may achieve the same effect. | 
 |  | 
 |    In general for non-Sun machines, look at the "-cc class" and related | 
 |    options in your X server manpage (perhaps Xserver(1)), it may allow | 
 |    modifying the default visual (e.g. "-cc 4", see <X11/X.h> for the | 
 |    visual class numbers.) On XFree86 some video card drivers (e.g. Matrox | 
 |    mga) have settings like Option "Overlay" "24,8" to support multi-depth | 
 |    overlays. For these, use the "-cc 4" X server command line option to | 
 |    get a depth 24 default visual. | 
 |  | 
 |  | 
 |    The -overlay mode: Another option is if the system with overlay | 
 |    visuals is a Sun system running Solaris or SGI running IRIX you can | 
 |    use the -overlay x11vnc option (Aug/2004) to have x11vnc use the | 
 |    Solaris XReadScreen(3X11) function to poll the "true view" of the | 
 |    whole screen at depth 24 TrueColor. XReadDisplay(3X11) is used on | 
 |    IRIX. This is useful for Legacy applications (older versions of | 
 |    Cadence CAD apps are mentioned by x11vnc users) that require the | 
 |    default depth be 8bpp, or the app will use a 8bpp visual even if depth | 
 |    24 visuals are available, and so the default depth workaround | 
 |    described in the previous paragraph is not sufficient for these apps. | 
 |  | 
 |    It seems that Xorg is working toward supporting XReadDisplay(3X11) as | 
 |    part of the RENDER extension work. When it does support it and | 
 |    provides a library API x11vnc will be modified to take advantage of | 
 |    the feature to support -overlay on Linux, *BSD, etc. Until then see | 
 |    the -8to24 mode below. | 
 |  | 
 |    Misc. notes on -overlay mode: An amusing by-product of -overlay mode | 
 |    is that the mouse cursor shape is correct! (i.e. XFIXES is not | 
 |    needed.) The -overlay mode may be somewhat slower than normal mode due | 
 |    to the extra framebuffer manipulations that must be performed. Also, | 
 |    on Solaris there is a bug in that for some popup menus, the windows | 
 |    they overlap will have painting errors (flashing colors) while the | 
 |    popup is up (a workaround is to disable SaveUnders by passing -su to | 
 |    Xsun, e.g. in your /etc/dt/config/Xservers file.) | 
 |  | 
 |  | 
 |    The -8to24 mode: The -8to24 x11vnc option (Jan/2006) is a kludge to | 
 |    try to dynamically rewrite the pixel values so that the 8bpp part of | 
 |    the screen is mapped onto depth 24 TrueColor. This is less robust than | 
 |    the -overlay mode because it is done by x11vnc outside of the X | 
 |    server. So only use it on OS's that do not support -overlay. The | 
 |    -8to24 mode will work if the default visual is depth 24 or depth 8. It | 
 |    scans for any windows within 3 levels of the root window that are 8bpp | 
 |    (i.e. legacy application), or in general ones that are not using the | 
 |    default visual. For the windows it finds it uses XGetSubImage() to | 
 |    retrieve the pixels values and uses the correct indexed colormap to | 
 |    create a depth 24 TrueColor view of the whole screen. This depth 24, | 
 |    32bpp view is exported via VNC. | 
 |  | 
 |    Even on pure 8bpp displays it can be used as an alternative to | 
 |    -flashcmap to avoid color flashing completely. | 
 |  | 
 |    This scheme is approximate and can often lead to painting errors. You | 
 |    can manually correct most painting errors by pressing 3 Alt_L's in a | 
 |    row, or by using something like: -fixscreen V=3.0 to automatically | 
 |    refresh the screen every 3 seconds. Also -fixscreen 8=3.0 has been | 
 |    added to just refresh the non-default visual parts of the screen. | 
 |  | 
 |    In general the scheme uses many resources and may give rise to | 
 |    sluggish behavior. If multiple windows are using different 8bpp | 
 |    indexed colormaps all but one window may need to be iconified for the | 
 |    colors to be correct. There are a number of tunable parameters to try | 
 |    to adjust performance and painting accuracy. The option -8to24 | 
 |    nogetimage can give a nice speedup if the default depth 24 X server | 
 |    supports hiding the 8bpp bits in bits 25-32 of the framebuffer data. | 
 |    On very slow machines -8to24 poll=0.2,cachewin=5.0 gives an useful | 
 |    speedup. See the -8to24 help description for information on tunable | 
 |    parameters, etc. | 
 |  | 
 |  | 
 |    Colors still not working correctly? Run xwininfo on the application | 
 |    with the incorrect colors to verify that the depth of its visual is | 
 |    different from the default visual depth (gotten from xdpyinfo.) One | 
 |    possible workaround in this case is to use the -id option to point | 
 |    x11vnc at the application window itself. If the application is | 
 |    complicated (lots of toplevel windows and popup menus) this may not be | 
 |    acceptable, and may even crash x11vnc (but not the application.) See | 
 |    also -appshare. | 
 |  | 
 |    It is theoretically possible to solve this problem in general (see | 
 |    xwd(1) for example), but it does not seem trivial or sufficiently fast | 
 |    for x11vnc to be able to do so in real time. The -8to24 method does | 
 |    this approximately and is somewhat usable. Fortunately the -overlay | 
 |    option works for Solaris machines with overlay visuals where most of | 
 |    this problem occurs. | 
 |  | 
 |  | 
 |    Q-25: I am on a high color system (depth >= 24) but I seem to have | 
 |    colormap problems. They either flash or everything is very dark. | 
 |  | 
 |    This can happen if the default Visual (use xdpyinfo to list them) is | 
 |    DirectColor instead of TrueColor. These are both usually used in high | 
 |    color modes, but whereas TrueColor uses static ramps for the Red, | 
 |    Green, and Blue components, DirectColor has arbitrary colormaps for | 
 |    the Red, Green, and Blue Components. Currently x11vnc cannot decode | 
 |    these colormaps and treats them just like TrueColor. | 
 |  | 
 |    The only workaround so far is to restart the X server with the "-cc 4" | 
 |    option to force TrueColor as the default visual (DirectColor is "-cc | 
 |    5"; see /usr/include/X11/X.h.) The only place we have seen this is | 
 |    with the virtual framebuffer server Xvfb on Xorg 7.2. So in that case | 
 |    you probably should restart it with something like this: "Xvfb :1 -cc | 
 |    4 -screen 0 1280x1024x24". It should be possible for x11vnc to handle | 
 |    DirectColor, but this hasn't been implemented due to its rare usage. | 
 |  | 
 |    You may also see this problem on an X display with a TrueColor default | 
 |    visual where an application chooses a DirectColor visual for its | 
 |    window(s). It seems the application also needs to install its own | 
 |    colormap for the visual for the colors to be messed up in x11vnc. One | 
 |    can make xwud do this for example. | 
 |  | 
 |  | 
 |    Q-26: How do I figure out the window id to supply to the -id windowid | 
 |    option? | 
 |  | 
 |    Run the xwininfo program in a terminal. It will ask you to click on | 
 |    the desired application window. After clicking, it will print out much | 
 |    information, including the window id (e.g. 0x6000010.) Also, the | 
 |    visual and depth of the window printed out is often useful in | 
 |    debugging x11vnc color problems. | 
 |  | 
 |    Also, as of Dec/2004 you can use "-id pick" to have x11vnc run | 
 |    xwininfo(1) for you and after you click the window it extracts the | 
 |    windowid. Besides "pick" there is also "id:root" to allow you to go | 
 |    back to root window when doing remote-control. | 
 |  | 
 |  | 
 |    Q-27: Why don't menus or other transient windows come up when I am | 
 |    using the -id windowid option to view a single application window? | 
 |  | 
 |    This is related to the behavior of the XGetImage(3X11) and | 
 |    XShmGetImage() interfaces regarding backingstore, saveunders, etc. The | 
 |    way the image is retrieved depends on some aspects of how the X server | 
 |    maintains the display image data and whether other windows are | 
 |    clipping or obscuring it. See the XGetImage(3X11) man page for more | 
 |    details. If you disable BackingStore and SaveUnders in the X server | 
 |    you should be able to see these transient windows. | 
 |  | 
 |    If things are not working and you still want to do the single window | 
 |    polling, try the -sid windowid option ("shifted" windowid.) | 
 |  | 
 |    Update: as of Nov/2009 in the 0.9.9 x11vnc development tarball, there | 
 |    is an experimental Application Sharing mode that improves upon the | 
 |    -id/-sid single window sharing: -appshare (run "x11vnc -appshare | 
 |    -help" for more info.) It is still very primitive and approximate, but | 
 |    at least it displays multiple top-level windows. | 
 |  | 
 |  | 
 |    Q-28: My X display is depth 24 at 24bpp (instead of the normal depth | 
 |    24 at 32bpp.) I'm having lots of color and visual problems with x11vnc | 
 |    and/or vncviewer. What's up? | 
 |  | 
 |    First off, depth 24 at 24bpp (bpp=bits-per-pixel) is fairly uncommon | 
 |    and can cause problems in general. It also can be slower than depth 24 | 
 |    at 32bpp. You might want to switch to 32bpp (for XFree86 see the | 
 |    "-fbbpp 32", DefaultFbBpp, FbBpp and related options.) Perhaps you | 
 |    have 24bpp because the video memory of the machine is low and the | 
 |    screen wouldn't fit in video RAM at 32bpp. For this case depth 16 at | 
 |    16bpp might be an acceptable option. | 
 |  | 
 |    In any event x11vnc should handle depth 24 at 24bpp (although | 
 |    performance may be slower, and you may need to use the ZRLE encoding | 
 |    instead of Tight.) There are some caveats involving the viewer | 
 |    however: | 
 |  | 
 |    The RealVNC Unix viewer cannot handle 24bpp from the server, it will | 
 |    say: "main: setPF: not 8, 16 or 32 bpp?" and exit. I have not checked | 
 |    the RealVNC Windows viewer. | 
 |  | 
 |    So you need to use the TightVNC Unix viewer. However there are some | 
 |    problems with that too. It seems libvncserver does not do 24bpp | 
 |    correctly with the Tight encoding. The colors and screen ultimately | 
 |    get messed up. So you have to use a different encoding with the | 
 |    TightVNC vncviewer, try "zlib", "hextile", or one of the other | 
 |    encodings (e.g. vncviewer -encodings "zlib hextile" ....) I have not | 
 |    checked the TightVNC or UltraVNC Windows viewers. | 
 |  | 
 |    It appears the older RealVNC Unix viewers (e.g. 3.3.3 and 3.3.7) can | 
 |    handle 24bpp from the server, so you may want to use those. They | 
 |    evidently request 32 bpp and libvncserver obliges. | 
 |  | 
 |    Update: as of Apr/2006 you can use the -24to32 option to have x11vnc | 
 |    dynamically transform the 24bpp pixel data to 32bpp. This extra | 
 |    transformation could slow things down further however. | 
 |  | 
 |    Now coming the opposite direction if you are running the vncviewer on | 
 |    the 24bpp display, TightVNC will fail with "Can't cope with 24 | 
 |    bits-per-pixel. Sorry." and RealVNC will fail with "main: Error: | 
 |    couldn't find suitable pixmap format" so evidently you cannot use | 
 |    24bpp for the vncviewers to work on that X display. | 
 |  | 
 |    Note, however, that the Unix viewer in the Enhanced TightVNC Viewer | 
 |    (SSVNC) project can handle 24bpp X displays. It does this by | 
 |    requesting a 16bpp pixel format (or 8bpp if the -bgr233 option has | 
 |    been supplied) from the VNC server, and translates that to 24bpp | 
 |    locally. | 
 |    [Xterminals] | 
 |  | 
 |    Q-29: Can I use x11vnc to view and interact with an Xterminal (e.g. | 
 |    NCD) that is not running UNIX and so x11vnc cannot be run on it | 
 |    directly? | 
 |  | 
 |    You can, but it will likely be very wasteful of network bandwidth | 
 |    since you will be polling the X display over the network as opposed to | 
 |    over the local hardware. To do this, run x11vnc on a UNIX machine as | 
 |    close as possible network-wise (e.g. same switch) to the Xterminal | 
 |    machine. Use the -display option to point the display to that of the | 
 |    Xterminal (you'll of course need basic X11 permission to do that) and | 
 |    finally supply the -noshm option (this enables the polling over the | 
 |    network.) | 
 |  | 
 |    If the Xterminal's X display is open to the network for connections, | 
 |    you might use something like "-display xterm123:0". If you are trying | 
 |    to do this via an SSH tunnel (assuming you can actually ssh into the | 
 |    Xterminal) it will be a little tricky (either use the ssh "-R" option | 
 |    or consider ssh-ing in the other direction.) In all cases the X11 | 
 |    permissions need to allow the connection. | 
 |  | 
 |    The response will likely be sluggish (maybe only one "frame" per | 
 |    second.) This mode is not recommended except for "quick checks" of | 
 |    hard to get to X servers. Use something like "-wait 150" to cut down | 
 |    on the polling rate. You may also need -flipbyteorder if the colors | 
 |    get messed up due to endian byte order differences. | 
 |  | 
 |    Q-30: How do I get my X permissions (MIT-MAGIC-COOKIE file) correct | 
 |    for a Unix/Linux machine acting as an Xterminal? | 
 |  | 
 |    If the X display machine is a traditional Xterminal (where the X | 
 |    server process runs on the Xterminal box, but all of the X client | 
 |    applications (firefox, etc) run on a central server (aka "terminal | 
 |    server")), you will need to log into the Xterminal machine (i.e. get a | 
 |    shell running there) and then start the x11vnc program. If the | 
 |    Xterminal Linux/Unix machine is stripped down (e.g. no users besides | 
 |    root) that may be difficult. | 
 |  | 
 |    The next problem is the login Display Manager (e.g. gdm, kdm), and | 
 |    hence the MIT-MAGIC-COOKIE auth files, are on the central server and | 
 |    not on the Xterminal box where the X server and x11vnc processes are. | 
 |  | 
 |    So unless X permissions are completely turned off (e.g. "xhost +"), to | 
 |    run the x11vnc process on the Xterminal box the MIT-MAGIC-COOKIE auth | 
 |    file data (XAUTHORITY or $HOME/.Xauthority) must be accessible by or | 
 |    copied to the Xterminal. If $HOME/.Xauthority is exported via NFS | 
 |    (this is insecure of course, but has been going on for decades), then | 
 |    x11vnc can simply pick it up via NFS (you may need to use the -auth | 
 |    option to point to the correct file.) Other options include copying | 
 |    the auth file using scp, or something like: | 
 |   central-server>  xauth nextract - xterm123:0 | ssh xterm123 xauth nmerge - | 
 |  | 
 |    and then, say, ssh from central-server to xterm123 to start x11vnc. | 
 |    Here "xterm123" refers to the computer acting as the Xterminal and | 
 |    "central-server" is the terminal server. You can use "xauth -f | 
 |    /path/to/cookie-file list" to examine the contents of the cookie(s) in | 
 |    a file "/path/to/cookie-file". See the xauth(1) manpage for more | 
 |    details. | 
 |  | 
 |    If the display name in the cookie file needs to be changed between the | 
 |    two hosts, see this note on the "xauth add ..." command. | 
 |  | 
 |    A less secure option is to run something like "xhost +127.0.0.1" while | 
 |    sitting at the Xterminal box to allow cookie-free local access for | 
 |    x11vnc. You can run "xhost -127.0.0.1" after x11vnc connects if you | 
 |    want to go back to the original permissions. | 
 |  | 
 |    If the Xterminal is really stripped down and doesn't have any user | 
 |    accounts, NFS, etc. you'll need to contact your system administrator | 
 |    to set something up. It can be done!!!  Some Xterminal projects have | 
 |    actually enabled "run locally" facilities for the running of an | 
 |    occasional app more efficiently locally on the Xterminal box (e.g. | 
 |    realplayer.) | 
 |  | 
 |    Not recommended, but as a last resort, you could have x11vnc poll the | 
 |    Xterminal Display over the network. For this you would run a "x11vnc | 
 |    -noshm ..." process on the central-server (and hope the network admin | 
 |    doesn't get angry...) | 
 |  | 
 |    Note: use of Display Manager (gdm, kdm, ...) auth cookie files (i.e. | 
 |    from /var/...,  /tmp/..., or elsewhere) may require modification via | 
 |    xauth(1) to correctly include the display x11vnc refers to (e.g. | 
 |    "xauth -f cookie-file add :0 . 45be51ae2ce9dfbacd882ab3ef8e96b1", | 
 |    where the "45be51..." cookie value was found from an "xauth -f | 
 |    /path/to/original/cookie-file list") or other reasons. See xauth(1) | 
 |    manpage for full details on how to transfer an MIT-MAGIC-COOKIE | 
 |    between machines and displays. | 
 |  | 
 |    VNCviewer performance on Xterminals:  This isn't related to x11vnc on | 
 |    Xterminals, but we mention it here anyway because of the similar | 
 |    issues. If you are on an Xterminal and want to use vncviewer to | 
 |    connect to a VNC server somewhere, then performance would be best if | 
 |    you ran the viewer on the Xterminal box. Otherwise, (i.e. running the | 
 |    viewer process on the central-server) all of the vncviewer screen | 
 |    drawing is done more inefficiently over the network. Something to | 
 |    consider, especially on a busy network. (BTW, this has all of the | 
 |    above permission, etc, problems: both vncviewer and x11vnc are X | 
 |    client apps desired to be run on the Xterminal box.) | 
 |  | 
 |    [Sun Rays] | 
 |  | 
 |    Q-31: I'm having trouble using x11vnc with my Sun Ray session. | 
 |  | 
 |    The Sun Ray technology is a bit like "VNC done in hardware" (the Sun | 
 |    Ray terminal device, DTU, playing the role of the vncviewer.) | 
 |    Completely independent of that, the SunRay user's session is still an | 
 |    X server that speaks the X11 protocol and so x11vnc simply talks to | 
 |    the X server part to export the SunRay desktop to any place in the | 
 |    world (i.e. not only to a Sun Ray terminal device), creating a sort of | 
 |    "Soft Ray". Please see this discussion of Sun Ray issues for solutions | 
 |    to problems. | 
 |  | 
 |    Also see the Sun Ray Remote Control Toolkit that uses x11vnc. | 
 |  | 
 |    [Remote Control] | 
 |  | 
 |    Q-32: How do I stop x11vnc once it is running in the background? | 
 |  | 
 |    As of Dec/2004 there is a remote control feature. It can change a huge | 
 |    number of parameters on the fly: see the -remote and -query options. | 
 |    To shut down the running x11vnc server just type "x11vnc -R stop". To | 
 |    disconnect all clients do "x11vnc -R disconnect:all", etc. | 
 |  | 
 |    If the -forever option has not been supplied, x11vnc will | 
 |    automatically exit after the first client disconnects. In general if | 
 |    you cannot use the remote control, then you will have to kill the | 
 |    x11vnc process This can be done via: "kill NNNNN" (where NNNNN is the | 
 |    x11vnc process id number found from ps(1)), or "pkill x11vnc", or | 
 |    "killall x11vnc" (Linux only.) | 
 |  | 
 |    If you have not put x11vnc in the background via the -bg option or | 
 |    shell & operator, then simply press Ctrl-C in the shell where x11vnc | 
 |    is running to stop it. | 
 |  | 
 |    Potential Gotcha: If somehow your Keypress of Ctrl-C went through | 
 |    x11vnc to the Xserver that then delivered it to x11vnc it is possible | 
 |    one or both of the Ctrl or C keys will be left stuck in the pressed | 
 |    down state in the Xserver. Tapping the stuck key (either via a new | 
 |    x11vnc or at the physical console) will release it from the stuck | 
 |    state. If the keyboard seems to be acting strangely it is often fixed | 
 |    by tapping Ctrl, Shift, and Alt. Alternatively, the -clear_mods option | 
 |    and -clear_keys option can be used to release pressed keys at startup | 
 |    and exit. The option -clear_all will also try to unset Caps_Lock, | 
 |    Num_Lock, etc. | 
 |  | 
 |  | 
 |    Q-33: Can I change settings in x11vnc without having to restart it? | 
 |    Can I remote control it? | 
 |  | 
 |    Look at the -remote (an alias is -R) and -query (an alias is -Q) | 
 |    options added in Dec/2004. They allow nearly everything to be changed | 
 |    dynamically and settings to be queried. Examples: "x11vnc -R shared", | 
 |    "x11vnc -R forever", "x11vnc -R scale:3/4", "x11vnc -Q modtweak", | 
 |    "x11vnc -R stop", "x11vnc -R disconnect:all", etc.. | 
 |  | 
 |    These commands do not start a x11vnc server, but rather communicate | 
 |    with one that is already running. The X display (X11VNC_REMOTE | 
 |    property) is used as the communication channel, so the X permissions | 
 |    and DISPLAY must be set up correctly for communication to be possible. | 
 |  | 
 |    There is also a simple Tcl/Tk gui based on this remote control | 
 |    mechanism. See the -gui option for more info. You will need to have | 
 |    Tcl/Tk (i.e. /usr/bin/wish) installed for it to work. It can also run | 
 |    in the system tray: "-gui tray" or as a standalone small icon window: | 
 |    "-gui icon". Use "-gui tray=setpass" for a naive user "Share My | 
 |    Desktop" mode. | 
 |  | 
 |    [Security and Permissions] | 
 |  | 
 |    Q-34: How do I create a VNC password for use with x11vnc? | 
 |  | 
 |    You may already have one in $HOME/.vnc/passwd if you have used, say, | 
 |    the vncserver program from the regular RealVNC or TightVNC packages | 
 |    (i.e. launching the Xvnc server.) Otherwise, you could use the | 
 |    vncpasswd(1) program from those packages. | 
 |  | 
 |    As of Jun/2004 x11vnc supports the -storepasswd "pass" "file" option, | 
 |    which is the same functionality of storepasswd. Be sure to quote the | 
 |    "pass" if it contains shell meta characters, spaces, etc. Example: | 
 |   x11vnc -storepasswd 'sword*fish' $HOME/myvncpasswd | 
 |  | 
 |    You then use the password via the x11vnc option: "-rfbauth | 
 |    $HOME/myvncpasswd" | 
 |  | 
 |    As of Jan/2006 if you do not supply any arguments: | 
 |   x11vnc -storepasswd | 
 |  | 
 |    you will be prompted for a password to save to ~/.vnc/passwd (your | 
 |    keystrokes when entering the password will not be echoed to the | 
 |    screen.) If you supply one argument, e.g. "x11vnc -storepasswd | 
 |    ~/.mypass", the password you are prompted for will be stored in that | 
 |    file. | 
 |  | 
 |    x11vnc also has the -passwdfile and -passwd/-viewpasswd plain text | 
 |    (i.e. not obscured like the -rfbauth VNC passwords) password options. | 
 |  | 
 |    You can use the -usepw option to automatically use any password file | 
 |    you have in ~/.vnc/passwd or ~/.vnc/passwdfile (the latter is used | 
 |    with the -passwdfile option.) | 
 |  | 
 |   x11vnc -usepw -display :0 ... | 
 |  | 
 |    If neither file exists you are prompted to store a password in | 
 |    ~/.vnc/passwd. If a password file cannot be found or created x11vnc | 
 |    exits immediately. An admin may want to set it up this way for users | 
 |    who do not know better. | 
 |  | 
 |  | 
 |    Q-35: Can I make it so -storepasswd doesn't show my password on the | 
 |    screen? | 
 |  | 
 |    You can use the vncpasswd program from RealVNC or TightVNC mentioned | 
 |    above. As of Jan/2006 the -storepasswd option without any arguments | 
 |    will not echo your password as you type it and save the file to | 
 |    ~/.vnc/passwd: | 
 |   # x11vnc -storepasswd | 
 |   Enter VNC password: | 
 |   Verify password: | 
 |   Write password to /home/myname/.vnc/passwd?  [y]/n | 
 |   Password written to: /home/myname/.vnc/passwd | 
 |  | 
 |    You can also give it an alternate filename, e.g. "x11vnc -storepasswd | 
 |    ~/.mypass" | 
 |  | 
 |  | 
 |    Q-36: Can I have two passwords for VNC viewers, one for full access | 
 |    and the other for view-only access to the display? | 
 |  | 
 |    Yes, as of May/2004 there is the -viewpasswd option to supply the | 
 |    view-only password. Note the full-access password option -passwd must | 
 |    be supplied at the same time. E.g.: -passwd sword -viewpasswd fish. | 
 |  | 
 |    To avoid specifying the passwords on the command line (where they | 
 |    could be observed via the ps(1) command by any user) you can use the | 
 |    -passwdfile option to specify a file containing plain text passwords. | 
 |    Presumably this file is readable only by you, and ideally it is | 
 |    located on the machine x11vnc is run on (to avoid being snooped on | 
 |    over the network.) The first line of this file is the full-access | 
 |    password. If there is a second line in the file and it is non-blank, | 
 |    it is taken as the view-only password. (use "__EMPTY__" to supply an | 
 |    empty one.) | 
 |  | 
 |    View-only passwords currently do not work for the -rfbauth password | 
 |    option (standard VNC password storing mechanism.) FWIW, note that | 
 |    although the output (usually placed in $HOME/.vnc/passwd) by the | 
 |    vncpasswd or storepasswd programs (or from x11vnc -storepasswd) looks | 
 |    encrypted they are really just obscured to avoid "casual" password | 
 |    stealing. It takes almost no skill to figure out how to extract the | 
 |    plain text passwords from $HOME/.vnc/passwd since it is very | 
 |    straight-forward to work out what to do from the VNC source code. | 
 |  | 
 |  | 
 |    Q-37: Can I have as many full-access and view-only passwords as I | 
 |    like? | 
 |  | 
 |    Yes, as of Jan/2006 in the libvncserver CVS the -passwdfile option has | 
 |    been extended to handle as many passwords as you like. You put the | 
 |    view-only passwords after a line __BEGIN_VIEWONLY__. | 
 |  | 
 |    You can also easily annotate and comment out passwords in the file. | 
 |    You can have x11vnc re-read the file dynamically when it is modified. | 
 |  | 
 |  | 
 |    Q-38: Does x11vnc support Unix usernames and passwords? Can I further | 
 |    limit the set of Unix usernames who can connect to the VNC desktop? | 
 |    Update: as of Feb/2006 x11vnc has the -unixpw option that does this | 
 |    outside of the VNC protocol and libvncserver. The standard su(1) | 
 |    program is used to validate the user's password. A familiar "login:" | 
 |    and "Password:" dialog is presented to the user on a black screen | 
 |    inside the vncviewer. The connection is dropped if the user fails to | 
 |    supply the correct password in 3 tries or does not send one before a | 
 |    25 second timeout. Existing clients are view-only during this period. | 
 |    A list of allowed Unix usernames may also be supplied along with | 
 |    per-user settings. | 
 |  | 
 |    There is also the -unixpw_nis option for non-shadow-password | 
 |    (typically NIS environments, hence the name) systems where the | 
 |    traditional getpwnam() and crypt() functions are used instead of | 
 |    su(1). The encrypted user passwords must be accessible to the user | 
 |    running x11vnc in -unixpw_nis mode, otherwise the logins will always | 
 |    fail even when the correct password is supplied. See ypcat(1) and | 
 |    shadow(5). | 
 |  | 
 |    Two settings are enforced in the -unixpw and -unixpw_nis modes to | 
 |    provide extra security: the 1) -localhost and 2) -stunnel or -ssl | 
 |    options. Without these one might send the Unix username and password | 
 |    data in clear text over the network which is a very bad idea. They can | 
 |    be relaxed if you want to provide encryption other than stunnel or | 
 |    -ssl (the constraint is automatically relaxed if SSH_CONNECTION is set | 
 |    and indicates you have ssh-ed in, however the -localhost requirement | 
 |    is still enforced.) | 
 |  | 
 |    The two -unixpw modes have been tested on Linux, Solaris, Mac OS X, | 
 |    HP-UX, AIX, Tru64, FreeBSD, OpenBSD, and NetBSD. Additional testing is | 
 |    appreciated. For the last 4 it appears that su(1) will not prompt for | 
 |    a password if su-ing to oneself. Since x11vnc requires a password | 
 |    prompt from su, x11vnc forces those logins to fail even when the | 
 |    correct password is supplied. On *BSD it appears this can be corrected | 
 |    by removing the pam_self.so entry in /etc/pam.d/su. | 
 |  | 
 |  | 
 |    Previous older discussion (prior to the -unixpw option): | 
 |  | 
 |    Until the VNC protocol and libvncserver support this things will be | 
 |    approximate at best. | 
 |  | 
 |    One approximate method involves starting x11vnc with the -localhost | 
 |    option. This basically requires the viewer user to log into the | 
 |    workstation where x11vnc is running via their Unix username and | 
 |    password, and then somehow set up a port redirection of his vncviewer | 
 |    connection to make it appear to emanate from the local machine. As | 
 |    discussed above, ssh is useful for this: "ssh -L 5900:localhost:5900 | 
 |    user@hostname ..." See the ssh wrapper scripts mentioned elsewhere on | 
 |    this page. stunnel does this as well. | 
 |  | 
 |    Of course a malicious user could allow other users to get in through | 
 |    his channel, but that is a problem with every method. Another thing to | 
 |    watch out for is a malicious user on the viewer side (where ssh is | 
 |    running) trying to sneak in through the ssh port redirection there. | 
 |  | 
 |    Regarding limiting the set of Unix usernames who can connect, the | 
 |    traditional way would be to further require a VNC password to supplied | 
 |    (-rfbauth, -passwd, etc) and only tell the people allowed in what the | 
 |    VNC password is. A scheme that avoids a second password involves using | 
 |    the -accept option that runs a program to examine the connection | 
 |    information to determine which user is connecting from the local | 
 |    machine. That may be difficult to do, but, for example, the program | 
 |    could use the ident service on the local machine (normally ident | 
 |    should not be trusted over the network, but on the local machine it | 
 |    should be accurate: otherwise root has been compromised and so there | 
 |    are more serious problems! Unfortunately recent Linux distros seem to | 
 |    provide a random string (MD5 hash?) instead of the username.) An | 
 |    example script passed in via -accept scriptname that deduces the Unix | 
 |    username and limits who can be accepted might look something like | 
 |    this: | 
 | #!/bin/sh | 
 | if [ "$RFB_CLIENT_IP" != "127.0.0.1" -o "$RFB_SERVER_IP" != "127.0.0.1" ]; then | 
 |         exit 1  # something fishy... reject it. | 
 | fi | 
 | user=`echo "$RFB_CLIENT_PORT, $RFB_SERVER_PORT" | nc -w 1 $RFB_CLIENT_IP 113 \ | 
 |         | grep 'USERID.*UNIX' | head -n 1 | sed -e 's/[\r ]//g' | awk -F: '{pri | 
 | nt $4}'` | 
 |  | 
 | for okuser in fred barney wilma betty | 
 | do | 
 |         if [ "X$user" = "X$okuser" ]; then | 
 |                 exit 0  # accept it | 
 |         fi | 
 | done | 
 | exit 1  # reject it | 
 |  | 
 |    For this to work with ssh port redirection, the ssh option | 
 |    UsePrivilegeSeparation must be enabled otherwise the userid will | 
 |    always be "root". | 
 |  | 
 |    Here is a similar example based on Linux netstat(1) output: | 
 | #!/bin/sh | 
 | # | 
 | # accept_local_netstat:  x11vnc -accept command to accept a local | 
 | # vncviewer connection from acceptable users.  Linux netstat -nte is used. | 
 |  | 
 | PATH=/bin:/usr/bin:$PATH; export PATH;  # set to get system utils | 
 |  | 
 | allowed="`id -u fred`";                 # add more user numbers if desired. | 
 |  | 
 | # check required settings | 
 | ok=1 | 
 | if [ "X$allowed" = "X" ]; then | 
 |         ok=0;   # something wrong with allowed list | 
 | fi | 
 | if [ "X$RFB_CLIENT_IP" != "X127.0.0.1" -o "X$RFB_SERVER_IP" != "X127.0.0.1" ]; | 
 | then | 
 |         ok=0;   # connection not over localhost | 
 | fi | 
 | if [ "$RFB_CLIENT_PORT" -le 0 -o "$RFB_SERVER_PORT" -le 0 ]; then | 
 |         ok=0;   # something wrong with tcp port numbers | 
 | fi | 
 | if [ "$ok" = 0 ]; then | 
 |         echo "$0: invalid setting:" 1>&2 | 
 |         env | grep ^RFB | sort 1>&2 | 
 |         exit 1 | 
 | fi | 
 |  | 
 | # Linux netstat -nte: | 
 | # Proto Recv-Q Send-Q Local Address           Foreign Address         State | 
 |    User       Inode | 
 | # 0     0      0      RFB_CLIENT              RFB_SERVER           ESTABLISHED | 
 |    nnnn       .... | 
 | # | 
 | user=`netstat -nte | grep ESTABLISHED \ | 
 |         | grep " $RFB_CLIENT_IP:$RFB_CLIENT_PORT  *$RFB_SERVER_IP:$RFB_SERVER_P | 
 | ORT "` | 
 |  | 
 | echo "netstat match: $user" 1>&2 | 
 | user=`echo "$user" | head -n 1 | sed -e 's/^.*ESTABLISHED/ /' | awk '{print $1} | 
 | '` | 
 |  | 
 | ok=0 | 
 | for u in $allowed | 
 | do | 
 |         if [ "X$user" = "X$u" ]; then | 
 |                 ok=1 | 
 |                 break | 
 |         fi | 
 | done | 
 |  | 
 | if [ "X$ok" = "X1" ]; then | 
 |         echo "$0: user accepted: '$user'" 1>&2 | 
 |         exit 0 | 
 | else | 
 |         echo "$0: user '$user' invalid:" 1>&2 | 
 |         echo "$0: allowed: $allowed" 1>&2 | 
 |         env | grep ^RFB | sort 1>&2 | 
 |         exit 1 | 
 | fi | 
 |  | 
 |  | 
 |    Q-39: Can I supply an external program to provide my own custom login | 
 |    method (e.g. Dynamic/One-time passwords or non-Unix (LDAP) usernames | 
 |    and passwords)? | 
 |    Yes, there are several possibilities. For background see the FAQ on | 
 |    the -accept where an external program may be run to decide if a VNC | 
 |    client should be allowed to try to connect and log in. If the program | 
 |    (or local user prompted by a popup) answers "yes", then -accept | 
 |    proceeds to the normal VNC and x11vnc authentication methods, | 
 |    otherwise the connection is dropped. | 
 |  | 
 |    To provide more direct coupling to the VNC client's username and/or | 
 |    supplied password the following options were added in Sep/2006: | 
 |      * -unixpw_cmd command | 
 |      * -passwdfile cmd:command | 
 |      * -passwdfile custom:command | 
 |  | 
 |    In each case "command" is an external command run by x11vnc. You | 
 |    supply it. For example, it may couple to your LDAP system or other | 
 |    servers you set up. | 
 |  | 
 |    For -unixpw_cmd the normal -unixpw Login: and Password: prompts are | 
 |    supplied to the VNC viewer and the strings the client returns are then | 
 |    piped into "command" as the first two lines of its standard input. If | 
 |    the command returns success, i.e. exit(0), the VNC client is accepted, | 
 |    otherwise it is rejected. | 
 |  | 
 |    For "-passwdfile cmd:command" the command is run and it returns a | 
 |    password list (like a password file, see the -passwdfile read:filename | 
 |    mode.) Perhaps a dynamic, one-time password is retrieved from a server | 
 |    this way. | 
 |  | 
 |    For "-passwdfile custom:command" one gets complete control over the | 
 |    VNC challenge-response dialog with the VNC client. x11vnc sends out a | 
 |    string of random bytes (16 by the VNC spec) and the client returns the | 
 |    same number of bytes in a way the server can verify only the | 
 |    authorized user could have created. The VNC protocol specifies DES | 
 |    encryption with a password. If you are willing to modify the VNC | 
 |    viewers, you can have it be anything you want, perhaps a less | 
 |    crackable MD5 hash scheme or one-time pad. Your program will read from | 
 |    its standard input the size of the challenge-response followed by a | 
 |    newline, then the challenge bytes followed by the response bytes. If | 
 |    your command then returns success, i.e. exit(0), the VNC client is | 
 |    accepted, otherwise it is rejected. | 
 |  | 
 |    In all cases the "RFB_*" environment variables are set as under | 
 |    -accept. These variables can provide useful information for the | 
 |    externally supplied program to use. | 
 |  | 
 |  | 
 |    Q-40: Why does x11vnc exit as soon as the VNC viewer disconnects? And | 
 |    why doesn't it allow more than one VNC viewer to connect at the same | 
 |    time? | 
 |  | 
 |    These defaults are simple safety measures to avoid someone unknowingly | 
 |    leaving his X11 desktop exposed (to the internet, say) for long | 
 |    periods of time. Use the -forever option (aka -many) to have x11vnc | 
 |    wait for more connections after the first client disconnects. Use the | 
 |    -shared option to have x11vnc allow multiple clients to connect | 
 |    simultaneously. | 
 |  | 
 |    Recommended additional safety measures include using ssh (see above), | 
 |    stunnel, -ssl, or a VPN to authenticate and encrypt the viewer | 
 |    connections or to at least use the -rfbauth passwd-file option to use | 
 |    VNC password protection (or -passwdfile) It is up to YOU to apply | 
 |    these security measures, they will not be done for you automatically. | 
 |  | 
 |  | 
 |    Q-41: Can I limit which machines incoming VNC clients can connect | 
 |    from? | 
 |  | 
 |    Yes, look at the -allow and -localhost options to limit connections by | 
 |    hostname or IP address. E.g. | 
 |   x11vnc -allow 192.168.0.1,192.168.0.2 | 
 |  | 
 |    for those two hosts or | 
 |   x11vnc -allow 192.168.0. | 
 |  | 
 |    for a subnet. For individual hosts you can use the hostname instead of | 
 |    the IP number, e.g.: "-allow snoopy", and "-allow darkstar,wombat". | 
 |    Note that -localhost achieves the same thing as "-allow 127.0.0.1" | 
 |  | 
 |    For more control, build libvncserver with libwrap support | 
 |    (tcp_wrappers) and then use /etc/hosts.allow See hosts_access(5) for | 
 |    complete details. | 
 |  | 
 |  | 
 |    Q-42: How do I build x11vnc/libvncserver with libwrap (tcp_wrappers) | 
 |    support? | 
 |  | 
 |    Here is one way to pass this information to the configure script: | 
 |   env CPPFLAGS=-DUSE_LIBWRAP LDFLAGS=-lwrap ./configure | 
 |  | 
 |    then run make as usual. This requires libwrap and its development | 
 |    package (tcpd.h) to be installed on the build machine. If additional | 
 |    CPPFLAGS or LDFLAGS options are needed supply them as well using | 
 |    quotes. | 
 |  | 
 |    The resulting x11vnc then uses libwrap/tcp_wrappers for connections. | 
 |    The service name you will use in /etc/hosts.allow and /etc/hosts.deny | 
 |    is "vnc", e.g.: | 
 |   vnc: 192.168.100.3 .example.com | 
 |  | 
 |    Note that if you run x11vnc out of inetd you do not need to build | 
 |    x11vnc with libwrap support because the /usr/sbin/tcpd reference in | 
 |    /etc/inetd.conf handles the tcp_wrappers stuff. | 
 |  | 
 |  | 
 |    Q-43: Can I have x11vnc only listen on one network interface (e.g. | 
 |    internal LAN) rather than having it listen on all network interfaces | 
 |    and relying on -allow to filter unwanted connections out? | 
 |  | 
 |    As of Mar/2005 there is the "-listen ipaddr" option that enables this. | 
 |    For ipaddr either supply the desired network interface's IP address | 
 |    (or use a hostname that resolves to it) or use the string "localhost". | 
 |    For additional filtering simultaneously use the "-allow host1,..." | 
 |    option to allow only specific hosts in. | 
 |  | 
 |    This option is useful if you want to insure that no one can even begin | 
 |    a dialog with x11vnc from untrusted network interfaces (e.g. ppp0.) | 
 |    The option -localhost now implies "-listen localhost" since that is | 
 |    what most people expect it to do. | 
 |  | 
 |  | 
 |    Q-44: Now that -localhost implies listening only on the loopback | 
 |    interface, how I can occasionally allow in a non-localhost via the -R | 
 |    allowonce remote control command? | 
 |  | 
 |    To do this specify "-allow localhost". Unlike -localhost this will | 
 |    leave x11vnc listening on all interfaces (but of course only allowing | 
 |    in local connections, e.g. ssh redirs.) Then you can later run "x11vnc | 
 |    -R allowonce:somehost" or use to gui to permit a one-shot connection | 
 |    from a remote host. | 
 |  | 
 |  | 
 |    Q-45: Can I fine tune what types of user input are allowed? E.g. have | 
 |    some users just be able to move the mouse, but not click or type | 
 |    anything? | 
 |  | 
 |    As of Feb/2005, the -input option allows you to do this. "K", "M", | 
 |    "B", "C", and "F" stand for Keystroke, Mouse-motion, Button-clicks, | 
 |    Clipboard, and File-Transfer, respectively. The setting: "-input M" | 
 |    makes attached viewers only able to move the mouse. "-input KMBC,M" | 
 |    lets normal clients do everything and enables view-only clients to | 
 |    move the mouse. | 
 |  | 
 |    These settings can also be applied on a per-viewer basis via the | 
 |    remote control mechanism or the GUI. E.g. x11vnc -R input:hostname:M | 
 |  | 
 |  | 
 |    Q-46: Can I prompt the user at the local X display whether the | 
 |    incoming VNC client should be accepted or not? Can I decide to make | 
 |    some clients view-only? How about running an arbitrary program to make | 
 |    the decisions? | 
 |  | 
 |    Yes, look at the "-accept command" option, it allows you to specify an | 
 |    external command that is run for each new client. (use quotes around | 
 |    the command if it contains spaces, etc.) If the external command | 
 |    returns 0 (success) the client is accepted, otherwise with any other | 
 |    return code the client is rejected. See below how to also accept | 
 |    clients view-only. | 
 |  | 
 |    The external command will have the RFB_CLIENT_IP environment variable | 
 |    set to the client's numerical IP address, RFB_CLIENT_PORT its port | 
 |    number. Similarly for RFB_SERVER_IP and RFB_SERVER_PORT to allow | 
 |    identification of the tcp virtual circuit. DISPLAY will be set to that | 
 |    of the X11 display being polled. Also, RFB_X11VNC_PID is set to the | 
 |    x11vnc process id (e.g. in case you decided to kill it), RFB_CLIENT_ID | 
 |    will be an id number, and RFB_CLIENT_COUNT the number of other clients | 
 |    currently connected. RFB_MODE will be "accept". | 
 |  | 
 |    Built-in Popup Window: As a special case, "-accept popup" will | 
 |    instruct x11vnc to create its own simple popup window. To accept the | 
 |    client press "y" or click mouse on the "Yes" button. To reject the | 
 |    client press "n" or click mouse on the "No" button. To accept the | 
 |    client View-only, press "v" or click mouse on the "View" button. If | 
 |    the -viewonly option has been supplied, the "View" action will not be | 
 |    present: the whole display is view only in that case. | 
 |  | 
 |    The popup window times out after 120 seconds, to change this behavior | 
 |    use "-accept popup:N" where N is the number of seconds (use 0 for no | 
 |    timeout.) More tricks: "-accept popupmouse" will only take mouse click | 
 |    responses, while "-accept popupkey" will only take keystroke responses | 
 |    (popup takes both.) After any of the 3 popup keywords you can supply a | 
 |    position of the window: +N+M, (the default is to center the window) | 
 |    e.g. -accept popupmouse+10+10. | 
 |  | 
 |    Also as a special case "-accept xmessage" will run the xmessage(1) | 
 |    program to prompt the user whether the client should be accepted or | 
 |    not. This requires that you have xmessage installed and available via | 
 |    PATH. In case it is not already on your system, the xmessage program | 
 |    is available at ftp://ftp.x.org/ | 
 |    (End of Built-in Popup Window:) | 
 |  | 
 |    To include view-only decisions for the external commands, prefix the | 
 |    command something like this: "yes:0,no:*,view:3 mycommand ..." This | 
 |    associates the three actions: yes(accept), no(reject), and | 
 |    view(accept-view-only), with the numerical return (i.e. exit()) codes. | 
 |    Use "*" instead of a number to set the default action (e.g. in case | 
 |    the external command returns an unexpected return code.) | 
 |  | 
 |    Here is an example -accept script called accept_or_lock. It uses | 
 |    xmessage and xlock (replace with your screen lock command, maybe it is | 
 |    "xscreensaver-command -lock", or kdesktop_lock, or "dtaction | 
 |    LockDisplay".) It will prompt the user at the X display whether to | 
 |    accept, reject, or accept view-only the client, but if the prompt | 
 |    times out after 60 seconds the screen is locked and the VNC client is | 
 |    accepted. This allows the remote access when no one is at the display. | 
 | #!/bin/sh | 
 | # | 
 | # accept_or_lock: prompt user at X display whether to accept an incoming | 
 | #                 VNC connection.  If timeout expires, screen is locked | 
 | #                 and the VNC viewer is accepted (allows remote access | 
 | #                 when no one is sitting at the display.) | 
 | # | 
 | # usage: x11vnc ... -forever -accept 'yes:0,no:*,view:4 accept_or_lock' | 
 | # | 
 | xmessage -buttons yes:2,no:3,view-only:4 -center \ | 
 |          -timeout 60 "x11vnc: accept connection from $RFB_CLIENT_IP?" | 
 | rc=$? | 
 | if [ $rc = 0 ]; then | 
 |         xlock & # or "xlock -mode blank" for no animations. | 
 |         sleep 5 | 
 |         exit 0 | 
 | elif [ $rc = 2 ]; then | 
 |         exit 0 | 
 | elif [ $rc = 4 ]; then | 
 |         exit 4 | 
 | fi | 
 | exit 1 | 
 |  | 
 |    Stefan Radman has written a nice dtksh script dtVncPopup for use in | 
 |    CDE environments to do the same sort of thing. Information on how to | 
 |    use it is found at the top of the file. He encourages you to provide | 
 |    feedback to him to help improve the script. | 
 |  | 
 |    Note that in all cases x11vnc will block while the external command or | 
 |    popup is being run, so attached clients will not receive screen | 
 |    updates, etc during this period. | 
 |  | 
 |    To run a command when a client disconnects, use the "-gone command" | 
 |    option. This is for the user's convenience only: the return code of | 
 |    the command is not interpreted by x11vnc. The same environment | 
 |    variables are set as in "-accept command" (except that RFB_MODE will | 
 |    be "gone".) | 
 |  | 
 |    As of Jan/2006 the "-afteraccept command" option will run the command | 
 |    only after the VNC client has been accepted and authenticated. Like | 
 |    -gone the return code is not interpreted. RFB_MODE will be | 
 |    "afteraccept".) | 
 |  | 
 |  | 
 |    Q-47: I start x11vnc as root because it is launched via inetd(8) or a | 
 |    display manager like gdm(1). Can I have x11vnc later switch to a | 
 |    different user? | 
 |  | 
 |    As of Feb/2005 x11vnc has the -users option that allows things like | 
 |    this. Please read the documentation on it (also in the x11vnc -help | 
 |    output) carefully for features and caveats. It's use can often | 
 |    decrease security unless care is taken. | 
 |  | 
 |    BTW, a nice use of it is "-users +nobody" that switches to the Unix | 
 |    user nobody right after connections to the X display are established. | 
 |  | 
 |    In any event, while running x11vnc as root, remember it comes with no | 
 |    warranty ;-). | 
 |  | 
 |  | 
 |    Q-48: I use a screen-lock when I leave my workstation (e.g. | 
 |    xscreensaver or xlock.) When I remotely access my workstation desktop | 
 |    via x11vnc I can unlock the desktop fine, but I am worried people will | 
 |    see my activities on the physical monitor. What can I do to prevent | 
 |    this, or at least make it more difficult? | 
 |  | 
 |    Probably most work environments would respect your privacy if you | 
 |    powered off the monitor. Also remember if people have physical access | 
 |    to your workstation they basically can do anything they want with it | 
 |    (e.g. install a backdoor for later use, etc.) | 
 |  | 
 |    In any event, as of Jun/2004 there is an experimental utility to make | 
 |    it more difficult for nosey people to see your x11vnc activities. The | 
 |    source for it is blockdpy.c The idea behind it is simple (but | 
 |    obviously not bulletproof): when a VNC client attaches to x11vnc put | 
 |    the display monitor in the DPMS "off" state, if the DPMS state ever | 
 |    changes immediately start up the screen-lock program. The x11vnc user | 
 |    will notice something is happening and think about what to do next | 
 |    (while the screen is in a locked state.) | 
 |  | 
 |    This works (or at least has a chance of working) because if the | 
 |    intruder moves the mouse or presses a key on the keyboard, the monitor | 
 |    wakes up out of the DPMS off state, and this induces the screen lock | 
 |    program to activate as soon as possible. Of course there are cracks in | 
 |    this, the eavesdropper could detach your monitor and insert a non-DPMS | 
 |    one, and there are race conditions. As mentioned above this is not | 
 |    bulletproof. A really robust solution would likely require X server | 
 |    and perhaps even video hardware support. | 
 |  | 
 |    The blockdpy utility is launched by the -accept option and told to | 
 |    exit via the -gone option (the vnc client user should obviously | 
 |    re-lock the screen before disconnecting!) Instructions can be found in | 
 |    the source code for the utility at the above link. Roughly it is | 
 |    something like this: | 
 |   x11vnc ... -accept "blockdpy -bg -f $HOME/.bdpy" -gone "touch $HOME/.bdpy" | 
 |  | 
 |    but please read the top of the file. | 
 |  | 
 |    Update: As of Feb/2007 there is some builtin support for this: | 
 |    -forcedpms and -clientdpms however, they are probably less robust than | 
 |    the above blockdpy.c scheme, since if the person floods the physical | 
 |    machine with mouse or pointer input he can usually see flashes of the | 
 |    screen before the monitor is powered off again. See also the -grabkbd, | 
 |    -grabptr, and -grabalways options. | 
 |  | 
 |  | 
 |    Q-49: Can I have x11vnc automatically lock the screen when I | 
 |    disconnect the VNC viewer? | 
 |  | 
 |    Yes, a user mentions he uses the -gone option under CDE to run a | 
 |    screen lock program: | 
 |   x11vnc -display :0 -forever -gone 'dtaction LockDisplay' | 
 |  | 
 |    Other possibilities are: | 
 |   x11vnc -display :0 -forever -gone 'xscreensaver-command -lock' | 
 |   x11vnc -display :0 -forever -gone 'kdesktop_lock' | 
 |   x11vnc -display :0 -forever -gone 'xlock &' | 
 |   x11vnc -display :0 -forever -gone 'xlock -mode blank &' | 
 |  | 
 |    Here is a scheme using the -afteraccept option (in version 0.8) to | 
 |    unlock the screen after the first valid VNC login and to lock the | 
 |    screen after the last valid VNC login disconnects: | 
 |   x11vnc -display :0 -forever -shared -afteraccept ./myxlocker -gone ./myxlocke | 
 | r | 
 |  | 
 |    Where the script ./myxlocker is: | 
 | #!/bin/sh | 
 |  | 
 | #/usr/bin/env | grep RFB_ | sort        # for viewing RFB_* settings. | 
 |  | 
 | if [ "X$RFB_MODE" = "Xafteraccept" ]; then | 
 |         if [ "X$RFB_STATE" = "XNORMAL" ]; then  # require valid login | 
 |                 if [ "X$RFB_CLIENT_COUNT" = "X1" ]; then | 
 |                         killall xlock   # Linux only. | 
 |                 fi | 
 |         fi | 
 | elif [ "X$RFB_MODE" = "Xgone" ]; then | 
 |         if [ "X$RFB_STATE" = "XNORMAL" ]; then  # require valid login | 
 |                 if [ "X$RFB_CLIENT_COUNT" = "X0" ]; then | 
 |                         xlock -mode blank & | 
 |                 fi | 
 |         fi | 
 | fi | 
 |  | 
 |    Note the xlock option "-mode blank" to avoid animations. | 
 |  | 
 |    There is a problem if you have x11vnc running this way in -forever | 
 |    mode and you hit Ctrl-C to stop it. The xlock (or other program) will | 
 |    get killed too. To work around this make a little script called | 
 |    setpgrp that looks like: | 
 | #!/usr/bin/perl | 
 | setpgrp(0, 0); | 
 | exec @ARGV; | 
 |  | 
 |    then use -gone "setpgrp xlock &", etc. | 
 |    [Encrypted Connections] | 
 |  | 
 |    Q-50: How can I tunnel my connection to x11vnc via an encrypted SSH | 
 |    channel between two Unix machines? | 
 |  | 
 |    See the description earlier on this page on how to tunnel VNC via SSH | 
 |    from Unix to Unix. A number of ways are described along with some | 
 |    issues you may encounter. | 
 |  | 
 |    Other secure encrypted methods exists, e.g. stunnel, IPSEC, various | 
 |    VPNs, etc. | 
 |  | 
 |    See also the Enhanced TightVNC Viewer (SSVNC) page where much of this | 
 |    is now automated. | 
 |  | 
 |  | 
 |    Q-51: How can I tunnel my connection to x11vnc via an encrypted SSH | 
 |    channel from Windows using an SSH client like Putty? | 
 |  | 
 |    Above we described how to tunnel VNC via SSH from Unix to Unix, you | 
 |    may want to review it. To do this from Windows using Putty it would go | 
 |    something like this: | 
 |      * In the Putty dialog window under 'Session' enter the hostname or | 
 |        IP number of the Unix machine with display to be viewed. | 
 |      * Make sure the SSH protocol is selected and the server port is | 
 |        correct. | 
 |      * Under 'Connections/SSH/Tunnels' Add a Local connection with | 
 |        'Source port:  5900' and 'Destination:  localhost:5900' | 
 |      * Log into the remote machine by pressing 'Open' and supplying | 
 |        username, password, etc. | 
 |      * In that SSH shell, start up x11vnc by typing the command: x11vnc | 
 |        -display :0 plus any other desired options (e.g. -localhost.) | 
 |      * Finally, start up your VNC Viewer in Windows and enter | 
 |        'localhost:0' as the VNC server. | 
 |  | 
 |    You can keep all of the settings in a Putty 'Saved Session'. Also, | 
 |    once everything is working, you can consider putting x11vnc -display | 
 |    :0 (plus other cmdline options) in the 'Remote command' Putty setting | 
 |    under 'Connections/SSH'. | 
 |  | 
 |    See also the Enhanced TightVNC Viewer (SSVNC) page where much of this | 
 |    is now automated via the Putty plink utility. | 
 |  | 
 |    For extra protection feel free to run x11vnc with the -localhost and | 
 |    -rfbauth/-passwdfile options. | 
 |  | 
 |    If the machine you SSH into via Putty is not the same machine with the | 
 |    X display you wish to view (e.g. your company provides incoming SSH | 
 |    access to a gateway machine), then you need to change the above Putty | 
 |    dialog setting to: 'Destination: otherhost:5900', Once logged in, | 
 |    you'll need to do a second login (ssh or rsh) to the workstation | 
 |    machine 'otherhost' and then start up x11vnc on it. This can also be | 
 |    automated by Chaining SSH's. | 
 |  | 
 |    As discussed above another option is to first start the VNC viewer in | 
 |    "listen" mode, and then launch x11vnc with the "-connect localhost" | 
 |    option to establish the reverse connection. In this case a Remote port | 
 |    redirection (not Local) is needed for port 5500 instead of 5900 (i.e. | 
 |    'Source port:  5500' and 'Destination:  localhost:5500' for a Remote | 
 |    connection.) | 
 |  | 
 |  | 
 |    Q-52: How can I tunnel my connection to x11vnc via an encrypted SSL | 
 |    channel using an external tool like stunnel? | 
 |  | 
 |    It is possible to use a "lighter weight" encryption setup than SSH or | 
 |    IPSEC. SSL tunnels such as stunnel (also stunnel.org) provide an | 
 |    encrypted channel without the need for Unix users, passwords, and key | 
 |    passphrases required for ssh (and at the other extreme SSL can also | 
 |    provide a complete signed certificate chain of trust.) On the other | 
 |    hand, since SSH is usually installed everywhere and firewalls often | 
 |    let its port through, ssh is frequently the path of least resistance | 
 |    (it also nicely manages public keys for you.) | 
 |  | 
 |    Update: As of Feb/2006 x11vnc has the options -ssl, -stunnel, and | 
 |    -sslverify to provide integrated SSL schemes. They are discussed in | 
 |    the Next FAQ (you probably want to skip to it now.) | 
 |  | 
 |    We include these non-built-in method descriptions below for historical | 
 |    reference. They are handy because can be used to create SSL tunnels to | 
 |    any VNC (or other type of) server. | 
 |  | 
 |  | 
 |    Here are some basic examples using stunnel but the general idea for | 
 |    any SSL tunnel utility is the same: | 
 |      * Start up x11vnc and constrain it to listen on localhost. | 
 |      * Then start up the SSL tunnel running on the same machine to | 
 |        forward incoming connections to that x11vnc. | 
 |      * Set up and run a similar SSL tunnel for the outgoing connection on | 
 |        the VNC viewer machine pointing it to the SSL/x11vnc server. | 
 |      * Optionally, set up server (or even client) public/private keys for | 
 |        use in authenticating one side to the other. | 
 |      * Finally, start the VNC Viewer and tell it to connect to the local | 
 |        port (e.g. a vnc display localhost:0) where its outgoing SSL | 
 |        tunnel is listening. | 
 |  | 
 |    We'll first use the stunnel version 3 syntax since it is the most | 
 |    concise and Unixy. | 
 |  | 
 |    Start up x11vnc listening on port 5900: | 
 |   x11vnc -display :0 -rfbport 5900 -localhost -bg -passwdfile ~/mypass | 
 |  | 
 |    Then start stunnel (version 3, not 4) with this command: | 
 |   stunnel -d 5901 -r 5900 -p /path/to/stunnel.pem | 
 |  | 
 |    The above two commands are run on host "far-away.east". The | 
 |    stunnel.pem is the self-signed PEM file certificate created when | 
 |    stunnel is built. One can also create certificates signed by | 
 |    Certificate Authorities or self-signed if desired using the x11vnc | 
 |    utilities described there. | 
 |  | 
 |    SSL Viewers:  Next, on the VNC viewer side we need an SSL tunnel to | 
 |    encrypt the outgoing connection. The nice thing is any SSL tunnel can | 
 |    be used because the protocol is a standard. For this example we'll | 
 |    also use stunnel on the viewer side on Unix. First start up the | 
 |    client-side stunnel (version 3, not 4): | 
 |   stunnel -c -d localhost:5902 -r far-away.east:5901 | 
 |  | 
 |    Then point the viewer to the local tunnel on port 5902: | 
 |   vncviewer -encodings "copyrect tight zrle hextile" localhost:2 | 
 |  | 
 |    That's it.  Note that the ss_vncviewer script can automate this | 
 |    easily, and so can the Enhanced TightVNC Viewer (SSVNC) package. | 
 |  | 
 |    Be sure to use a VNC password because unlike ssh by default the | 
 |    encrypted SSL channel provides no authentication (only privacy.) With | 
 |    some extra configuration one could also set up certificates to provide | 
 |    authentication of either or both sides as well (and hence avoid | 
 |    man-in-the-middle attacks.) See the stunnel and openssl documentation | 
 |    and also the key management section for details. | 
 |  | 
 |    stunnel has also been ported to Windows, and there are likely others | 
 |    to choose from for that OS. Much info for using it on Windows can be | 
 |    found at the stunnel site and in this article The article also shows | 
 |    the detailed steps to set up all the authentication certificates. (for | 
 |    both server and clients, see also the x11vnc utilities that do this.) | 
 |    The default Windows client setup (no certs) is simpler and only 4 | 
 |    files are needed in a folder: stunnel.exe, stunnel.conf, libssl32.dll, | 
 |    libeay32.dll. We used an stunnel.conf containing: | 
 | # stunnel.conf: | 
 | client = yes | 
 | options = ALL | 
 | [myvncssl] | 
 | accept = localhost:5902 | 
 | connect = far-away.east:5901 | 
 |  | 
 |    then double click on the stunnel.exe icon to launch it (followed by | 
 |    pointing the VNC viewer to localhost:2). | 
 |  | 
 |  | 
 |    stunnel inetd-like mode: | 
 |  | 
 |    As an aside, if you don't like the little "gap" of unencrypted TCP | 
 |    traffic (and a localhost listening socket) on the local machine | 
 |    between stunnel and x11vnc it can actually be closed by having stunnel | 
 |    start up x11vnc in -inetd mode: | 
 |   stunnel -p /path/to/stunnel.pem -P none -d 5900 -l ./x11vnc_sh | 
 |  | 
 |    Where the script x11vnc_sh starts up x11vnc: | 
 | #!/bin/sh | 
 | x11vnc -q -inetd -display :0 -passwdfile ~/mypass | 
 |  | 
 |    Note that this creates a separate x11vnc process for each incoming | 
 |    connection (as any inetd x11vnc usage would), but for the case of | 
 |    normally just one viewer at a time it should not be a big problem. | 
 |  | 
 |  | 
 |    stunnel 4 syntax: | 
 |  | 
 |    Somewhat sadly, the stunnel version 4 syntax is not so amenable to the | 
 |    command line or scripts. You need to create a config file with the | 
 |    parameters. E.g.: | 
 |   stunnel x11vnc.cfg | 
 |  | 
 |    Where the file x11vnc.cfg contains: | 
 | foreground = yes | 
 | pid = | 
 | cert = /path/to/stunnel.pem | 
 | [x11vnc_stunnel] | 
 | accept  = 5901 | 
 | connect = 5900 | 
 |  | 
 |    One nice thing about version 4 is often the PEM file does not need to | 
 |    be specified because stunnel finds it in its installed area. One other | 
 |    gotcha the PEM file is usually only readable by root (it has the | 
 |    private key afterall), so you'll need to relax the permissions or make | 
 |    a copy that the user running x11vnc/stunnel can read. | 
 |  | 
 |  | 
 |    SSL VNC Viewers: | 
 |  | 
 |    Regarding VNC viewers that "natively" do SSL unfortunately there do | 
 |    not seem to be many. The SingleClick UltraVNC Java Viewer is SSL and | 
 |    is compatible with x11vnc's -ssl option and stunnel.) Commercial | 
 |    versions of VNC seem to have some SSL-like encryption built in, but we | 
 |    haven't tried those either and they probably wouldn't work since their | 
 |    (proprietary) SSL-like negotiation is likely embedded in the VNC | 
 |    protocol unlike our case where it is external. | 
 |  | 
 |    Note: as of Mar/2006 libvncserver/x11vnc provides a SSL-enabled Java | 
 |    applet that can be served up via the -httpdir or -http options when | 
 |    -ssl is enabled. It will also be served via HTTPS via either the VNC | 
 |    port (e.g. https://host:5900/) or a 2nd port via the -https option. | 
 |  | 
 |    In general current SSL VNC solutions are not particularly "seemless". | 
 |    But it can be done, and with a wrapper script on the viewer side and | 
 |    the -stunnel or -ssl option on the server side it works well and is | 
 |    convenient. Here is a simple script ss_vncviewer that automates | 
 |    running stunnel on the VNC viewer side on Unix a little more carefully | 
 |    than the commands printed above. (One could probably do a similar | 
 |    thing with a .BAT file on Windows in the stunnel folder.) | 
 |  | 
 |    Update Jul/2006: we now provide an Enhanced TightVNC Viewer (SSVNC) | 
 |    package that starts up STUNNEL automatically along with some other | 
 |    features. All binaries (stunnel, vncviewer, and some utilities) are | 
 |    provided in the package. It works on Unix, Mac OS X, and Windows. | 
 |  | 
 |  | 
 |    Q-53: Does x11vnc have built-in SSL tunneling? | 
 |  | 
 |    You can read about non-built-in methods in the Previous FAQ for | 
 |    background. | 
 |  | 
 |    SSL tunnels provide an encrypted channel without the need for Unix | 
 |    users, passwords, and key passphrases required for ssh (and at the | 
 |    other extreme SSL can also provide a complete signed certificate chain | 
 |    of trust.) On the other hand, since SSH is usually installed | 
 |    everywhere and firewalls often let its port through, ssh is frequently | 
 |    the path of least resistance. | 
 |  | 
 |    Built-in SSL x11vnc options: | 
 |  | 
 |    As of Feb/2006 the x11vnc -ssl option automates the SSL tunnel | 
 |    creation on the x11vnc server side. An SSL-enabled Java Viewer applet | 
 |    is also provided that can be served via HTTP or HTTPS to automate SSL | 
 |    on the client side. | 
 |  | 
 |    The -ssl mode uses the www.openssl.org library if available at build | 
 |    time. | 
 |  | 
 |    The mode requires an SSL certificate and key (i.e. .pem file.) These | 
 |    are usually created via the openssl(1) program (in fact in for "-ssl" | 
 |    (same as "-ssl SAVE") it will run openssl for you automatically.) So | 
 |    the SSL is not completely "built-in" since this external tool needs to | 
 |    be installed, but at least x11vnc runs it for you automatically. | 
 |  | 
 |    An -ssl example: | 
 |   x11vnc -display :0 -ssl -passwdfile ~/mypass | 
 |  | 
 |    You'll get output like this: | 
 |   09/04/2006 19:27:35 Creating a self-signed PEM certificate... | 
 |   09/04/2006 19:27:35 | 
 |   ... | 
 |  | 
 |   The SSL VNC desktop is:  far-away.east:0 | 
 |   PORT=5900 | 
 |   SSLPORT=5900 | 
 |  | 
 |    In this case openssl(1) was used to create a PEM automatically. It | 
 |    will prompt you if you want to protect it with with a passphrase. Use | 
 |    "-ssl SAVE_NOPROMPT" to not be prompted. Use "-ssl TMP" to create a | 
 |    temporary self-signed cert that will be discarded when x11vnc exits. | 
 |  | 
 |    Update: As of Nov/2008 x11vnc also supports the VeNCrypt SSL/TLS | 
 |    tunnel extension to the VNC protocol. The older ANONTLS method (vino) | 
 |    is also supported. This support is on by default when the -ssl option | 
 |    is in use and can be fine-tuned using these options: -vencrypt, | 
 |    -anontls, and -sslonly. | 
 |  | 
 |    The normal x11vnc -ssl operation is somewhat like a URL method | 
 |    vncs://hostname if vnc://hostname indicates a standard unencrypted VNC | 
 |    connection. Just as https://hostname is an SSL encrypted version of | 
 |    http://hostname. The entire VNC session goes through the SSL tunnel. | 
 |    VeNCrypt, on the other hand, switches to SSL/TLS early in the VNC | 
 |    protocol handshake. x11vnc 0.9.6 supports both simultaneously when | 
 |    -ssl is active. | 
 |  | 
 |  | 
 |    SSL VNC Viewers:. Viewer-side will need to use SSL as well. See the | 
 |    next FAQ and here for SSL enabled VNC Viewers, including SSVNC, to | 
 |    connect to the above x11vnc via SSL. | 
 |  | 
 |  | 
 |    As seen above, the PEM (privacy enhanced mail) file does not need to | 
 |    be supplied if the openssl(1) command is available in PATH, in that | 
 |    case a self-signed, certificate good the current and subsequent x11vnc | 
 |    sessions is created (this may take a while on very slow machines.) | 
 |  | 
 |    In general, the PEM file contains both the Certificate (i.e. public | 
 |    key) and the Private Key. Because of the latter, the file should be | 
 |    protected from being read by untrusted users. The best way to do this | 
 |    is to encrypt the key with a passphrase (note however this requires | 
 |    supplying the passphrase each time x11vnc is started up.) | 
 |  | 
 |    See the discussion on x11vnc Key Management for some utilities | 
 |    provided for creating and managing certificates and keys and even for | 
 |    creating your own Certificate Authority (CA) for signing VNC server | 
 |    and client certificates. This may be done by importing the certificate | 
 |    into Web Browser or Java plugin keystores, or pointing stunnel to it. | 
 |    The wrapper script ss_vncviewer provides an example on unix (see the | 
 |    -verify option.) | 
 |  | 
 |    Here are some notes on the simpler default (non-CA) operation. To have | 
 |    x11vnc save the generated certificate and key, use the "SAVE" keyword | 
 |    like this: | 
 |   x11vnc -ssl SAVE -display :0 ... | 
 |  | 
 |    (this is the same as the default: "-ssl".) This way it will be saved | 
 |    in the default directory ~/.vnc/certs/ as server.crt (the certificate | 
 |    only) and server.pem (both certificate and private key.) This opens up | 
 |    the possibility of copying the server.crt to machines where the VNC | 
 |    Viewer will be run to enable authenticating the x11vnc SSL VNC server | 
 |    to the clients. When authentication takes place this way (or via the | 
 |    more sophisticated CA signing described here), then | 
 |    Man-In-The-Middle-Attacks are prevented. Otherwise, the SSL encryption | 
 |    only provides protection against passive network traffic "sniffing" | 
 |    (i.e. you are not protected against M-I-T-M attacks.) Nowadays, most | 
 |    people seem mostly concerned mainly about passive sniffing (and the | 
 |    default x11vnc SSL mode protects against it.) Note that there are | 
 |    hacker tools like dsniff/webmitm and cain that implement SSL | 
 |    Man-In-The-Middle attacks. They rely on the client not bothering to | 
 |    check the cert. | 
 |  | 
 |  | 
 |    One can test to some degree that SSL is working after starting x11vnc | 
 |    with the -stunnel or -ssl option. From another machine one can use the | 
 |    openssl command something like this: | 
 |  openssl s_client -debug -msg -showcerts -connect far-away.east:5900 | 
 |  | 
 |    After all of the debugging output and informational messages you'll | 
 |    see the string "RFB 003.008" that came from x11vnc. Pointing a web | 
 |    browser connecting to: https://far-away.east:5900/ and then viewing | 
 |    the SSL certificate information about the connection in the panels | 
 |    will also work. | 
 |  | 
 |    Note: If you serve up the SSL enabled Java VNC Viewer via something | 
 |    like: | 
 |  x11vnc -ssl -httpdir /usr/local/share/x11vnc/classes/ssl | 
 |  | 
 |    (or just the -http option), you can test it out completely using that, | 
 |    including using https to download it into the browser and connect to | 
 |    x11vnc. | 
 |  | 
 |  | 
 |    The older -stunnel option: Before the -ssl option there was a | 
 |    convenience option -stunnel that would start an external SSL tunnel | 
 |    for you using stunnel. The -ssl method is the preferred way, but for | 
 |    historical reference we keep the -stunnel info here. | 
 |  | 
 |    The -stunnel mode requires the stunnel.mirt.net command stunnel(8) to | 
 |    be installed on the system. | 
 |  | 
 |    Some -stunnel examples: | 
 |   x11vnc -display :0 -stunnel /path/to/stunnel.pem -passwdfile ~/mypass | 
 |  | 
 |   x11vnc -display :0 -stunnel SAVE ... | 
 |  | 
 |    You'll get output like this: | 
 |   The VNC desktop is:      localhost:50 | 
 |   The SSL VNC desktop is:  far-away.east:0 | 
 |   PORT=5950 | 
 |   SSLPORT=5900 | 
 |  | 
 |    That indicates stunnel is listening on port 5900 for incoming | 
 |    SSL-wrapped VNC connections from viewers. x11vnc is listening for | 
 |    local connections on port 5950 in this case (remote viewers cannot | 
 |    connect to it directly.) For -stunnel to work the stunnel command must | 
 |    be installed on the machine and available in PATH (note stunnel is | 
 |    often installed in sbin directories rather than bin.) Note that the | 
 |    default "-stunnel" by itself creates a temporary cert (as in "-ssl | 
 |    TMP".) | 
 |  | 
 |  | 
 |    Q-54: How do I use VNC Viewers with built-in SSL tunneling? | 
 |  | 
 |    Notes on using "native" VNC Viewers with SSL: | 
 |  | 
 |    There aren't any native VNC Viewers that do SSL (ask your VNC viewer | 
 |    developer to add the feature.) So a tunnel must be setup that you | 
 |    point the VNC Viewer to. This is often STUNNEL. You can do this | 
 |    manually, or use the ss_vncviewer script on Unix, or our Enhanced | 
 |    TightVNC Viewer (SSVNC) package on Unix, Windows, or MacOSX. See the | 
 |    next section for Java Web browser SSL VNC Viewers (you only need a | 
 |    Java-enabled Web browser for it to work.) | 
 |  | 
 |    Notes on the SSL enabled Java VNC Viewer provided in x11vnc | 
 |    classes/ssl/VncViewer.jar: | 
 |  | 
 |    A Java applet VNC Viewer allows you to connect to a VNC Server from a | 
 |    Java-enabled Web browser. | 
 |  | 
 |    The SSL enabled Java VNC Viewer (VncViewer.jar) in the x11vnc package | 
 |    supports only SSL based connections by default. As mentioned above the | 
 |    -httpdir can be used to specify the path to .../classes/ssl. A typical | 
 |    location might be /usr/local/share/x11vnc/classes/ssl. Or -http can be | 
 |    used to try to have it find the directory automatically. | 
 |  | 
 |    Also note that the SingleClick UltraVNC Java Viewer is compatible with | 
 |    x11vnc's -ssl SSL mode. (We tested it this way: "java -cp | 
 |    ./VncViewer.jar VncViewer HOST far-away.east PORT 5900 USESSL 1 | 
 |    TRUSTALL 1") | 
 |  | 
 |    The Java viewer uses SSL to communicate securely with x11vnc. Note | 
 |    that the applet can optionally also be downloaded into your web | 
 |    browser via HTTPS (which is HTTP over SSL.) This way the HTML page and | 
 |    the Java applet itself are also delivered securely with SSL (as | 
 |    opposed to only the VNC traffic being encrypted with SSL.) | 
 |  | 
 |    For this case the output will be something like this: | 
 |   x11vnc -ssl SAVE -http | 
 |   ... | 
 |   The SSL VNC desktop is:  far-away.east:0 | 
 |   Java SSL viewer URL:     https://far-away.east:5900/ | 
 |   Java SSL viewer URL:     http://far-away.east:5800/ | 
 |   PORT=5900 | 
 |   SSLPORT=5900 | 
 |  | 
 |    Indicating the two URLs (the first one encrypted, the second not) one | 
 |    could point the web browser at to get the VNC viewer applet. E.g. put | 
 |    this | 
 |    http://far-away.east:5800/ | 
 |  | 
 |    or: | 
 |    https://far-away.east:5900/ | 
 |  | 
 |    into your Java-enabled Web browser. | 
 |  | 
 |    Note that KDE's Konqueror web browser seems to have problems with | 
 |    https Java applets, so you'll have to use the http/5800 with it (if | 
 |    you get https/5900 working let us know how you did it.) | 
 |  | 
 |    If you are using a router/firewall with port-redirection, and you are | 
 |    redirecting ports other than the default ones (5800, 5900) listed | 
 |    above see here. | 
 |  | 
 |    The https service provided thru the actual VNC port (5900 in the above | 
 |    example) can occasionally be slow or unreliable (it has to read some | 
 |    input and try to guess if the connection is VNC or HTTP.) If it is | 
 |    unreliable for you and you still want to serve the Java applet via | 
 |    https, use the -https option to get an additional port dedicated to | 
 |    https (its URL will also be printed in the output.) | 
 |  | 
 |    Another possibility is to add the GET applet parameter: | 
 |   https://far-away.east:5900/?GET=1 | 
 |  | 
 |    This will have the VNC Viewer send a special HTTP GET string "GET | 
 |    /request.https.vnc.connection HTTP/1.0" that x11vnc will notice more | 
 |    quickly as a request for a VNC connection. Otherwise it must wait for | 
 |    a timeout to expire before it assumes a VNC connection. | 
 |  | 
 |    You may also use "urlPrefix=somestring" to have /somestring prepended | 
 |    to /request.https.vnc.connection". Perhaps you are using a web server | 
 |    proxy scheme to enter a firewall or otherwise have rules applied to | 
 |    the URL. If you need to have any slashes "/" in "somestring" use | 
 |    "_2F_" (a deficiency in libvncserver prevents using the more natural | 
 |    "%2F".) | 
 |  | 
 |    You apply multiple applet parameters in the regular URL way, e.g.: | 
 |   https://far-away.east:5900/?GET=1&urlPrefix=mysubdir&... | 
 |  | 
 |    All of the x11vnc Java Viewer applet parameters are described in the | 
 |    file classes/ssl/README | 
 |  | 
 |  | 
 |    Tips on Getting the SSL Java Applet Working the First Time: | 
 |    Unfortunately, it can be a little tricky getting the SSL VNC Java | 
 |    Viewer working with x11vnc. Here are some tips to getting working the | 
 |    first time (afterwards you can incrementally customize with more | 
 |    complex settings.) | 
 |      * First try it on the LAN: Do NOT try to have it work the first time | 
 |        going through firewalls, Web proxies, home router port | 
 |        redirections, or Apache portal. Just try a direct connection over | 
 |        your LAN first (if you only have 1 machine and no LAN, just do a | 
 |        direct connection to the same machine: localhost.) If the LAN | 
 |        machine you run x11vnc on has its own host-level firewall (most | 
 |        linux machine come with that on by default), disable it or at | 
 |        least let tcp ports 5800-6000 through. | 
 |      * First try HTTP to download the Java Applet: x11vnc can serve both | 
 |        the Java Applet jar file and VNC out of the same port (both | 
 |        tunneled through SSL, see below.) But it can lead to timing and | 
 |        other problems. So first try HTTP instead of HTTPS to download the | 
 |        Applet jar file (VncViewer.jar.) That is to say try | 
 |        http://hostname:5800 in your web browser first before trying | 
 |        https://hostname:5900. x11vnc will print out the ports and URLs it | 
 |        is using, so use the HTTP one it prints out. | 
 |      * Always Restart the Browser: If you are having failures and have to | 
 |        repeatedly retry things ALWAYS restart the browser (i.e. | 
 |        completely exit it and then start a new browser process) each | 
 |        time. Otherwise as you are changing things the browser may | 
 |        "remember" failed applet downloads, etc. and just add to the | 
 |        confusion and irreproducibility. If you see it trying to download | 
 |        VncViewer.class (instead of VncViewer.jar) you know it is really | 
 |        confused and needs to be restarted. | 
 |      * Step Lively: If you get Browser or Java VM or VNC Viewer applet | 
 |        dialog boxes saying things like "Do you want to trust this | 
 |        certificate?" or "The hostname does not match the one on the | 
 |        certificate", etc. just go through them as quickly as possible. | 
 |        x11vnc cannot wait forever for each SSL connection, and so if you | 
 |        dawdle too long inspecting the certs, etc it can lead to problems. | 
 |        Get it working first before taking your time to read the details | 
 |        in the dialogs, etc. | 
 |      * No inetd, Please: Even if you intend to deploy via inetd or xinetd | 
 |        eventually, get that working later (and remember do not use | 
 |        something like "-ssl TMP" that creates a new temporary SSL | 
 |        certificate for every new socket connection.) | 
 |      * Nothing Fancy: Do not try fancy stuff like -svc, -create, -unixpw, | 
 |        "-users unixpw=", "-users sslpeer=", -sslverify, etc. Just get the | 
 |        simplest connection working first and then incrementally add what | 
 |        you need. | 
 |  | 
 |    So the recommended test command lines are: | 
 |    x11vnc -ssl SAVE -http | 
 |    x11vnc -ssl SAVE -httpdir /path/to/x11vnc/classes/ssl | 
 |  | 
 |    Use the latter if x11vnc cannot automatically find the classes/ssl | 
 |    directory (this what the -http option instructs it to do.) Then point | 
 |    your browser to the HTTP (not HTTPS) URL it prints out. | 
 |  | 
 |    Following the above guidelines, did it work? If so, Congratulations!! | 
 |    you created an SSL encrypted connection between the SSL Java applet | 
 |    running in your web browser and x11vnc. The fact that you used HTTP | 
 |    instead of HTTPS to download the applet is not the end of the world | 
 |    (some users do it this way), the main thing is that the VNC traffic is | 
 |    encrypted with SSL. If you are having trouble even with the above | 
 |    baseline test case feel free to contact me (please send the Full | 
 |    x11vnc output, not just part of it; the complete x11vnc command line; | 
 |    the URL(s) entered in the browser; the full Java Console output; and | 
 |    anything else you can think of.) | 
 |  | 
 |    Next, you can add the features you want one by one testing it still | 
 |    works each time. I suggest first turning on the HTTPS applet download | 
 |    (https://hostname:5900) if that is what you intend to use. That one | 
 |    gives the most trouble because of the ambiguity of passing two | 
 |    different protocols (HTTP and VNC) through the same SSL service port. | 
 |  | 
 |    Next, turn on inetd if you intend to use that (this can be tricky too, | 
 |    be sure to use -oa logfile and inspect it carefully if there are | 
 |    problems.) If you are going to use non-standard ports (e.g. "-rfbport | 
 |    443" as root), work on that next. Then enable the firewall, router | 
 |    port redirection channel (you will somehow need to be outside to do | 
 |    that, maybe test that through another VNC session.) | 
 |  | 
 |    Then, if you plan to use them, enable "fancy stuff" like "-svc" or | 
 |    "-unixpw", etc, etc. Be sure to add a password either "-rfbauth" or | 
 |    "-unixpw" or both. If you need to have the web browser use a corporate | 
 |    Web Proxy (i.e. it cannot connect directly) work on that last. Ditto | 
 |    for the Apache portal. | 
 |  | 
 |  | 
 |    Router/Firewall port redirs:  If you are doing port redirection at | 
 |    your router to an internal machine running x11vnc AND the internet | 
 |    facing port is different from the internal machine's VNC port, you | 
 |    will need to apply the PORT applet parameter to indicate to the applet | 
 |    the Internet facing port number (otherwise by default the internal | 
 |    machine's port, say 5900, is sent and that of course is rejected at | 
 |    the firewall/router.) For example: | 
 |   https://far-away.east:443/?GET=1&PORT=443 | 
 |  | 
 |    So in this example the user configures his router to redirect | 
 |    connections to port 443 on his Internet side to, say, port 5900 on the | 
 |    internal machine running x11vnc. See also the -httpsredir option that | 
 |    will try to automate this for you. | 
 |  | 
 |    To configure your router to do port redirection, see its instructions. | 
 |    Typically, from the inside you point a web browser to a special URL | 
 |    (e.g. http://192.168.1.1) and you get a web interface to configure it. | 
 |    Look for something like "Port Redirection" or "Port Forwarding", | 
 |    probably under "Advanced" or something like that. If you have a Linux | 
 |    or Unix system acting as your firewall/router, see its firewall | 
 |    configuration. | 
 |  | 
 |    You can also use x11vnc options -rfbport NNNNN and -httpport NNNNN to | 
 |    match the ports that your firewall will be redirecting to the machine | 
 |    where x11vnc is run. | 
 |  | 
 |  | 
 |    Tedious Dialogs: If you do serve the SSL enabled Java viewer via https | 
 |    be prepared for quite a number of "are you sure you trust this site?" | 
 |    dialogs: | 
 |      * First from the Web browser that cannot verify the self-signed | 
 |        certificate when it downloads index.vnc. | 
 |      * From the Web browser again noting that the common name on the | 
 |        certificate does not match the hostname of the remote machine. | 
 |      * Next from the Java VM that cannot verify the self-signed | 
 |        certificate when it downloads VncViewer.jar. | 
 |      * And also from the Java VM again noting that the common name on the | 
 |        certificate does not match the hostname of the remote machine. | 
 |      * Finally from the Java VncViewer applet itself saying it cannot | 
 |        verify the certificate! (or a popup asking you if you want to see | 
 |        the certificate.) | 
 |  | 
 |    Note that sometimes if you pause too long at one of the above dialogs | 
 |    then x11vnc may exceed a timeout and assume the current socket | 
 |    connection is VNC instead of the HTTPS it actually is (but since you | 
 |    have paused too long at the dialog the GET request comes too late.) | 
 |    Often hitting Reload and going through the dialogs more quickly will | 
 |    let you connect. The Java VM dialogs are the most important ones to | 
 |    NOT linger at. If you see in the x11vnc output a request for | 
 |    VncViewer.class instead of VncViewer.jar it is too late... you will | 
 |    need to completely restart the Web browser to get it to try for the | 
 |    jar again. You can use the -https option if you want a dedicated port | 
 |    for HTTPS connections instead of sharing the VNC port. | 
 |  | 
 |    To see example x11vnc output for a successful https://host:5900/ | 
 |    connection with the Java Applet see This Page. And here is a newer | 
 |    example including the Java Console output. | 
 |  | 
 |    All of the x11vnc Java Viewer applet parameters are described in the | 
 |    file classes/ssl/README | 
 |  | 
 |  | 
 |    Notes on the VNC Viewer ss_vncviewer wrapper script: | 
 |  | 
 |    If you want to use a native VNC Viewer with the SSL enabled x11vnc you | 
 |    will need to run an external SSL tunnel on the Viewer side. There do | 
 |    not seem to be any native SSL VNC Viewers outside of our x11vnc and | 
 |    SSVNC packages. The basic ideas of doing this were discussed for | 
 |    external tunnel utilities here. | 
 |  | 
 |    The ss_vncviewer script provided with x11vnc and SSVNC can set up the | 
 |    stunnel tunnel automatically on unix as long as the stunnel command is | 
 |    installed on the Viewer machine and available in PATH (and vncviewer | 
 |    too of course.) Note that on a Debian based system you will need to | 
 |    install the package stunnel4 not stunnel. You can set the environment | 
 |    variables STUNNEL and VNCVIEWERCMD to point to the correct programs if | 
 |    you want to override the defaults. | 
 |  | 
 |    Here are some examples: | 
 |   1)  ss_vncviewer far-away.east:0 | 
 |  | 
 |   2)  ss_vncviewer far-away.east:0 -encodings "copyrect tight zrle hextile" | 
 |  | 
 |   3)  ss_vncviewer -verify ./server.crt far-away.east:0 | 
 |  | 
 |   4)  ss_vncviewer -mycert ./client.pem far-away.east:0 | 
 |  | 
 |   5)  ss_vncviewer -proxy far-away.east:8080 myworkstation:0 | 
 |  | 
 |    The first one is the default mode and accepts the x11vnc certificate | 
 |    without question. The second one is as the first, but adds the | 
 |    -encodings options to the vncviewer command line. | 
 |  | 
 |    The third one requires that the x11vnc server authenticate itself to | 
 |    the client against the certificate in the file ./server.crt (e.g. one | 
 |    created by "x11vnc -ssl SAVE" and safely copied to the VNC viewer | 
 |    machine.) | 
 |  | 
 |    The fourth one is for VNC Viewer authentication, it uses ./client.pem | 
 |    to authenticate itself to x11vnc. One can supply both -verify and | 
 |    -mycert simultaneously. | 
 |  | 
 |    The fifth one shows that Web proxies can be used if that is the only | 
 |    way to get out of the firewall. If the "double proxy" situation arises | 
 |    separate the two by commas. See this page for more information on how | 
 |    Web proxies come into play. | 
 |  | 
 |    If one uses a Certificate Authority (CA) scheme described here, the | 
 |    wrapper script would use the CA cert instead of the server cert: | 
 |   3')  ss_vncviewer -verify ./cacert.crt far-away.east:0 | 
 |  | 
 |    Update Jul/2006: we now provide an Enhanced TightVNC Viewer (SSVNC) | 
 |    package that starts up STUNNEL automatically along with some other | 
 |    features. All binaries (stunnel, vncviewer, and some utilities) are | 
 |    provided in the package. It works on Unix, Mac OS X, and Windows. | 
 |  | 
 |  | 
 |    Q-55: How do I use the Java applet VNC Viewer with built-in SSL | 
 |    tunneling when going through a Web Proxy? | 
 |    The SSL enabled Java VNC Viewer and firewall Proxies: | 
 |  | 
 |    SSL and HTTPS aside, there is a general problem with Firewall Proxies | 
 |    and Java Applets that open sockets. The applet is downloaded | 
 |    successfully (through the browser) using HTTP and the proxy, but when | 
 |    the applet tries to reconnect to the originating host (the only one | 
 |    allowed by security) it does not use the proxy channel. So it cannot | 
 |    reconnect to the server the applet came from! | 
 |  | 
 |    We have found a convenient workaround: in the directory where | 
 |    VncViewer.jar resides there is a digitally signed version of the same | 
 |    applet called SignedVncViewer.jar. Since the applet is digitally | 
 |    signed, there will be an additional dialog from the Java VM plugin | 
 |    asking you if you want to trust the applet fully. | 
 |  | 
 |    You should say "Yes". If you do, the applet will be run in a mode | 
 |    where it can try to determine the firewall proxy host name and port | 
 |    (it will ask you for them if it cannot find them.) This way it can | 
 |    connect directly to the Proxy and then request the CONNECT method to | 
 |    be redirected to the originating host (the x11vnc VNC Server.) SSL is | 
 |    then layered over this socket. | 
 |  | 
 |    To do this you should use the proxy.vnc HTML file like via this URL in | 
 |    your browser: | 
 |   https://yourmachine.com:5900/proxy.vnc | 
 |  | 
 |    (instead of the unsigned one in https://yourmachine.com:5900/ that | 
 |    gives the default index.vnc) | 
 |  | 
 |    Proxies that limit CONNECT to ports 443 and 563: | 
 |  | 
 |    Things become trickier if the Web proxy restricts which CONNECT ports | 
 |    can be redirected to. For security, some (most?) proxies only allow | 
 |    port 443 (HTTPS) and 563 (SNEWS) by default. In this case, the only | 
 |    thing to do is run x11vnc on that low port, e.g. "-rfbport 443", (or | 
 |    use a port redirection on, say, a firewall or router port 443 to the | 
 |    internal machine.) | 
 |  | 
 |    If you do such a redirection to an internal machine and x11vnc is not | 
 |    listening on port 443, you will probably need to edit proxy.vnc. | 
 |    Suppose the SSL x11vnc server was listening on port 5901. You should | 
 |    change the line in proxy.vnc from: | 
 |   <param name=PORT value=$PORT> | 
 |  | 
 |    to: | 
 |   <param name=PORT value=443> | 
 |  | 
 |    Since otherwise $PORT will be expanded to 5901 by x11vnc and the | 
 |    viewer applet will fail to connect to that port on the firewall. | 
 |  | 
 |    Another way to achieve the same thing is to use the applet PORT | 
 |    parameter: | 
 |   https://yourmachine.com/proxy.vnc?PORT=443 | 
 |  | 
 |    this is cleaner because it avoids editing the file, but requires more | 
 |    parameters in the URL. See also the -httpsredir x11vnc option that | 
 |    will try to automate this for you. To use the GET trick discussed | 
 |    above, do: | 
 |   https://yourmachine.com/proxy.vnc?GET=1&PORT=443 | 
 |  | 
 |    All of the x11vnc Java Viewer applet parameters are described in the | 
 |    file classes/ssl/README | 
 |  | 
 |    Here is an example of Java Console and x11vnc output for the Web proxy | 
 |    case. | 
 |  | 
 |  | 
 |    Note that both the ss_vncviewer stunnel Unix wrapper script and | 
 |    Enhanced TightVNC Viewer (SSVNC) can use Web proxies as well even | 
 |    though they do not involve a Web browser. | 
 |  | 
 |  | 
 |    Q-56: Can Apache web server act as a gateway for users to connect via | 
 |    SSL from the Internet with a Web browser to x11vnc running on their | 
 |    workstations behind a firewall? | 
 |    Yes. You will need to configure apache to forward these connections. | 
 |    It is discussed here. This SSL VNC portal provides a clean alternative | 
 |    to the traditional method where the user uses SSH to log in through | 
 |    the gateway to create the encrypted port redirection to x11vnc running | 
 |    on her desktop. | 
 |  | 
 |    Also see the desktop.cgi CGI script method that achieves much of what | 
 |    this Apache VNC SSL portal method does (as long as desktop.cgi's 'port | 
 |    redirection' mode is enabled.) | 
 |  | 
 |  | 
 |    Q-57: Can I create and use my own SSL Certificate Authority (CA) with | 
 |    x11vnc? | 
 |    Yes, see this page for how to do this and the utility commands x11vnc | 
 |    provides to create and manage many types of certificates and private | 
 |    keys. | 
 |  | 
 |  | 
 |  | 
 |    [Display Managers and Services] | 
 |  | 
 |    Q-58: How can I run x11vnc as a "service" that is always available? | 
 |  | 
 |    There are a number of ways to do this. The primary thing you need to | 
 |    decide is whether you want x11vnc to connect to the X session on the | 
 |    machine 1) regardless of who (or if anyone) has the X session, or 2) | 
 |    only if a certain user has the X session. Because X sessions are | 
 |    protected by X permissions (MIT-MAGIC-COOKIE files XAUTHORITY and | 
 |    $HOME/.Xauthority) the automatically started x11vnc will of course | 
 |    need to have sufficient permissions to connect to the X display. | 
 |  | 
 |    Here are some ideas: | 
 |      * Use the description under "Continuously" in the FAQ on x11vnc and | 
 |        Display Managers | 
 |      * Use the description in the FAQ on x11vnc and inetd(8) | 
 |      * Use the description in the FAQ on Unix user logins and inetd(8) | 
 |      * Start x11vnc from your $HOME/.xsession (or $HOME/.xinitrc or | 
 |        autostart script or ...) | 
 |      * Although less reliable, see the x11vnc_loop rc.local hack below. | 
 |  | 
 |    The display manager scheme will not be specific to which user has the | 
 |    X session unless a test is specifically put into the display startup | 
 |    script (often named Xsetup.) The inetd(8) scheme may or may not be | 
 |    specific to which user has the X session (and it may not be able to do | 
 |    all users via the XAUTHORITY permission issues.) | 
 |  | 
 |    The .xsession/.xinitrc scheme is obviously is specific to a particular | 
 |    user and only when they are logged into X. If you do not know what a | 
 |    $HOME/.xsession script is or how to use one, perhaps your desktop has | 
 |    a "session startup commands" configuration option. The command to be | 
 |    run in the .xsession or .xinitrc file may look like this: | 
 | x11vnc -logfile $HOME/.x11vnc.log -rfbauth $HOME/.vnc/passwd -forever -bg | 
 |  | 
 |    plus any other options you desire. | 
 |  | 
 |    Depending on your desktop and/or OS/distribution the automatically run | 
 |    X startup scripts (traditionally .xsession/.xinitrc) may have to be in | 
 |    a different directory or have a different basename. One user | 
 |    recommends the description under 'Running Scripts Automatically' at | 
 |    this link. | 
 |  | 
 |    Firewalls: note all methods will require the host-level firewall to be | 
 |    configured to allow connections in on a port. E.g. 5900 (default VNC | 
 |    port) or 22 (default SSH port for tunnelling VNC.) Most systems these | 
 |    days have firewalls turned on by default, so you will actively have to | 
 |    do something to poke a hole in the firewall at the desired port | 
 |    number. See your system administration tool for Firewall settings | 
 |    (Yast, Firestarter, etc.) | 
 |  | 
 |  | 
 |    Q-59: How can I use x11vnc to connect to an X login screen like xdm, | 
 |    GNOME gdm, KDE kdm, or CDE dtlogin? (i.e. nobody is logged into an X | 
 |    session yet.) | 
 |  | 
 |    We describe two scenarios here. The first is called 'One time only' | 
 |    meaning you just need to do it quickly once and don't want to repeat; | 
 |    and the second is called 'Continuously' meaning you want the access to | 
 |    be available after every reboot and after every desktop logout. | 
 |      _________________________________________________________________ | 
 |  | 
 |    One time only:   If the X login screen is running and you just want to | 
 |    connect to it once (i.e. a one-shot): | 
 |  | 
 |    It is usually possible to do this by just adjusting the XAUTHORITY | 
 |    environment variable to point to the correct MIT-COOKIE auth file | 
 |    while running x11vnc as root, e.g. for the gnome display manager, GDM: | 
 |   x11vnc -auth /var/gdm/:0.Xauth -display :0 | 
 |  | 
 |    (the -auth option sets the XAUTHORITY variable for you.) | 
 |  | 
 |    There will be a similar thing to do for xdm using however a different | 
 |    auth directory path (perhaps something like | 
 |    /var/lib/xdm/authdir/authfiles/A:0-XQvaJk) for the xdm greeter or | 
 |    /var/lib/kdm/A:0-crWk72 (or /var/run/xauth/A:0-qQPftr, etc. etc) for | 
 |    the kdm greeter. Of course, the random characters in the file basename | 
 |    will vary and you will need to use the actual filename on your system. | 
 |    Read your system docs to find out where the display manager cookie | 
 |    files are kept. | 
 |  | 
 |    Trick: sometimes ps(1) can reveal the X server process -auth argument | 
 |    (e.g. "ps wwaux | grep auth") and hence the path to the auth file. | 
 |  | 
 |    x11vnc must be run as root for this because the /var/gdm/:0.Xauth, | 
 |    /var/lib/kdm/A:0-crWk72, etc. auth files are only readable by root. If | 
 |    you do not want to run x11vnc as root, you can copy (as root or sudo) | 
 |    the auth file to some location and make it readable by your userid. | 
 |    Then run x11vnc as your userid with -auth pointed to the copied file. | 
 |  | 
 |    Update Dec/2009: use "-auth guess" to have x11vnc try to guess the | 
 |    location of the auth file for you. | 
 |  | 
 |    You next connect to x11vnc with a VNC viewer, give your username and | 
 |    password to the X login prompt to start your session. | 
 |  | 
 |    Note:  GDM: gdm seems to have an annoying setting that causes x11vnc | 
 |    (and any other X clients) to be killed after the user logs in. Setting | 
 |    KillInitClients=false in the [daemon] section of /etc/X11/gdm/gdm.conf | 
 |    (or /etc/gdm/gdm.conf, etc.) avoids this. Otherwise, just restart | 
 |    x11vnc and then reconnect your viewer. Other display managers (kdm, | 
 |    etc) may also have a similar problem. One user reports having to alter | 
 |    "gdm.conf-custom" as well. | 
 |  | 
 |    Note:  Solaris: For dtlogin in addition to the above sort of trick | 
 |    (BTW, the auth file should be in /var/dt), you'll also need to add | 
 |    something like Dtlogin*grabServer:False to the Xconfig file | 
 |    (/etc/dt/config/Xconfig or /usr/dt/config/Xconfig on Solaris, see the | 
 |    example at the end of this FAQ.) Then restart dtlogin, e.g.: | 
 |    /etc/init.d/dtlogin stop; /etc/init.d/dtlogin start or reboot. | 
 |  | 
 |    Update Nov/2008: Regarding GDM KillInitClients: see the -reopen option | 
 |    for another possible workaround. | 
 |  | 
 |    Update Oct/2009: Regarding GDM KillInitClients: starting with x11vnc | 
 |    0.9.9 it will try to apply heuristics to detect if a window manager is | 
 |    not running (i.e. whether the Display Manager Greeter Login panel is | 
 |    still up.) If it thinks the display manager login is still up it will | 
 |    delay creating windows or using XFIXES. The former is what GDM uses to | 
 |    kill the initial clients, use of the latter can cause a different | 
 |    problem: an Xorg server crash. So with 0.9.9 and later it should all | 
 |    work without needing to set KillInitClients=false (which is a good | 
 |    because recent GDM, v2.24, has removed this option) or use -noxfixes. | 
 |    To disable the heuristics and delaying set X11VNC_AVOID_WINDOWS=never; | 
 |    to set the delay time explicitly use, e.g., X11VNC_AVOID_WINDOWS=120 | 
 |    (delays for 120 seconds after the VNC connection; you have that long | 
 |    to log in.) | 
 |      _________________________________________________________________ | 
 |  | 
 |    Continuously:   Have x11vnc reattach each time the X server is | 
 |    restarted (i.e. after each logout and reboot): | 
 |  | 
 |    To make x11vnc always attached to the X server including the login | 
 |    screen you will need to add a command to a display manager startup | 
 |    script. | 
 |  | 
 |    Please consider the security implications of this! The VNC display for | 
 |    the X session always accessible (but hopefully password protected.) | 
 |    Add -localhost if you only plan to access via a SSH tunnel. | 
 |  | 
 |    The name of the display manager startup script file depends on desktop | 
 |    used and seem to be: | 
 |      GDM (GNOME)  /etc/X11/gdm/Init/Default | 
 |                   /etc/gdm/Init/Default | 
 |      KDM (KDE)    /etc/kde*/kdm/Xsetup | 
 |      XDM          /etc/X11/xdm/Xsetup          (or sometimes xdm/Xsetup_0) | 
 |      CDE          /etc/dt/config/Xsetup | 
 |  | 
 |    although the exact location can be operating system, distribution, and | 
 |    time dependent. See the documentation for your display manager: | 
 |    gdm(1), kdm(1), xdm(1), dtlogin(1) for additional details. There may | 
 |    also be display number specific scripts: e.g. Xsetup_0 vs. Xsetup, you | 
 |    need to watch out for. | 
 |  | 
 |    Note:  You should read and understand all of the Note's and Update's | 
 |    in the 'One time only' section above. All of the GDM topics apply here | 
 |    as well: | 
 |  | 
 |    Note:  GDM: The above (in 'One time only') gdm setting of | 
 |    KillInitClients=false in /etc/X11/gdm/gdm.conf (or /etc/gdm/gdm.conf, | 
 |    etc.) for GDM is needed here as well. Other display managers (KDM, | 
 |    etc) may also have a similar problem. | 
 |  | 
 |    Also see the Update Oct/2009 above where x11vnc 0.9.9 and later | 
 |    automatically avoids being killed. | 
 |  | 
 |    Note:  DtLogin: The above (in 'One time only') | 
 |    Dtlogin*grabServer:False step for Solaris will be needed for dtlogin | 
 |    here as well. | 
 |  | 
 |    In any event, the line you will add to the display manager script | 
 |    (Xsetup, Default, or whatever) will look something like: | 
 |   /usr/local/bin/x11vnc -rfbauth /path/to/the/vnc/passwd -o /var/log/x11vnc.log | 
 |  -forever -bg | 
 |  | 
 |    where you should customize the exact command to your needs (e.g. | 
 |    -localhost for SSH tunnel-only access; -ssl SAVE for SSL access; etc.) | 
 |  | 
 |    Happy, happy, joy, joy:  Note that we do not need to specify -display | 
 |    or -auth because happily they are already set for us in the DISPLAY | 
 |    and XAUTHORITY environment variables for the Xsetup script!!! | 
 |  | 
 |    You may also want to force the VNC port with something like "-rfbport | 
 |    5900" (or -N) to avoid autoselecting one if 5900 is already taken. | 
 |      _________________________________________________________________ | 
 |  | 
 |    Fedora/gdm: Here is an example of what we did on a vanilla install of | 
 |    Fedora-C3 (seems to use gdm by default.) Add a line like this to | 
 |    /etc/X11/gdm/Init/:0 | 
 |   /usr/local/bin/x11vnc -rfbauth /etc/x11vnc.passwd -forever -bg -o /var/log/x1 | 
 | 1vnc.log | 
 |  | 
 |    And then add this line to /etc/X11/gdm/gdm.conf (or /etc/gdm/gdm.conf, | 
 |    etc.) in the [daemon] section: | 
 |   KillInitClients=false | 
 |  | 
 |    Then restart: /usr/sbin/gdm-restart (or reboot.) The | 
 |    KillInitClients=false setting is important: without it x11vnc will be | 
 |    killed immediately after the user logs in. Here are full details on | 
 |    how to configure gdm | 
 |      _________________________________________________________________ | 
 |  | 
 |    Solaris/dtlogin: Here is an example of what we did on a vanilla | 
 |    install of Solaris: | 
 |    Make the directory /etc/dt/config: | 
 |   mkdir -p /etc/dt/config | 
 |  | 
 |    Copy over the Xconfig file for customization: | 
 |   cp /usr/dt/config/Xconfig /etc/dt/config/Xconfig | 
 |  | 
 |    Edit /etc/dt/config/Xconfig and uncomment the line: | 
 |   Dtlogin*grabServer:        False | 
 |  | 
 |    Next, copy over Xsetup for customization: | 
 |   cp /usr/dt/config/Xsetup /etc/dt/config/Xsetup | 
 |  | 
 |    Edit /etc/dt/config/Xsetup and at the bottom put a line like: | 
 |   /usr/local/bin/x11vnc -forever -o /var/log/x11vnc.log -bg | 
 |  | 
 |    (tweaked to your local setup and preferences, a password via -rfbauth, | 
 |    etc. would be a very good idea.) | 
 |  | 
 |    Restart the X server and dtlogin: | 
 |   /etc/init.d/dtlogin stop | 
 |   /etc/init.d/dtlogin start | 
 |  | 
 |    (or reboot or maybe just restart the X session.) | 
 |      _________________________________________________________________ | 
 |  | 
 |    KDM: One user running the kdm display manager reports putting this | 
 |    line: | 
 |   x11vnc -forever -rfbauth /home/xyz/.vnc/passwd -bg -o /var/log/x11vnc.log | 
 |  | 
 |    in /etc/kde/kdm/Xsetup. After rebooting the system it all seemed to | 
 |    work fine. | 
 |      _________________________________________________________________ | 
 |  | 
 |  | 
 |    If you do not want to deal with any display manager startup scripts, | 
 |    here is a kludgey script that can be run manually or out of a boot | 
 |    file like rc.local: x11vnc_loop It will need some local customization | 
 |    before running. Because the XAUTHORITY auth file must be guessed by | 
 |    this script, use of the display manager script method described above | 
 |    is greatly preferred. There is also the -loop option that does | 
 |    something similar. | 
 |  | 
 |    If the machine is a traditional Xterminal you may want to read this | 
 |    FAQ. | 
 |  | 
 |    Firewalls: note all methods will require the host-level firewall to be | 
 |    configured to allow connections in on a port. E.g. 5900 (default VNC | 
 |    port) or 22 (default SSH port for tunnelling VNC.) Most systems these | 
 |    days have firewalls turned on by default, so you will actively have to | 
 |    do something to poke a hole in the firewall at the desired port | 
 |    number. See your system administration tool for Firewall settings | 
 |    (Yast, Firestarter, etc.) | 
 |  | 
 |  | 
 |    Q-60: Can I run x11vnc out of inetd(8)? How about xinetd(8)? | 
 |  | 
 |    Yes, perhaps a line something like this in /etc/inetd.conf will do it | 
 |    for you: | 
 |  | 
 |   5900 stream tcp nowait root /usr/sbin/tcpd /usr/local/bin/x11vnc_sh | 
 |  | 
 |    where the shell script /usr/local/bin/x11vnc_sh uses the -inetd option | 
 |    and looks something like (you'll need to customize to your settings.) | 
 | #!/bin/sh | 
 | /usr/local/bin/x11vnc -inetd -display :0 -auth /home/fred/.Xauthority \ | 
 |         -rfbauth /home/fred/.vnc/passwd -o /var/log/x11vnc_sh.log | 
 |  | 
 |    Important:  Note that you must redirect the standard error output to a | 
 |    log file (e.g. -o logfile) or "2>/dev/null" for proper operation via | 
 |    inetd (otherwise the standard error also goes to the VNC vncviewer, | 
 |    and that confuses it greatly, causing it to abort.) If you do not use | 
 |    a wrapper script as above but rather call x11vnc directly in | 
 |    /etc/inetd.conf and do not redirect stderr to a file, then you must | 
 |    specify the -q (aka -quiet) option: "/usr/local/bin/x11vnc -q -inetd | 
 |    ...". When you supply both -q and -inet and no "-o logfile" then | 
 |    stderr will automatically be closed (to prevent, e.g. library stderr | 
 |    messages leaking out to the viewer.) The recommended practice is to | 
 |    use "-o logfile" to collect the output in a file or wrapper script | 
 |    with "2>logfile" redirection because the errors and warnings printed | 
 |    out are very useful in troubleshooting problems. | 
 |  | 
 |    Note also the need to set XAUTHORITY via -auth to point to the | 
 |    MIT-COOKIE auth file to get permission to connect to the X display | 
 |    (setting and exporting the XAUTHORITY variable accomplishes the same | 
 |    thing.) See the x11vnc_loop file in the previous question for more | 
 |    ideas on what that auth file may be, etc. The scheme described in the | 
 |    FAQ on Unix user logins and inetd(8) works around the XAUTHORITY issue | 
 |    nicely. | 
 |  | 
 |    Note:  On Solaris you cannot have the bare number 5900 in | 
 |    /etc/inetd.conf, you'll need to replace it with a word like x11vnc an | 
 |    then put something like "x11vnc 5900/tcp" in /etc/services. | 
 |  | 
 |    Since the process runs as root, it might be a bad idea to have the | 
 |    logfile in a world-writable area like /tmp if there are untrustworthy | 
 |    users on the machine. Perhaps /var/log is a better place. | 
 |  | 
 |    Be sure to look at your /etc/hosts.allow and /etc/hosts.deny settings | 
 |    to limit the machines that can connect to this service (your desktop!) | 
 |    For the above example with /etc/hosts.allow: | 
 |   x11vnc_sh : 123.45.67.89 | 
 |  | 
 |    A really safe way to do things is to limit the above inetd to | 
 |    localhost only (via /etc/hosts.allow) and use ssh to tunnel the | 
 |    incoming connection. Using inetd for this prevents there being a tiny | 
 |    window of opportunity between x11vnc starting up and your vncviewer | 
 |    connecting to it. Always use a VNC password to further protect against | 
 |    unwanted access. | 
 |  | 
 |    For xinetd(8), one user reports he created the file | 
 |    /etc/xinetd.d/x11vncservice containing the following: | 
 | # default: off | 
 | # description: | 
 | service x11vncservice | 
 | { | 
 |         flags           = REUSE NAMEINARGS | 
 |         port            = 5900 | 
 |         type            = UNLISTED | 
 |         socket_type     = stream | 
 |         protocol        = tcp | 
 |         wait            = no | 
 |         user            = root | 
 |         server          = /usr/sbin/tcpd | 
 |         server_args     = /usr/local/bin/x11vnc_sh | 
 |         disable         = no | 
 | } | 
 |  | 
 |    With the contents of /usr/local/bin/x11vnc_sh similar to the example | 
 |    given above. One user reports this works with avoiding the wrapper | 
 |    script: | 
 | service x11vncservice | 
 | { | 
 |         port            = 5900 | 
 |         type            = UNLISTED | 
 |         socket_type     = stream | 
 |         protocol        = tcp | 
 |         wait            = no | 
 |         user            = root | 
 |         server          = /usr/local/bin/x11vnc | 
 |         server_args     = -inetd -q -display :0 -auth /var/gdm/:0.Xauth | 
 |         disable         = no | 
 | } | 
 |  | 
 |    (or one can replace the -q with say "-o /var/log/x11vnc.log" to | 
 |    capture a log) | 
 |  | 
 |    The above works nicely for GDM because the -auth file is a fixed name. | 
 |    For KDM or XDM the filename varies. Here is one idea for a x11vnc_sh | 
 |    wrapper to try to guess the name: | 
 | #!/bin/sh | 
 | COLUMNS=256 | 
 | export COLUMNS | 
 | authfile=`ps wwaux | grep '/X.*-auth' | grep -v grep | sed -e 's/^.*-auth *//' | 
 | -e 's/ .*$//' | head -n 1` | 
 |  | 
 | if [ -r "$authfile" ]; then | 
 |         exec /usr/local/bin/x11vnc -inetd -o /var/log/x11vnc.log -display :0 -a | 
 | uth "$authfile" | 
 | fi | 
 | exit 1 | 
 |  | 
 |    Starting with x11vnc 0.9.3 this can be automated by: | 
 | #!/bin/sh | 
 | exec /usr/local/bin/x11vnc -inetd -o /var/log/x11vnc.log -find -env FD_XDM=1 | 
 |  | 
 |  | 
 |    Q-61: Can I have x11vnc advertise its VNC service and port via mDNS / | 
 |    Zeroconf (e.g. Avahi) so VNC viewers on the local network can detect | 
 |    it automatically? | 
 |  | 
 |    Yes, as of Feb/2007 x11vnc supports mDNS / Zeroconf advertising of its | 
 |    service via the Avahi client library. Use the option -avahi (same as | 
 |    -mdns or -zeroconf) to enable it. Depending on your setup you may need | 
 |    to install Avahi (including the development/build packages), enable | 
 |    the server: avahi-daemon and avahi-dnsconfd, and possibly open up UDP | 
 |    port 5353 on your firewall. | 
 |  | 
 |    If the Avahi client library or build environment is not available at | 
 |    build-time, then at run-time x11vnc will try to look for external | 
 |    helper programs, avahi-browse(1) or dns-sd(1), to do the work. | 
 |  | 
 |    The service was tested with Chicken of the VNC ("Use Bonjour" | 
 |    selected) on a Mac on the same network and the service was noted and | 
 |    listed in the servers list. Clicking on it and then "Connect" | 
 |    connected automatically w/o having to enter any hostnames or port | 
 |    numbers. | 
 |  | 
 |    It appears SuSE 10.1 comes with avahi (or you can add packages, e.g. | 
 |    avahi-0.6.5-27) but not the development package (you can use the | 
 |    OpenSuSE avahi-devel rpm.) Unfortunately, you may need to disable | 
 |    another Zeroconf daemon "/etc/init.d/mdnsd stop", before doing | 
 |    "/etc/init.d/avahi-daemon start" and "/etc/init.d/avahi-dnsconfd | 
 |    start". We also had to comment out the browse-domains line in | 
 |    /etc/avahi/avahi-daemon.conf. Hopefully there is "LessConf" to do on | 
 |    other distros/OS's... | 
 |  | 
 |  | 
 |    Q-62: Can I have x11vnc allow a user to log in with her UNIX username | 
 |    and password and then have it find her X session display on that | 
 |    machine and then attach to it? How about starting an X session if one | 
 |    cannot be found? | 
 |  | 
 |    The easiest way to do this is via inetd(8) using the -unixpw and | 
 |    -display WAIT options. The reason inetd(8) makes this easier is that | 
 |    it starts a new x11vnc process for each new user connection. Otherwise | 
 |    a wrapper would have to listen for connections and spawn new x11vnc's | 
 |    (see this example and also the -loopbg option.) inetd(8) is not | 
 |    required for this, but it makes some aspects more general. | 
 |  | 
 |    Also with inetd(8) users always connect to a fixed VNC display, say | 
 |    hostname:0, and do not need to memorize a special VNC display number | 
 |    just for their personal use, etc. | 
 |  | 
 |    Update: Use the -find, -create, -svc, and -xdmsvc options that are | 
 |    shorthand for common FINDCREATEDISPLAY usage modes (e.g. terminal | 
 |    services) described below. (i.e. simply use "-svc" instead of the | 
 |    cumbersome "-display WAIT:cmd=FINDCREATEDISPLAY-Xvfb -unixpw -users | 
 |    unixpw= -ssl SAVE") | 
 |  | 
 |    The -display WAIT option makes x11vnc wait until a VNC viewer is | 
 |    connected before attaching to the X display. | 
 |  | 
 |    Additionally it can be used to run an external command that returns | 
 |    the DISPLAY and XAUTHORITY data. We provide some useful builtin ones | 
 |    (FINDDISPLAY and FINDCREATEDISPLAY below), but in principle one could | 
 |    supply his own script: "-display WAIT:cmd=/path/to/find_display" where | 
 |    the script find_display might look something like this. | 
 |  | 
 |    A default script somewhat like the above is used under "-display | 
 |    WAIT:cmd=FINDDISPLAY" (same as -find) The format for any such command | 
 |    is that it returns DISPLAY=:disp as the first line and any remaining | 
 |    lines are either XAUTHORITY=file or raw xauth data (the above example | 
 |    does the latter.) If applicable (-unixpw mode), the program is run as | 
 |    the Unix user name who logged in. | 
 |  | 
 |    On Linux if the virtual terminal is known the program appends ",VT=n" | 
 |    to the DISPLAY line; a chvt n will be attempted automatically. Or if | 
 |    only the X server process ID is known it appends ",XPID=n" (a chvt | 
 |    will be attempted by x11vnc.) | 
 |  | 
 |    Tip: Note that the -find option is an alias for "-display | 
 |    WAIT:cmd=FINDDISPLAY". Use it! | 
 |  | 
 |    The -unixpw option allows UNIX password logins. It conveniently knows | 
 |    the Unix username whose X display should be found. Here are a couple | 
 |    /etc/inetd.conf examples of this usage: | 
 | 5900  stream  tcp  nowait  nobody  /usr/sbin/tcpd /usr/local/bin/x11vnc -inetd | 
 | -unixpw \ | 
 |       -find -o /var/log/x11vnc.log -ssl SAVE -ssldir /usr/local/certs | 
 | 5900  stream  tcp  nowait  root    /usr/sbin/tcpd /usr/local/bin/x11vnc -inetd | 
 | -unixpw \ | 
 |       -find -o /var/log/x11vnc.log -ssl SAVE -users unixpw= | 
 |  | 
 |    Note we have used the -find alias and the very long lines have been | 
 |    split. An alternative is to use a wrapper script, e.g. | 
 |    /usr/local/bin/x11vnc.sh that has all of the options. (see also the | 
 |    -svc alias.) | 
 |  | 
 |    In the first inetd line x11vnc is run as user "nobody" and stays user | 
 |    nobody during the whole session. The permissions of the log files and | 
 |    certs directory will need to be set up to allow "nobody" to use them. | 
 |  | 
 |    In the second one x11vnc is run as root and switches to the user that | 
 |    logs in due to the "-users unixpw=" option. | 
 |  | 
 |    Note that SSL is required for this mode because otherwise the Unix | 
 |    password would be passed in clear text over the network. In general | 
 |    -unixpw is not required for this sort of scheme, but it is convenient | 
 |    because it determines exactly who the Unix user is whose display | 
 |    should be sought. Otherwise the find_display script would have to use | 
 |    some method to work out DISPLAY, XAUTHORITY, etc (perhaps you use | 
 |    multiple inetd ports and hardwire usernames for different ports.) | 
 |  | 
 |    If you really want to disable the SSL or SSH -localhost constraints | 
 |    (this is not recommended unless you really know what you are doing: | 
 |    Unix passwords sent in clear text is a very bad idea...) read the | 
 |    -unixpw documentation. | 
 |  | 
 |    A inetd(8) scheme for a fixed user that doesn't use SSL or unix | 
 |    passwds could be: | 
 |   /usr/local/bin/x11vnc -inetd -users =fred -find -rfbauth /home/fred/.vnc/pass | 
 | wd -o /var/log/x11vnc.log | 
 |  | 
 |    The "-users =fred" option will cause x11vnc to switch to user fred and | 
 |    then find his X display. The VNC password (-rfbauth) as opposed to | 
 |    Unix password (-unixpw) is used to authenticate the VNC client. | 
 |  | 
 |    Similar looking commands to the above examples can be run directly and | 
 |    do not use inetd (just remove the -inetd option and run from the | 
 |    cmdline, etc.) | 
 |  | 
 |  | 
 |    X Session Creation: An added (Nov/2006) extension to FINDDISPLAY is | 
 |    FINDCREATEDISPLAY where if it does not find an X display via the | 
 |    FINDDISPLAY method it will create an X server session for the user | 
 |    (i.e. desktop/terminal server.) This is the only time x11vnc actually | 
 |    tries to start up an X server (normally it just attaches to an | 
 |    existing one.) | 
 |  | 
 |    For virtual sessions you will need to install the Xvfb program (e.g. | 
 |    apt-get install xvfb) or our Xdummy program (see below.) | 
 |  | 
 |    By default it will only try to start up virtual (non-hardware) X | 
 |    servers: first Xvfb and if that is not available then Xdummy (included | 
 |    in the x11vnc source code.) Note that Xdummy only works on Linux | 
 |    whereas Xvfb works just about everywhere (and in some situations | 
 |    Xdummy must be run as root.) An advantage of Xdummy over Xvfb is that | 
 |    Xdummy supports RANDR dynamic screen resizing, which can be handy if | 
 |    the user accesses the desktop from different sized screens (e.g. | 
 |    workstation and laptop.) | 
 |  | 
 |    So an inetd(8) example might look like: | 
 | 5900 stream tcp nowait root /usr/sbin/tcpd /usr/local/bin/x11vnc -inetd \ | 
 |       -o /var/log/x11vnc.log -http -prog /usr/local/bin/x11vnc \ | 
 |       -ssl SAVE -unixpw -users unixpw= -display WAIT:cmd=FINDCREATEDISPLAY | 
 |  | 
 |    Where the very long lines have been split. See below where that long | 
 |    and cumbersome last line is replaced by the -svc alias. | 
 |  | 
 |    The above mode will allow direct SSL (e.g. ss_vncviewer or SSVNC) | 
 |    access and also Java Web browers access via: https://hostname:5900/. | 
 |  | 
 |    Tip: Note that the -create option is an alias for "-display | 
 |    WAIT:cmd=FINDCREATEDISPLAY-Xvfb". | 
 |  | 
 |    Tip: Note that -svc is a short hand for the long "-ssl SAVE -unixpw | 
 |    -users unixpw= -display WAIT:cmd=FINDCREATEDISPLAY" part. Unlike | 
 |    -create, this alias also sets up SSL encryption and Unix password | 
 |    login. | 
 |  | 
 |    The above inetd example then simplifies to: | 
 | 5900 stream tcp nowait root /usr/sbin/tcpd /usr/local/bin/x11vnc -inetd \ | 
 |       -o /var/log/x11vnc.log -http -prog /usr/local/bin/x11vnc \ | 
 |       -svc | 
 |  | 
 |    Tip: In addition to the usual unixpw parameters, inside the VNC viewer | 
 |    the user can specify after his username (following a ":" see -display | 
 |    WAIT for details) for FINDCREATEDISPLAY they can add "geom=WxH" or | 
 |    "geom=WxHxD" to specify the width, height, and optionally the color | 
 |    depth. E.g. "fred:geom=800x600" at the login: prompt. Also if the env. | 
 |    var X11VNC_CREATE_GEOM is set to the desired WxH or WxHxD that will be | 
 |    used by x11vnc. | 
 |  | 
 |    You can set the env. var X11VNC_SKIP_DISPLAY to a comma separated list | 
 |    of displays to ignore in the FINDDISPLAY process (to force creation of | 
 |    new displays in some cases.) The user logging in via the vncviewer can | 
 |    also set this via username:nodisplay=...) | 
 |  | 
 |    If you do not plan on using the Java Web browser applet you can remove | 
 |    the -http (and -prog) option since this will speed up logging-in by a | 
 |    few seconds (x11vnc will not have to wait to see if a connection is | 
 |    HTTPS or VNC.) | 
 |  | 
 |    For reference, xinetd format in the file, say, /etc/xinetd.d/x11vnc: | 
 | service x11vnc | 
 | { | 
 |         type            = UNLISTED | 
 |         port            = 5900 | 
 |         socket_type     = stream | 
 |         protocol        = tcp | 
 |         wait            = no | 
 |         user            = root | 
 |         server          = /usr/local/bin/x11vnc | 
 |         server_args     = -inetd -o /var/log/x11vnc.log -http -prog /usr/local/ | 
 | bin/x11vnc -svc | 
 |         disable         = no | 
 | } | 
 |  | 
 |    To print out the script in this case use "-display | 
 |    WAIT:cmd=FINDCREATEDISPLAY-print". To change the preference of | 
 |    Xservers and which to try list them, e.g.: "-display | 
 |    WAIT:cmd=FINDCREATEDISPLAY-X,Xvfb,Xdummy" or use "-create_xsrv | 
 |    X,Xvfb,Xdummy". The "X" one means to try to start up a real, hardware | 
 |    X server, e.g. startx(1) (if there is already a real X server running | 
 |    this may only work on Linux and the chvt program may need to be run to | 
 |    switch to the correct Linux virtual terminal.) x11vnc will try to run | 
 |    chvt automatically if it can determine which VT should be switched to. | 
 |  | 
 |    XDM/GDM/KDM Login Greeter Panel: If you want to present the user with | 
 |    a xdm/gdm/kdm display manager "greeter" login you can use Xvfb.xdmcp | 
 |    instead of Xvfb, etc in the above list. However, you need to configure | 
 |    xdm/gdm/kdm to accept localhost XDMCP messages, this can be done by | 
 |    (from -help output): | 
 |       If you want the FINDCREATEDISPLAY session to contact an XDMCP login | 
 |       manager (xdm/gdm/kdm) on the same machine, then use "Xvfb.xdmcp" | 
 |       instead of "Xvfb", etc.  The user will have to supply his username | 
 |       and password one more time (but he gets to select his desktop | 
 |       type so that can be useful.)  For this to work, you will need to | 
 |       enable localhost XDMCP (udp port 177) for the display manager. | 
 |       This seems to be: | 
 |  | 
 |        for gdm in gdm.conf:   Enable=true in section [xdmcp] | 
 |        for kdm in kdmrc:      Enable=true in section [Xdmcp] | 
 |        for xdm in xdm-config: DisplayManager.requestPort: 177 | 
 |  | 
 |    Unless you are also providing XDMCP service to xterminals or other | 
 |    machines, make sure that the host access list only allows local | 
 |    connections (the name of this file is often Xaccess and it is usually | 
 |    setup by default to do just that.) Nowadays, host level firewalling | 
 |    will also typically block UDP (port 177 for XDMCP) by default | 
 |    effectively limiting the UDP connections to localhost. | 
 |  | 
 |    Tip: Note that -xdmsvc is a short hand alias for the long "-ssl SAVE | 
 |    -unixpw -users unixpw= -display | 
 |    WAIT:cmd=FINDCREATEDISPLAY-Xvfb.xdmcp". So we simply use: | 
 | service x11vnc | 
 | { | 
 |         type            = UNLISTED | 
 |         port            = 5900 | 
 |         socket_type     = stream | 
 |         protocol        = tcp | 
 |         wait            = no | 
 |         user            = root | 
 |         server          = /usr/local/bin/x11vnc | 
 |         server_args     = -inetd -o /var/log/x11vnc.log -xdmsvc | 
 |         disable         = no | 
 | } | 
 |  | 
 |    (Note: use "-svc" instead of "-xdmsvc" for no XDMCP login greeter.) | 
 |  | 
 |  | 
 |    Local access (VNC Server and VNC Viewer on the same machine): To | 
 |    access your virtual X display session locally (i.e. while sitting at | 
 |    the same machine it is running on) one can perhaps have something like | 
 |    this in their $HOME/.xinitrc | 
 | #!/bin/sh | 
 | x11vnc -create -rfbport 5905 -env WAITBG=1 | 
 | vncviewer -geometry +0+0 -encodings raw -passwd $HOME/.vnc/passwd localhost:5 | 
 |  | 
 |    You may not need the -passwd. Recent RealVNC viewers might be this: | 
 | #!/bin/sh | 
 | x11vnc -create -rfbport 5905 -env WAITBG=1 | 
 | vncviewer -FullScreen -PreferredEncoding raw -passwd $HOME/.vnc/passwd localhos | 
 | t:5 | 
 |  | 
 |    This way a bare X server is run with no window manager or desktop; it | 
 |    simply runs only the VNC Viewer on the real X server. The Viewer then | 
 |    draws the virtual X session on to the real one. On your system it | 
 |    might not be $HOME/.xinitrc, but rather .xsession, .Xclients, or | 
 |    something else. You will need to figure out what it is for your system | 
 |    and configuration. | 
 |  | 
 |    There may be a problem if the resolution (WxH) of the virtual X | 
 |    display does not match that of the physical X display. | 
 |  | 
 |    If you do not want to or cannot figure out the X startup script name | 
 |    (.xinitrc, etc) you could save the above commands to a shell script, | 
 |    say "vnclocal", and the log in via the normal KDM or GDM greeter | 
 |    program using the "Failsafe" option. Then in the lone xterm that comes | 
 |    up type "vnclocal" to connect to your virtual X display via x11vnc and | 
 |    vncviewer. | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |    Summary: The "-display WAIT:cmd=FINDCREATEDISPLAY" scheme can be used | 
 |    to provide a "desktop service" (i.e. terminal service) on the server | 
 |    machine: you always get some desktop there, either a real hardware X | 
 |    server or a virtual one (depending on how you set things up.) | 
 |  | 
 |    So it provides simple "terminal services" based on Unix username and | 
 |    password. The created X server sessions (virtual or real hardware) | 
 |    will remain running after you disconnect the VNC viewer and will be | 
 |    found again on reconnecting via VNC and logging in. To terminate them | 
 |    use the normal way to Exit/LogOut from inside your X session. The user | 
 |    does not have to memorize which VNC display number is his. They all go | 
 |    the same one (e.g. hostname:0) and it switches based on username. | 
 |  | 
 |  | 
 |    Q-63: Can I have x11vnc restart itself after it terminates? | 
 |  | 
 |    One could do this in a shell script, but now there is an option -loop | 
 |    that makes it easier. Of course when x11vnc restarts it needs to have | 
 |    permissions to connect to the (potentially new) X display. This mode | 
 |    could be useful if the X server restarts often. Use e.g. "-loop5000" | 
 |    to sleep 5000 ms between restarts. Also "-loop2000,5" to sleep 2000 ms | 
 |    and only restart 5 times. | 
 |  | 
 |    One can also use the -loopbg to emulate inetd(8) to some degree, where | 
 |    each connected process runs in the background. It could be combined, | 
 |    say, with the -svc option to provide simple terminal services without | 
 |    using inetd(8). | 
 |  | 
 |  | 
 |    Q-64: How do I make x11vnc work with the Java VNC viewer applet in a | 
 |    web browser? | 
 |  | 
 |    To have x11vnc serve up a Java VNC viewer applet to any web browsers | 
 |    that connect to it, run x11vnc with this option: | 
 |   -httpdir /path/to/the/java/classes/dir | 
 |  | 
 |    (this directory will contain the files index.vnc and, for example, | 
 |    VncViewer.jar) Note that libvncserver contains the TightVNC Java | 
 |    classes jar file for your convenience. (it is the file | 
 |    classes/VncViewer.jar in the source tree.) | 
 |  | 
 |    You will see output something like this: | 
 |   14/05/2004 11:13:56 Autoprobing selected port 5900 | 
 |   14/05/2004 11:13:56 Listening for HTTP connections on TCP port 5800 | 
 |   14/05/2004 11:13:56   URL http://walnut:5800 | 
 |   14/05/2004 11:13:56 screen setup finished. | 
 |   14/05/2004 11:13:56 The VNC desktop is walnut:0 | 
 |   PORT=5900 | 
 |  | 
 |    then you can connect to that URL with any Java enabled browser. Feel | 
 |    free to customize the default index.vnc file in the classes directory. | 
 |  | 
 |    As of May/2005 the -http option will try to guess where the Java | 
 |    classes jar file is by looking in expected locations and ones relative | 
 |    to the x11vnc binary. | 
 |  | 
 |    Also note that if you wanted to, you could also start the Java viewer | 
 |    entirely from the viewer-side by having the jar file there and using | 
 |    either the java or appletviewer commands to run the program. | 
 |   java -cp ./VncViewer.jar VncViewer HOST far-away.east PORT 5900 | 
 |  | 
 |    Proxies: See the discussion here if the web browser must use a web | 
 |    proxy to connect to the internet. It is tricky to get Java applets to | 
 |    work in this case: a signed applet must be used so it can connect to | 
 |    the proxy and ask for the redirection to the VNC server. One way to do | 
 |    this is to use the signed SSL one referred to in classes/ssl/proxy.vnc | 
 |    and set disableSSL=yes (note that this has no encryption; please use | 
 |    SSL or SSH as discuss elsewhere on this page) in the URL or the file. | 
 |  | 
 |  | 
 |    Q-65: Are reverse connections (i.e. the VNC server connecting to the | 
 |    VNC viewer) using "vncviewer -listen" and vncconnect(1) supported? | 
 |  | 
 |    As of Mar/2004 x11vnc supports reverse connections. On Unix one starts | 
 |    the VNC viewer in listen mode: "vncviewer -listen" (see your | 
 |    documentation for Windows, etc), and then starts up x11vnc with the | 
 |    -connect option. To connect immediately at x11vnc startup time use the | 
 |    "-connect host:port" option (use commas for a list of hosts to connect | 
 |    to.) The ":port" is optional (default is VNC listening port is 5500.) | 
 |  | 
 |    If a file is specified instead: -connect /path/to/some/file then that | 
 |    file is checked periodically (about once a second) for new hosts to | 
 |    connect to. | 
 |  | 
 |    The -remote control option (aka -R) can also be used to do this during | 
 |    an active x11vnc session, e.g.: | 
 | x11vnc -display :0 -R connect:hostname.domain | 
 |  | 
 |    Use the "-connect_or_exit" option to have x11vnc exit if the reverse | 
 |    connection fails. Also, note the "-rfbport 0" option disables TCP | 
 |    listening for connections (potentially useful for reverse connection | 
 |    mode, assuming you do not want any "forward" connections.) | 
 |  | 
 |    Note that as of Mar/2006 x11vnc requires password authentication for | 
 |    reverse connections as well as for forward ones (assuming password | 
 |    auth has been enabled, e.g. via -rfbauth, -passwdfile, etc.) Many VNC | 
 |    servers do not require any password for reverse connections. To regain | 
 |    the old behavior supply this option "-env | 
 |    X11VNC_REVERSE_CONNECTION_NO_AUTH=1" to x11vnc. | 
 |  | 
 |    Vncconnect command: To use the vncconnect(1) program (from the core | 
 |    VNC package at www.realvnc.com) specify the -vncconnect option to | 
 |    x11vnc (Note: as of Dec/2004 -vncconnect is now the default.) | 
 |    vncconnect(1) must be pointed to the same X11 DISPLAY as x11vnc (since | 
 |    it uses X properties to communicate with x11vnc.) If you do not have | 
 |    or do not want to get the vncconnect(1) program, the following script | 
 |    (named "Vncconnect") may work if your xprop(1) supports the -set | 
 |    option: | 
 | #!/bin/sh | 
 | # usage: Vncconnect <host> | 
 | #        Vncconnect <host:port> | 
 | # note: not all xprop(1) support -set. | 
 | # | 
 | xprop -root -f VNC_CONNECT 8s -set VNC_CONNECT "$1" | 
 |  | 
 |  | 
 |    Q-66: Can reverse connections be made to go through a Web or SOCKS | 
 |    proxy or SSH? | 
 |  | 
 |    Yes, as of Oct/2007 x11vnc supports reverse connections through | 
 |    proxies: use the "-proxy host:port" option. The default is to assume | 
 |    the proxy is a Web proxy. Note that most Web proxies only allow proxy | 
 |    destination connections to ports 443 (HTTPS) and 563 (SNEWS) and so | 
 |    this might not be too useful unless the proxy has been modified | 
 |    (AllowCONNECT apache setting) or the VNC viewer listens on one of | 
 |    those ports (or the router does a port redir.) A web proxy may also be | 
 |    specified via "-proxy http://host:port" | 
 |  | 
 |    For SOCKS4 and SOCKS4a proxies use this format "-proxy | 
 |    socks://host:port". If the reverse connection hostname is a numerical | 
 |    IP or "localhost" then SOCKS4 (no host lookup) is used, otherwise | 
 |    SOCKS4a will be used. For SOCKS5 (proxy will do lookup and many other | 
 |    things) use "-proxy socks5://host:port". Note that the SSH builtin | 
 |    SOCKS proxy "ssh -D port" only does SOCKS4 or SOCKS5, so use socks5:// | 
 |    for a ssh -D proxy. | 
 |  | 
 |    The proxying works for both SSL encrypted and normal reverse | 
 |    connections. | 
 |  | 
 |    An experimental mode is "-proxy http://host:port/..." where the URL | 
 |    (e.g. a CGI script) is retrieved via the GET method. See -proxy for | 
 |    more info. | 
 |  | 
 |    Another experimental mode is "-proxy ssh://user@host" in which case a | 
 |    SSH tunnel is used for the proxying. See -proxy for more info. | 
 |  | 
 |    Up to 3 proxies may be chained together by listing them by commas | 
 |    e.g.: "-proxy http://host1:port1,socks5://host2:port2" in case one | 
 |    needs to ricochet off of several machines to ultimately reach the | 
 |    listening viewer. | 
 |  | 
 |  | 
 |    Q-67: Can x11vnc provide a multi-user desktop web login service as an | 
 |    Apache CGI or PHP script? | 
 |    Yes. See the example script desktop.cgi for ideas. It is in the source | 
 |    tree in the directory x11vnc/misc. It serves x11vnc's SSL enabled Java | 
 |    Applet to the web browser with the correct connection information for | 
 |    the user's virtual desktop (an Xvfb session via -create; be sure to | 
 |    add the Xvfb package.) HTTPS/SSL enabled Apache should be used to | 
 |    serve the script to avoid unix and vnc passwords from being sent in | 
 |    cleartext and sniffed. | 
 |  | 
 |    By default it uses a separate VNC port for each user desktop (either | 
 |    by autoprobing in a range of ports or using a port based on the userid | 
 |    number.) The web server's firewall must allow incoming connections to | 
 |    these ports. | 
 |  | 
 |    It is somewhat difficult to do all of this with x11vnc listening on a | 
 |    single port, however there is also a 'fixed port' scheme described in | 
 |    the script based on -loopbg that works fairly well (but more | 
 |    experience is needed to see what problems contention for the same port | 
 |    causes; however at worst one user may need to re-login.) | 
 |  | 
 |    There is also an optional 'port redirection' mode for desktop.cgi that | 
 |    allows redirection to other machines inside the firewall already | 
 |    running SSL enabled VNC servers. This provides much of the | 
 |    functionality as the SSL Portal and is easier to set up. | 
 |  | 
 |  | 
 |    Q-68: Can I use x11vnc as a replacement for Xvnc? (i.e. not for a real | 
 |    display, but for a virtual one I keep around.) | 
 |  | 
 |    You can, but you would not be doing this for performance reasons (for | 
 |    virtual X sessions via VNC, Xvnc should give the fastest response.) | 
 |    You may want to do this because Xvnc is buggy and crashes, does not | 
 |    support an X server extension you desire, or you want to take | 
 |    advantage of one of x11vnc's unending number of options and features. | 
 |  | 
 |    One way to achieve this is to have a Xvfb(1) virtual framebuffer X | 
 |    server running in the background and have x11vnc attached to it. | 
 |    Another method, faster and more accurate, is to use the "dummy" Device | 
 |    Driver in XFree86/Xorg (see below.) | 
 |  | 
 |    For these virtual sessions you will need to install the Xvfb program | 
 |    (e.g. apt-get install xvfb) or our Xdummy program (see below.) | 
 |  | 
 |    In either case, one can view this desktop both remotely and also | 
 |    locally using vncviewer. Make sure vncviewer's "-encodings raw" is in | 
 |    effect for local viewing (compression seems to slow things down | 
 |    locally.) For local viewing you set up a "bare" window manager that | 
 |    just starts up vncviewer and nothing else (See how below.) | 
 |  | 
 |    Here is one way to start up Xvfb: | 
 |   xinit -- /usr/bin/Xvfb :1 -cc 4 -screen 0 1024x768x16 | 
 |  | 
 |    This starts up a 16bpp virtual display. To export it via VNC use | 
 |   x11vnc -display :1 ... | 
 |  | 
 |    Then have the remote vncviewer attach to x11vnc's VNC display (e.g. :0 | 
 |    which is port 5900.) | 
 |  | 
 |    The "-cc 4" Xvfb option is to force it to use a TrueColor visual | 
 |    instead of DirectColor (this works around a recent bug in the Xorg | 
 |    Xvfb server.) | 
 |  | 
 |    One good thing about Xvfb is that the virtual framebuffer exists in | 
 |    main memory (rather than in the video hardware), and so x11vnc can | 
 |    "screen scrape" it very efficiently (more than, say, 100X faster than | 
 |    normal video hardware.) | 
 |  | 
 |    Update Nov/2006: See the FINDCREATEDISPLAY discussion of the "-display | 
 |    WAIT:cmd=FINDDISPLAY" option where virtual (Xvfb or Xdummy, or even | 
 |    real ones by changing an option) X servers are started automatically | 
 |    for new users connecting. This provides a "desktop service" for the | 
 |    machine. You either get your real X session or your virtual | 
 |    (Xvfb/Xdummy) one whenever you connect to the machine (inetd(8) is a | 
 |    nice way to provide this service.) The -find, -create, -svc, and | 
 |    -xdmsvc aliases can also come in handy here. | 
 |  | 
 |    There are some annoyances WRT Xvfb however. The default keyboard | 
 |    mapping seems to be very poor. One should run x11vnc with -add_keysyms | 
 |    option to have keysyms added automatically. Also, to add the Shift_R | 
 |    and Control_R modifiers something like this is needed: | 
 | #!/bin/sh | 
 | xmodmap -e "keycode any = Shift_R" | 
 | xmodmap -e "add Shift = Shift_L Shift_R" | 
 | xmodmap -e "keycode any = Control_R" | 
 | xmodmap -e "add Control = Control_L Control_R" | 
 | xmodmap -e "keycode any = Alt_L" | 
 | xmodmap -e "keycode any = Alt_R" | 
 | xmodmap -e "keycode any = Meta_L" | 
 | xmodmap -e "add Mod1 = Alt_L Alt_R Meta_L" | 
 |  | 
 |    (note: these are applied automatically in the FINDCREATEDISPLAY mode | 
 |    of x11vnc.) Perhaps the Xvfb options -xkbdb or -xkbmap could be used | 
 |    to get a better default keyboard mapping... | 
 |  | 
 |    Dummy Driver:  A user points out a faster and more accurate method is | 
 |    to use the "dummy" Device Driver of XFree86/Xorg instead of Xvfb. He | 
 |    uses this to create a persistent and resizable desktop accessible from | 
 |    anywhere. In the Device Section of the config file set Driver "dummy". | 
 |    You may also need to set VideoRam NNN to be large enough to hold the | 
 |    framebuffer. The framebuffer is kept in main memory like Xvfb except | 
 |    that the server code is closely correlated with the real XFree86/Xorg | 
 |    Xserver unlike Xvfb. | 
 |  | 
 |    The main drawback to this method (besides requiring extra | 
 |    configuration and possibly root permission) is that it also does the | 
 |    Linux Virtual Console/Terminal (VC/VT) switching even though it does | 
 |    not need to (since it doesn't use a real framebuffer.) There are some | 
 |    "dual headed" (actually multi-headed/multi-user) patches to the X | 
 |    server that turn off the VT usage in the X server. Update: As of | 
 |    Jul/2005 we have an LD_PRELOAD script Xdummy that allows you to use a | 
 |    stock (i.e. unpatched) Xorg or XFree86 server with the "dummy" driver | 
 |    and not have any VT switching problems! An advantage of Xdummy over | 
 |    Xvfb is that Xdummy supports RANDR dynamic screen resizing. | 
 |  | 
 |    The standard way to start the "dummy" driver would be: | 
 | startx -- :1 -config /etc/X11/xorg.conf.dummy | 
 |  | 
 |    where the file /etc/X11/xorg.conf.dummy has its Device Section | 
 |    modified as described above. To use the LD_PRELOAD wrapper script: | 
 | startx -- /path/to/Xdummy :1 | 
 |  | 
 |    An xdm(1) example is also provided. | 
 |  | 
 |    In general, one can use these sorts of schemes to use x11vnc to export | 
 |    other virtual X sessions, say Xnest or even Xvnc itself (useful for | 
 |    testing x11vnc.) | 
 |  | 
 |    Local access (VNC Server and VNC Viewer on the same machine): You use | 
 |    a VNC viewer to access the display remotely; to access your virtual X | 
 |    display locally (i.e. while sitting at the same machine it is running | 
 |    on) one can perhaps have something like this in their $HOME/.xinitrc | 
 | #!/bin/sh | 
 | x11vnc -display :5 -rfbport 5905 -bg | 
 | vncviewer -geometry +0+0 -encodings raw -passwd $HOME/.vnc/passwd localhost:5 | 
 |  | 
 |    The display numbers (VNC and X) will likely be different (you could | 
 |    also try -find), and you may not need the -passwd. Recent RealVNC | 
 |    viewers might be this: | 
 | #!/bin/sh | 
 | x11vnc -display :5 -rfbport 5905 -bg | 
 | vncviewer -FullScreen -PreferredEncoding raw -passwd $HOME/.vnc/passwd localhos | 
 | t:5 | 
 |  | 
 |    This way a bare X server is run with no window manager or desktop; it | 
 |    simply runs only the VNC Viewer on the real X server. The Viewer then | 
 |    draws the virtual X session on to the real one. On your system it | 
 |    might not be $HOME/.xinitrc, but rather .xsession, .Xclients, or | 
 |    something else. You will need to figure out what it is for your system | 
 |    and configuration. | 
 |  | 
 |  | 
 |    XDM/GDM/KDM One-Shot X sessions: For the general replacement of Xvnc | 
 |    by Xvfb+x11vnc, one user describes a similar setup he created where | 
 |    the X sessions are one-shot's (destroyed after the vncviewer | 
 |    disconnects) and it uses the XDM/GDM/KDM login greeter here. | 
 |  | 
 |  | 
 |    Q-69: How can I use x11vnc on "headless" machines? Why might I want | 
 |    to? | 
 |  | 
 |    An interesting application of x11vnc is to let it export displays of | 
 |    "headless" machines. For example, you may have some lab or server | 
 |    machines with no keyboard, mouse, or monitor, but each one still has a | 
 |    video card. One can use x11vnc to provide a simple "desktop service" | 
 |    from these server machines. | 
 |  | 
 |    An X server can be started on the headless machine (sometimes this | 
 |    requires configuring the X server to not fail if it cannot detect a | 
 |    keyboard or mouse, see the next paragraph.) Then you can export that X | 
 |    display via x11vnc (e.g. see this FAQ) and access it from anywhere on | 
 |    the network via a VNC viewer. | 
 |  | 
 |    Some tips on getting X servers to start on machines without keyboard | 
 |    or mouse: For XFree86/Xorg the Option "AllowMouseOpenFail" "true" | 
 |    "ServerFlags" config file option is useful. On Solaris Xsun the | 
 |    +nkeyboard and +nmouse options are useful (put them in the server | 
 |    command line args in /etc/dt/config/Xservers.) There are patches | 
 |    available for Xsun at lease back to Solaris 8 that support this. See | 
 |    Xserver(1) for more info. | 
 |  | 
 |    Although this usage may sound strange it can be quite useful for a GUI | 
 |    (or other) testing or QA setups: the engineers do not need to walk to | 
 |    lab machines running different hardware, OS's, versions, etc (or have | 
 |    many different machines in their office.) They just connect to the | 
 |    various test machines over the network via VNC. The advantage to | 
 |    testing this way instead of using Xvnc or even Xvfb is that the test | 
 |    is done using the real X server, fonts, video hardware, etc. that will | 
 |    be used in the field. | 
 |  | 
 |    One can imagine a single server machine crammed with as many video | 
 |    cards as it can hold to provide multiple simultaneous access or | 
 |    testing on different kinds of video hardware. | 
 |  | 
 |    See also the FINDCREATEDISPLAY discussion of the "-display | 
 |    WAIT:cmd=FINDDISPLAY" option where virtual Xvfb or Xdummy, or real X | 
 |    servers are started automatically for new users connecting. The -find, | 
 |    -create, -svc, and -xdmsvc aliases can also come in handy here. | 
 |  | 
 |    [Resource Usage and Performance] | 
 |  | 
 |    Q-70: I have lots of memory, but why does x11vnc fail with    shmget: | 
 |    No space left on device    or    Minor opcode of failed request: 1 | 
 |    (X_ShmAttach)? | 
 |  | 
 |    It is not a matter of free memory, but rather free shared memory (shm) | 
 |    slots, also known as shm segments. This often occurs on a public | 
 |    Solaris machine using the default of only 100 slots. You (or the owner | 
 |    or root) can clean them out with ipcrm(1). x11vnc tries hard to | 
 |    release its slots, but it, and other programs, are not always able to | 
 |    (e.g. if kill -9'd.) | 
 |  | 
 |    Sometimes x11vnc will notice the problem with shm segments and tries | 
 |    to get by with fewer, only giving a warning like this: | 
 |   19/03/2004 10:10:58 shmat(tile_row) failed. | 
 |   shmat: Too many open files | 
 |   19/03/2004 10:10:58 error creating tile-row shm for len=4 | 
 |   19/03/2004 10:10:58 reverting to single_copytile mode | 
 |  | 
 |    Here is a shell script shm_clear to list and prompt for removal of | 
 |    your unattached shm segments (attached ones are skipped.) I use it | 
 |    while debugging x11vnc (I use "shm_clear -y" to assume "yes" for each | 
 |    prompt.) If x11vnc is regularly not cleaning up its shm segments, | 
 |    please contact me so we can work to improve the situation. | 
 |  | 
 |    Longer term, on Solaris you can put something like this in | 
 |    /etc/system: | 
 |   set shmsys:shminfo_shmmax = 0x2000000 | 
 |   set shmsys:shminfo_shmmni = 0x1000 | 
 |  | 
 |    to sweep the problem under the rug (4096 slots.) On Linux, examine | 
 |    /proc/sys/kernel/shmmni; you can modify the value by writing to that | 
 |    file. | 
 |  | 
 |    Things are even more tight on Solaris 8 and earlier, there is a | 
 |    default maximum number of shm segments per process of 6. The error is | 
 |    the X server (not x11vnc) being unable to attach to the segments, and | 
 |    looks something like this: | 
 |   30/04/2004 14:04:26 Got connection from client 192.168.1.23 | 
 |   30/04/2004 14:04:26   other clients: | 
 |   X Error of failed request:  BadAccess (attempt to access private resource den | 
 | ied) | 
 |      Major opcode of failed request:  131 (MIT-SHM) | 
 |      Minor opcode of failed request:  1 (X_ShmAttach) | 
 |      Serial number of failed request:  14 | 
 |      Current serial number in output stream:  17 | 
 |  | 
 |    This tight limit on Solaris 8 can be increased via: | 
 |   set shmsys:shminfo_shmseg = 100 | 
 |  | 
 |    in /etc/system. See the next paragraph for more workarounds. | 
 |  | 
 |    To minimize the number of shm segments used by x11vnc try using the | 
 |    -onetile option (corresponds to only 3 shm segments used, and adding | 
 |    -fs 1.0 knocks it down to 2.) If you are having much trouble with shm | 
 |    segments, consider disabling shm completely via the -noshm option. | 
 |    Performance will be somewhat degraded but when done over local machine | 
 |    sockets it should be acceptable (see an earlier question discussing | 
 |    -noshm.) | 
 |  | 
 |  | 
 |    Q-71: How can I make x11vnc use less system resources? | 
 |  | 
 |    The -nap (now on by default; use -nonap to disable) and "-wait n" | 
 |    (where n is the sleep between polls in milliseconds, the default is 30 | 
 |    or so) option are good places to start. In addition, something like | 
 |    "-sb 15" will cause x11vnc to go into a deep-sleep mode after 15 | 
 |    seconds of no activity (instead of the default 60.) | 
 |  | 
 |    Reducing the X server bits per pixel depth (e.g. to 16bpp or even | 
 |    8bpp) will further decrease memory I/O and network I/O. The ShadowFB X | 
 |    server setting will make x11vnc's screen polling less severe. Using | 
 |    the -onetile option will use less memory and use fewer shared memory | 
 |    slots (add -fs 1.0 for one less slot.) | 
 |  | 
 |  | 
 |    Q-72: How can I make x11vnc use MORE system resources? | 
 |  | 
 |    You can try -threads (note this mode can be unstable and/or crash; and | 
 |    as of May/2008 is strongly discouraged, see the option description) or | 
 |    dial down the wait time (e.g. -wait 1) and possibly dial down -defer | 
 |    as well. Note that if you try to increase the "frame rate" too much | 
 |    you can bog down the server end with the extra work it needs to do | 
 |    compressing the framebuffer data, etc. | 
 |  | 
 |    That said, it is possible to "stream" video via x11vnc if the video | 
 |    window is small enough. E.g. a 256x192 xawtv TV capture window (using | 
 |    the x11vnc -id option) can be streamed over a LAN or wireless at a | 
 |    reasonable frame rate. If the graphics card's framebuffer read rate is | 
 |    faster than normal then the video window size and frame rate can be | 
 |    much higher. The use of TurboVNC and/or TurboJPEG can make the frame | 
 |    rate somewhat higher still (but most of this hinges on the graphics | 
 |    card's read rate.) | 
 |  | 
 |  | 
 |    Q-73: I use x11vnc over a slow link with high latency (e.g. dialup | 
 |    modem or broadband), is there anything I can do to speed things up? | 
 |  | 
 |    Some things you might want to experiment with (many of which will help | 
 |    performance on faster links as well): | 
 |  | 
 |      X server/session parameters: | 
 |      * Configure the X server bits per pixel to be 16bpp or even 8bpp. | 
 |        (reduces amount of data needed to be polled, compressed, and sent) | 
 |      * Use a smaller desktop size (e.g. 1024x768 instead of 1280x1024) | 
 |      * Make sure the desktop background is a solid color (the background | 
 |        is resent every time it is re-exposed.) Consider using the -solid | 
 |        [color] option to try to do this automatically. | 
 |      * Configure your window manager or desktop "theme" to not use fancy | 
 |        images, shading, and gradients for the window decorations, etc. | 
 |        Disable window animations, etc. Maybe your desktop has a "low | 
 |        bandwidth" theme you can easily switch into and out of. Also in | 
 |        Firefox disable eye-candy, e.g.: Edit -> Preferences -> Advanced | 
 |        -> Use Smooth Scrolling (deselect it.) | 
 |      * Avoid small scrolls of large windows using the Arrow keys or | 
 |        scrollbar. Try to use PageUp/PageDown instead. (not so much of a | 
 |        problem in x11vnc 0.7.2 if -scrollcopyrect is active and detecting | 
 |        scrolls for the application.) | 
 |      * If the -wireframe option is not available (earlier than x11vnc | 
 |        0.7.2 or you have disabled it via -nowireframe) then Disable | 
 |        Opaque Moves and Resizes in the window manager/desktop. | 
 |      * However if -wireframe is active (on by default in x11vnc 0.7.2) | 
 |        then you should Enable Opaque Moves and Resizes in the window | 
 |        manager! This seems counter-intuitive, but because x11vnc detects | 
 |        the move/resize events early there is a huge speedup over a slow | 
 |        link when Opaque Moves and Resizes are enabled. (e.g. CopyRect | 
 |        encoding will be used.) | 
 |      * Turn off Anti-aliased fonts on your system, web browser, terminal | 
 |        windows, etc. AA fonts do not compress as well as traditional | 
 |        fonts (sometimes 10X less.) | 
 |      * On Firefox/Mozilla (and anything else) turn off "Smooth Scroll" | 
 |        animations. In Firefox put in the URL "about:config" and set | 
 |        general.smoothScroll to false. | 
 |      * On Xorg/XFree86 turn on the Shadow Framebuffer to speed up | 
 |        reading. (Option "ShadowFB" "true" in the Device section of | 
 |        /etc/X11/XF86Config) This disables 2D acceleration on the physical | 
 |        display and so may not be worth it (if you play games, etc), but | 
 |        could be of use in some situations. Note: If the network link is | 
 |        very slow, this speedup may not be noticed. | 
 |  | 
 |      VNC viewer parameters: | 
 |      * Use a TightVNC enabled viewer! (Actually, RealVNC 4.x viewer with | 
 |        ZRLE encoding is not too bad either; some claim it is faster.) | 
 |      * Make sure the tight (or zrle) encoding is being used (look at | 
 |        vncviewer and x11vnc outputs) | 
 |      * Request 8 bits per pixel using -bgr233 (up to 4X speedup over | 
 |        depth 24 TrueColor (32bpp), but colors will be off) | 
 |      * RealVNC 4.x viewer has some extremely low color modes (only 64 and | 
 |        even 8 colors.) SSVNC does too. The colors are poor, but it is | 
 |        usually noticeably faster than bgr233 (256 colors.) | 
 |      * Try increasing the TightVNC -compresslevel (compresses more on | 
 |        server side before sending, but uses more CPU) | 
 |      * Try reducing the TightVNC -quality (increases JPEG compression, | 
 |        but is lossy with painting artifacts) | 
 |      * Try other VNC encodings via -encodings (tight may be the fastest, | 
 |        but you should compare it to zrle and maybe some of the others) | 
 |      * On the machine where vncviewer is run, make sure Backing Store is | 
 |        enabled (Xorg/XFree86 disables it by default causing re-exposures | 
 |        of vncviewer to be very slow) Option "backingstore" in config | 
 |        file. | 
 |  | 
 |      x11vnc parameters: | 
 |      * Make sure the -wireframe option is active (it should be on by | 
 |        default) and you have Opaque Moves/Resizes Enabled in the window | 
 |        manager. | 
 |      * Make sure the -scrollcopyrect option is active (it should be on by | 
 |        default.) This detects scrolls in many (but not all) applications | 
 |        an applies the CopyRect encoding for a big speedup. | 
 |      * Enforce a solid background when VNC viewers are connected via | 
 |        -solid | 
 |      * Try x11vnc's client-side caching client-side caching scheme: | 
 |        -ncache | 
 |      * Specify -speeds modem to force the wireframe and scrollcopyrect | 
 |        heuristic parameters (and any future ones) to those of a dialup | 
 |        modem connection (or supply the rd,bw,lat numerical values that | 
 |        characterize your link.) | 
 |      * If wireframe and scrollcopyrect aren't working, try using the more | 
 |        drastic -nodragging (no screen updates when dragging mouse, but | 
 |        sometimes you miss visual feedback) | 
 |      * Set -fs 1.0 (disables fullscreen updates) | 
 |      * Try increasing -wait or -defer (reduces the maximum "frame rate", | 
 |        but won't help much for large screen changes) | 
 |      * Try the -progressive pixelheight mode with the block pixelheight | 
 |        100 or so (delays sending vertical blocks since they may change | 
 |        while viewer is receiving earlier ones) | 
 |      * If you just want to watch one (simple) window use -id or -appshare | 
 |        (cuts down extraneous polling and updates, but can be buggy or | 
 |        insufficient) | 
 |      * Set -nosel (disables all clipboard selection exchange) | 
 |      * Use -nocursor and -nocursorpos (repainting the remote cursor | 
 |        position and shape takes resources and round trips) | 
 |      * On very slow links (e.g. <= 28.8) you may need to increase the | 
 |        -readtimeout n setting if it sometimes takes more than 20sec to | 
 |        paint the full screen, etc. | 
 |      * Do not use -fixscreen to automatically refresh the whole screen, | 
 |        tap three Alt_L's then the screen has painting errors (rare | 
 |        problem.) | 
 |  | 
 |  | 
 |    Example for the KDE desktop: | 
 |  | 
 |    Launch the "KDE Control Center" utility. Sometimes this is called | 
 |    "Personal Settings". | 
 |  | 
 |    Select "Desktop". | 
 |  | 
 |     Then Select "Window Behavior". In the "Moving" Tab set these: | 
 |      * YES - Display content in moving windows | 
 |      * YES - Display content in resizing windows | 
 |      * NO   - Display window geometry when moving or resizing | 
 |      * NO   - Animate minimize and restore | 
 |  | 
 |     In the "Translucency" Tab set: | 
 |      * NO   - Use translucency/shadows | 
 |  | 
 |    Next hit "Back" and then select "Panels". | 
 |  | 
 |     In the "Appearance" Tab set: | 
 |      * NO   - Enable icon mouseover effects | 
 |      * NO   - Enable transparency | 
 |  | 
 |    Now go all the way back up to the top and Select "Appearance & | 
 |    Themes". | 
 |  | 
 |     Select "Background" and set: | 
 |      * YES - No picture | 
 |      * Colors: Single Color | 
 |  | 
 |     Select "Fonts" and disable anti-aliased fonts if you are bold enough. | 
 |  | 
 |     Select "Launch Feedback" and set: | 
 |      * Busy Cursor: No Busy Cursor | 
 |      * NO   - Enable taskbar notification | 
 |  | 
 |     Select "Screen Saver" and set: | 
 |      * Screen Saver: Blank Screen | 
 |  | 
 |     Select "Style" and in the "Effects" Tab set: | 
 |      * NO   - Enable GUI effects | 
 |  | 
 |  | 
 |    Example for the GNOME desktop: | 
 |      * TBD. | 
 |  | 
 |  | 
 |    Q-74: Does x11vnc support the X DAMAGE Xserver extension to find | 
 |    modified regions of the screen quickly and efficiently? | 
 |  | 
 |    Yes, as of Mar/2005 x11vnc will use the X DAMAGE extension by default | 
 |    if it is available on the display. This requires libXdamage to be | 
 |    available in the build environment as well (recent Linux distros and | 
 |    Solaris 10 have it.) | 
 |  | 
 |    The DAMAGE extension enables the X server to report changed regions of | 
 |    the screen back to x11vnc. So x11vnc doesn't have to guess where the | 
 |    changes are (by polling every pixel of the entire screen every 2-4 | 
 |    seconds.) The use of X DAMAGE dramatically reduces the load when the | 
 |    screen is not changing very much (i.e. most of the time.) It also | 
 |    noticeably improves updates, especially for very small changed areas | 
 |    (e.g. clock ticking, cursor flashing, typing, etc.) | 
 |  | 
 |    Note that the DAMAGE extension does not speed up the actual reading of | 
 |    pixels from the video card framebuffer memory, by, say, mirroring them | 
 |    in main memory. So reading the fb is still painfully slow (e.g. | 
 |    5MB/sec), and so even using X DAMAGE when large changes occur on the | 
 |    screen the bulk of the time is still spent retrieving them. Not ideal, | 
 |    but use of the ShadowFB XFree86/Xorg option speeds up the reading | 
 |    considerably (at the cost of h/w acceleration.) | 
 |  | 
 |    Unfortunately the current Xorg DAMAGE extension implementation can at | 
 |    times be overly conservative and report very large rectangles as | 
 |    "damaged" even though only a small portion of the pixels have actually | 
 |    been modified. This behavior is often the fault of the window manager | 
 |    (e.g. it redraws the entire, unseen, frame window underneath the | 
 |    application window when it gains focus), or the application itself | 
 |    (e.g. does large, unnecessary repaints.) | 
 |  | 
 |    To work around this deficiency, x11vnc currently only trusts small | 
 |    DAMAGE rectangles to contain real damage. The larger rectangles are | 
 |    only used as hints to focus the traditional scanline polling (i.e. if | 
 |    a scanline doesn't intersect a recent DAMAGE rectangle, the scan is | 
 |    skipped.) You can use the "-xd_area A" option to adjust the size of | 
 |    the trusted DAMAGE rectangles. The default is 20000 pixels (e.g. a | 
 |    140x140 square, etc.) Use "-xd_area 0" to disable the cutoff and trust | 
 |    all DAMAGE rectangles. | 
 |  | 
 |    The option "-xd_mem f" may also be of use in tuning the algorithm. To | 
 |    disable using DAMAGE entirely use "-noxdamage". | 
 |  | 
 |  | 
 |    Q-75: My OpenGL application shows no screen updates unless I supply | 
 |    the -noxdamage option to x11vnc. | 
 |    One user reports in his environment (MythTV using the NVIDIA OpenGL | 
 |    drivers) he gets no updates after the initial screen is drawn unless | 
 |    he uses the "-noxdamage" option. | 
 |  | 
 |    This seems to be a bug in the X DAMAGE implementation of that driver. | 
 |    You may have to use -noxdamage as well. A way to autodetect this will | 
 |    be tried, probably the best it will do is automatically stop using X | 
 |    DAMAGE. | 
 |  | 
 |    A developer for MiniMyth reports that the 'alphapulse' tag of the | 
 |    theme G.A.N.T. can also cause problems, and should be avoided when | 
 |    using VNC. | 
 |  | 
 |    Update: see this FAQ too. | 
 |  | 
 |  | 
 |    Q-76: When I drag windows around with the mouse or scroll up and down | 
 |    things really bog down (unless I do the drag in a single, quick | 
 |    motion.) Is there anything to do to improve things? | 
 |  | 
 |    This problem is primarily due to slow hardware read rates from video | 
 |    cards: as you scroll or move a large window around the screen changes | 
 |    are much too rapid for x11vnc to keep up them (it can usually only | 
 |    read the video card at about 5-10 MB/sec, so it can take a good | 
 |    fraction of a second to read the changes induce from moving a large | 
 |    window, if this to be done a number of times in succession the window | 
 |    or scroll appears to "lurch" forward.) See the description in the | 
 |    -pointer_mode option for more info. The next bottleneck is compressing | 
 |    all of these changes and sending them out to connected viewers, | 
 |    however the VNC protocol is pretty much self-adapting with respect to | 
 |    that (updates are only packaged and sent when viewers ask for them.) | 
 |  | 
 |    As of Jan/2004 there are some improvements to libvncserver. The | 
 |    default should now be much better than before and dragging small | 
 |    windows around should no longer be a huge pain. If for some reason | 
 |    these changes make matters worse, you can go back to the old way via | 
 |    the "-pointer_mode 1" option. | 
 |  | 
 |    Also added was the -nodragging option that disables all screen updates | 
 |    while dragging with the mouse (i.e. mouse motion with a button held | 
 |    down.) This gives the snappiest response, but might be undesired in | 
 |    some circumstances when you want to see the visual feedback while | 
 |    dragging (e.g. menu traversal or text selection.) | 
 |  | 
 |    As of Dec/2004 the -pointer_mode n option was introduced. n=1 is the | 
 |    original mode, n=2 an improvement, etc.. See the -pointer_mode n help | 
 |    for more info. | 
 |  | 
 |    Also, in some circumstances the -threads option can improve response | 
 |    considerably. Be forewarned that if more than one vncviewer is | 
 |    connected at the same time then libvncserver may not be thread safe | 
 |    (try to get the viewers to use different VNC encodings, e.g. tight and | 
 |    ZRLE.) This option can be unstable and so as of Feb/2008 it is | 
 |    disabled by default. Set env. X11VNC_THREADED=1 to re-enable. | 
 |  | 
 |    As of Apr/2005 two new options (see the wireframe FAQ and | 
 |    scrollcopyrect FAQ below) provide schemes to sweep this problem under | 
 |    the rug for window moves or resizes and for some (but not all) window | 
 |    scrolls. These are the preferred way of avoiding the "lurching" | 
 |    problem, contact me if they are not working. Note on SuSE and some | 
 |    other distros the RECORD X extension used by scrollcopyrect is not | 
 |    enabled by default, turn it on in xorg.conf: | 
 | Section "Module" | 
 |         ... | 
 |         Load  "record" | 
 |         ... | 
 | EndSection | 
 |  | 
 |  | 
 |    Q-77: Why not do something like wireframe animations to avoid the | 
 |    windows "lurching" when being moved or resized? | 
 |  | 
 |    Nice idea for a hack! As of Apr/2005 x11vnc by default will apply | 
 |    heuristics to try to guess if a window is being (opaquely) moved or | 
 |    resized. If such a change is detected framebuffer polling and updates | 
 |    will be suspended and only an animated "wireframe" (a rectangle | 
 |    outline drawn where the moved/resized window would be) is shown. When | 
 |    the window move/resize stops, it returns to normal processing: you | 
 |    should only see the window appear in the new position. This spares you | 
 |    from interacting with a "lurching" window between all of the | 
 |    intermediate steps. BTW the lurching is due to slow video card read | 
 |    rates (see here too.) A displacement, even a small one, of a large | 
 |    window requires a non-negligible amount of time, a good fraction of a | 
 |    second, to read in from the hardware framebuffer. | 
 |  | 
 |    Note that Opaque Moves/Resizes must be Enabled by your window manager | 
 |    for -wireframe to do any good. | 
 |  | 
 |    The mode is currently on by default because most people are afflicted | 
 |    with the problem. It can be disabled with the -nowireframe option (aka | 
 |    -nowf.) Why might one want to turn off the wireframing? Since x11vnc | 
 |    is merely guessing when windows are being moved/resized, it may guess | 
 |    poorly for your window-manager or desktop, or even for the way you | 
 |    move the pointer. If your window-manager or desktop already does its | 
 |    own wireframing then this mode is a waste of time and could do the | 
 |    wrong thing occasionally. There may be other reasons the new mode | 
 |    feels unnatural. If you have very expensive video hardware (SGI, well | 
 |    now even proprietary Xorg drivers are fast at reading) or are using an | 
 |    in-RAM video framebuffer (SunRay, ShadowFB, Xvfb), the read rate from | 
 |    that framebuffer may be very fast (100's of MB/sec) and so you don't | 
 |    really see much lurching (at least over a fast LAN): opaque moves look | 
 |    smooth in x11vnc. Note: ShadowFB is often turned on when you are using | 
 |    the vesafb or fbdev XFree86 video driver instead of a native one so | 
 |    you might be using it already and not know. | 
 |  | 
 |    The heuristics used to guess window motion or resizing are simple, but | 
 |    are not fool proof: x11vnc is sometimes tricked and so you'll | 
 |    occasionally see the lurching opaque move and rarely something even | 
 |    worse. | 
 |  | 
 |    First it assumes that the move/resize will occur with a mouse button | 
 |    pressed, held down and dragged (of course this is only mostly true.) | 
 |    Next it will only consider a window for wireframing if the mouse | 
 |    pointer is initially "close enough" to the edges of the window frame, | 
 |    e.g. you have grabbed the title bar or a resizer edge (this | 
 |    requirement can be disabled and it also not applied if a modifier key, | 
 |    e.g. Alt, is pressed.) If these are true, it will wait an amount of | 
 |    time to see if the window starts moving or resizing. If it does, it | 
 |    starts drawing the wireframe "outline" of where the window would be. | 
 |    When the mouse button is released, or a timeout occurs, it goes back | 
 |    to the standard mode to allow the actual framebuffer changes to | 
 |    propagate to the viewers. | 
 |  | 
 |    These parameters can be tweaked: | 
 |      * Color/Shade of the wireframe. | 
 |      * Linewidth of the outline frame. | 
 |      * Cutoff size of windows to not apply wireframing to. | 
 |      * Cutoffs for closeness to Top, Bottom, Left, and Right edges of | 
 |        window. | 
 |      * Modifier keys to enable interior window grabbing. | 
 |      * Maximum time to wait for dragging pointer events. | 
 |      * Maximum time to wait for the window to start moving/resizing. | 
 |      * Maximum time to show a wireframe animation. | 
 |      * Minimum time between sending wireframe outlines. | 
 |  | 
 |    See the "-wireframe tweaks" option for more details. On a slow link, | 
 |    e.g. dialup modem, the parameters may be automatically adjusted for | 
 |    better response. | 
 |  | 
 |  | 
 |    CopyRect encoding:  In addition to the above there is the | 
 |    "-wirecopyrect mode" option. It is also on by default. This instructs | 
 |    x11vnc to not only show the wireframe animation, but to also instruct | 
 |    all connected VNC viewers to locally translate the window image data | 
 |    from the original position to the new position on the screen when the | 
 |    animation is done. This speedup is the VNC CopyRect encoding: the | 
 |    framebuffer update doesn't need to send the actual new image data. | 
 |    This is nice in general, and very convenient over a slow link, but | 
 |    since it is based on heuristics you may need to disable it with the | 
 |    -nowirecopyrect option (aka -nowcr) if it works incorrectly or | 
 |    unnaturally for you. | 
 |  | 
 |    The -wirecopyrect modes are: "never" (same as -nowirecopyrect); "top", | 
 |    only apply the CopyRect if the window is appears to be on the top of | 
 |    the window stack and is not obstructed by other windows; and "always" | 
 |    to always try to apply the CopyRect (obstructed regions are usually | 
 |    clipped off and not translated.) | 
 |  | 
 |    Note that some desktops (KDE and xfce) appear to mess with the window | 
 |    stacking in ways that are not yet clear. In these cases x11vnc works | 
 |    around the problem by applying the CopyRect even if obscuring windows' | 
 |    data is translated! Use -nowirecopyrect if this yields undesirable | 
 |    effects for your desktop. | 
 |  | 
 |    Also, the CopyRect encoding may give incorrect results under -scale | 
 |    (depending on the scale factor the CopyRect operation is often only | 
 |    approximate: the correctly scaled framebuffer will be slightly | 
 |    different from the translated one.) x11vnc will try to push a | 
 |    "cleanup" update after the CopyRect if -scale is in effect. Use | 
 |    -nowirecopyrect if this or other painting errors are unacceptable. | 
 |  | 
 |  | 
 |    Q-78: Can x11vnc try to apply heuristics to detect when a window is | 
 |    scrolling its contents and use the CopyRect encoding for a speedup? | 
 |  | 
 |    Another nice idea for a hack! As of May/2005 x11vnc will by default | 
 |    apply heuristics to try to detect if the window that has the input | 
 |    focus is scrolling its contents (but only when x11vnc is feeding user | 
 |    input, keystroke or pointer, to the X server.) So, when detected, | 
 |    scrolls induced by dragging on a scrollbar or by typing (e.g. Up or | 
 |    Down arrows, hitting Return in a terminal window, etc), will show up | 
 |    much more quickly than via the standard x11vnc screen polling update | 
 |    mechanism. | 
 |  | 
 |    There will be a speedup for both slow and fast links to viewers. For | 
 |    slow links the speedup is mostly due to the CopyRect encoding not | 
 |    requiring the image data to be transmitted over the network. For fast | 
 |    links the speedup is primarily due to x11vnc not having to read the | 
 |    scrolled framebuffer data from the X server (recall that reading from | 
 |    the hardware framebuffer is slow.) | 
 |  | 
 |    To do this x11vnc uses the RECORD X extension to snoop the X11 | 
 |    protocol between the X client with the focus window and the X server. | 
 |    This extension is usually present on most X servers (but SuSE disables | 
 |    it for some reason.) On XFree86/Xorg it can be enabled via Load | 
 |    "record" in the Module section of the config file if it isn't already: | 
 | Section "Module" | 
 |         ... | 
 |         Load  "record" | 
 |         ... | 
 | EndSection | 
 |  | 
 |    Currently the RECORD extension is used as little as possible so as to | 
 |    not slow down regular use. Only simple heuristics are applied to | 
 |    detect XCopyArea and XConfigureWindow calls from the application. | 
 |    These catch a lot of scrolls, e.g. in mozilla/firefox and in terminal | 
 |    windows like gnome-terminal and xterm. Unfortunately the toolkits KDE | 
 |    applications use make scroll detection less effective (only rarely are | 
 |    they detected: i.e. Konqueror and Konsole don't work.) An interesting | 
 |    project, that may be the direction x11vnc takes, is to record all of | 
 |    the X11 protocol from all clients and try to "tee" the stream into a | 
 |    modified Xvfb watching for CopyRect and other VNC speedups. A | 
 |    potential issue is the RECORD stream is delayed from actual view on | 
 |    the X server display: if one falls too far behind it could become a | 
 |    mess... | 
 |  | 
 |    The initial implementation of -scrollcopyrect option is useful in that | 
 |    it detects many scrolls and thus gives a much nicer working | 
 |    environment (especially when combined with the -wireframe | 
 |    -wirecopyrect options, which are also on by default; and if you are | 
 |    willing to enable the ShadowFB things are very fast.) The fact that | 
 |    there aren't long delays or lurches during scrolling is the primary | 
 |    improvement. | 
 |  | 
 |    But there are some drawbacks: | 
 |      * Not all scrolls are detected. Some apps scroll windows in ways | 
 |        that cannot currently be detected, and other times x11vnc "misses" | 
 |        the scroll due to timeouts, etc. Sometimes it is more distracting | 
 |        that a speedup occasionally doesn't work as opposed to being | 
 |        consistently slow! | 
 |      * For rapid scrolling (i.e. sequence of many scrolls over a short | 
 |        period) there can be painting errors (tearing, bunching up, etc.) | 
 |        during the scroll. These will repair themselves after the scroll | 
 |        is over, but when they are severe it can be distracting. Try to | 
 |        think of the approximate window contents as a quicker and more | 
 |        useful "animation" compared to the slower polling scheme... | 
 |      * Scrolling inside shells in terminal windows (gnome-terminal, | 
 |        xterm), can lead to odd painting errors. This is because x11vnc | 
 |        did not have time to detect a screen change just before the scroll | 
 |        (most common is the terminal undraws the block cursor before | 
 |        scrolling the text up: in the viewer you temporarily see multiple | 
 |        block cursors.) Another issue is with things like more(1): scroll | 
 |        detection for 5-6 lines happens nicely, but then it can't keep up | 
 |        and so there is a long pause for the standard polling method to | 
 |        deliver the remaining updates. | 
 |      * More rarely sometimes painting errors are not repaired after the | 
 |        scroll is over. This may be a bug in x11vnc or libvncserver, or it | 
 |        may be an inescapable fact of the CopyRect encoding and the delay | 
 |        between RECORD callbacks and what is actually on the X display. | 
 |        One can tap the Alt_L key (Left "Alt" key) 3 times in a row to | 
 |        signal x11vnc to refresh the screen to all viewers. Your | 
 |        VNC-viewer may have its own screen refresh hot-key or button. See | 
 |        also: -fixscreen | 
 |      * Some applications, notably OpenOffice, do XCopyArea scrolls in | 
 |        weird ways that assume ancestor window clipping is taking place. | 
 |        See the -scr_skip option for ways to tweak this on a | 
 |        per-application basis. | 
 |      * Selecting text while dragging the mouse may be slower, especially | 
 |        if the Button-down event happens near the window's edge. This is | 
 |        because the scrollcopyrect scheme is watching for scrolls via | 
 |        RECORD and has to wait for a timeout to occur before it does the | 
 |        update. | 
 |      * For reasons not yet understood the RECORD extension can stop | 
 |        responding (and hence scrolls are missed.) As a workaround x11vnc | 
 |        attempts to reset the RECORD connection every 60 seconds or so. | 
 |        Another workaround is to type 4 Super_L (Left Super/Windows-Flag | 
 |        key) in a row to reset RECORD. Work is in progress to try to fix | 
 |        this bug. | 
 |      * Sometimes you need to "retrain" x11vnc for a certain window | 
 |        because it fails to detect scrolls in it. Sometimes clicking | 
 |        inside the application window or selecting some text in it to | 
 |        force the focus helps. | 
 |      * When using the -scale option there will be a quick CopyRect | 
 |        scroll, but it needs to be followed by a slower "cleanup" update. | 
 |        This is because for a fixed finite screen resolution (e.g. 75 dpi) | 
 |        scaling and copyrect-ing are not exactly independent. Scaling | 
 |        involves a blending of nearby pixels and if you translate a pixel | 
 |        the neighbor pixel weighting may be different. So you have to wait | 
 |        a bit for the cleanup update to finish. On slow links x11vnc may | 
 |        automatically decide to not detect scrolls when -scale is in | 
 |        effect. In general it will also try to defer the cleanup update if | 
 |        possible. | 
 |  | 
 |    If you find the -scrollcopyrect behavior too approximate or | 
 |    distracting you can go back to the standard polling-only update method | 
 |    with the -noscrollcopyrect (or -noscr for short.) If you find some | 
 |    extremely bad and repeatable behavior for -scrollcopyrect please | 
 |    report a bug. | 
 |  | 
 |    Alternatively, as with -wireframe, there are many tuning parameters to | 
 |    try to improve the situation. You can also access these parameters | 
 |    inside the gui under "Tuning". These parameters can be tweaked: | 
 |      * The minimum pixel area of a rectangle to be watched for scrolls. | 
 |      * A list if application names to skip scroll detection. | 
 |      * Which keystrokes should trigger scroll detection. | 
 |      * Which applications should have a "terminal" tweak applied to them. | 
 |      * When repeating keys (e.g. Up arrow) should be discarded to | 
 |        preserve a scroll. | 
 |      * Cutoffs for closeness to Top, Bottom, Left, and Right edges of | 
 |        window for mouse induced scrolls. | 
 |      * Set timeout parameters for keystroke induced scrolls. | 
 |      * Set timeout parameters for mouse pointer induced scrolls. | 
 |      * Have the full screen be periodically refreshed to fix painting | 
 |        errors. | 
 |  | 
 |  | 
 |    Q-79: Can x11vnc do client-side caching of pixel data? I.e. so when | 
 |    that pixel data is needed again it does not have to be retransmitted | 
 |    over the network. | 
 |  | 
 |    As of Dec/2006 in the 0.9 development tarball there is an experimental | 
 |    client-side caching implementation enabled by the "-ncache n" option. | 
 |    In fact, during the test period it was on by default with n set to 10. | 
 |    To disable it use "-noncache". | 
 |  | 
 |    It is a simple scheme where a (very large) lower portion of the | 
 |    framebuffer (i.e. starting just below the user's actual desktop | 
 |    display) is used for storing pixel data. CopyRect; a fast, essentially | 
 |    local viewer-side VNC encoding; is used to swap the pixel data in and | 
 |    out of the actual display area. It gives an excellent speedup for | 
 |    iconifying/deiconifying and moving windows and re-posting of menus | 
 |    (often it doesn't feel like VNC at all: there is no delay waiting for | 
 |    the pixel data to fill in.) | 
 |  | 
 |    This scheme is nice because it does all of this within the existing | 
 |    VNC protocol, and so it works with all VNC viewers. | 
 |  | 
 |    A challenge to doing more sophisticated (e.g. compressed and/or | 
 |    shared) client-side caching is that one needs to extend the VNC | 
 |    protocol, modify a viewer and then also convince users to adopt your | 
 |    modified VNC Viewer (or get the new features to be folded into the | 
 |    main VNC viewers, patches accepted, etc... likely takes many years | 
 |    before they might be deployed in the field.) So it is convenient that | 
 |    the "-ncache n" works with any unaltered VNC viewer. | 
 |  | 
 |    A drawback of the "-ncache n" method is that in the VNC Viewer you can | 
 |    scroll down and actually see the cached pixel data. So it looks like | 
 |    there is a bug: you can scroll down in your viewer and see a strange | 
 |    "history" of windows on your desktop. This is working as intended. One | 
 |    will need to try to adjust the size of his VNC Viewer window so the | 
 |    cache area cannot be seen. SSVNC (see below) can do this | 
 |    automatically. | 
 |  | 
 |    At some point LibVNCServer may implement a "rfbFBCrop" pseudoencoding | 
 |    that viewers can use to learn which portion of the framebuffer to | 
 |    actually show to the users (with the hidden part used for caching, or | 
 |    perhaps something else, maybe double buffering or other offscreen | 
 |    rendering...) | 
 |  | 
 |    The Enhanced TightVNC Viewer (SSVNC) Unix viewer has a nice -ycrop | 
 |    option to help hide the pixel cache area from view. It will turn on | 
 |    automatically if the framebuffer appears to be very tall (height more | 
 |    than twice the width), or you can supply the actual value for the | 
 |    height. If the screen is resized by scaling, etc, the ycrop value is | 
 |    scaled as well. In fullscreen mode you cannot scroll past the end of | 
 |    the actual screen, and in non-fullscreen mode the window manager frame | 
 |    is adjusted to fit the actual display (so you don't see the pixel | 
 |    cache region) and the scrollbars are very thin to avoid distraction | 
 |    and trouble fitting inside your display. Use the "-sbwidth n" viewer | 
 |    option to make the scrollbars thicker if you like. | 
 |  | 
 |    Another drawback of the scheme is that it is VERY memory intensive, | 
 |    the n in "-ncache n" is the factor of increase over the base | 
 |    framebuffer size to use for caching. It is an even integer and should | 
 |    be fairly large, 6-12, to achieve good response. This usually requires | 
 |    about 50-100MB of additional RAM on both the client and server sides. | 
 |    For example with n=6 a 1280x1024 display will use a framebuffer that | 
 |    is 1280x7168: everything below row 1024 is the pixel buffer cache. If | 
 |    you are running on low memory machines or memory is tight because of | 
 |    other running applications you should not use -ncache. | 
 |  | 
 |    The reason for so much memory is because the pixel data is not | 
 |    compressed and so the whole window to be saved must be stored | 
 |    "offscreen". E.g. for a large web browser window this can be nearly 1 | 
 |    million pixels, and that is only for a single window! One typically | 
 |    wants to cycle between 5-10 large active windows. Also because both | 
 |    backing-store (the window's actual contents) and save-unders (the | 
 |    pixels covered up by the window) are cached offscreen that introduces | 
 |    an additional factor of 2 in memory use. | 
 |  | 
 |    However, even in the smallest usage mode with n equal 2 and | 
 |    -ncache_no_rootpixmap set (this requires only 2X additional | 
 |    framebuffer memory) there is still a noticable improvement for many | 
 |    activities, although it is not as dramatic as with, say n equal 12 and | 
 |    rootpixmap (desktop background) caching enabled. | 
 |  | 
 |    The large memory consumption of the current implementation can be | 
 |    thought of as a tradeoff to providing caching and being compatible | 
 |    with all VNC viewers and also ease of implementing. Hopefully it can | 
 |    be tuned to use less, or the VNC community will extend the protocol to | 
 |    allow caching and replaying of compressed blobs of data. | 
 |  | 
 |    Another option to experiment with is "-ncache_cr". By specifying it, | 
 |    x11vnc will try to do smooth opaque window moves instead of its | 
 |    wireframe. This can give a very nice effect (note: on Unix the realvnc | 
 |    viewer seems to be smoother than the tightvnc viewer), but can lead to | 
 |    some painting problems, and can be jerky in some circumstances. | 
 |  | 
 |    Surprisingly, for very slow connections, e.g. modem, the -ncache_cr | 
 |    option can actually improve window drags. This is probably because no | 
 |    pixel data (only CopyRect instructions) are sent when dragging a | 
 |    window. Normally, the wireframe must be sent and this involves | 
 |    compressing and sending the lines that give rise to the moving box | 
 |    effect (note that real framebuffer data is sent to "erase" the white | 
 |    lines of the box.) | 
 |  | 
 |    If you experience painting errors you can can tap the Alt_L key (Left | 
 |    "Alt" key) 3 times in a row to signal x11vnc to refresh the screen to | 
 |    all viewers. You may also need to iconify and then deiconify any | 
 |    damaged windows to correct their cache data as well. Note that if you | 
 |    change color viewer depth (e.g. 8bpp to full color) dynamically that | 
 |    will usually lead to the entire extended framebuffer being resent | 
 |    which can take a long time over very slow links: it may be better to | 
 |    reconnect and reset the format right after doing so. x11vnc will try | 
 |    to detect the format change and clear (make completely black) the | 
 |    cache region. | 
 |  | 
 |    Gotcha for older Unix VNC Viewers: The older Unix VNC viewers (e.g. | 
 |    current TightVNC Unix Viewer) require X server backingstore to keep | 
 |    off-viewer screen data local. If the viewer-side X server has | 
 |    backingstore disabled (sadly, currently the default on Linux, etc), | 
 |    then to get the offscreen pixels the viewer has to ask for a refresh | 
 |    over the network, thereby defeating the caching. Use something like | 
 |    this in your viewer-side /etc/X11/xorg.conf file (or otherwise get | 
 |    your viewer-side system to do it) | 
 | Section "Device" | 
 |         ... | 
 |         Option  "backingstore" | 
 |         ... | 
 | EndSection | 
 |  | 
 |    No problems like this have been observed with Windows VNC Viewers: | 
 |    they all seem to keep their entire framebuffer in local memory. | 
 |  | 
 |    Gotcha for KDE krdc VNC Viewer: One user found that KDE's krdc viewer | 
 |    has some sort of hardwired limit on the maximum size of the | 
 |    framebuffer (64MB?). It fails quickly saying "The connection to the | 
 |    host has been interrupted." The workaround for his 1280x1024 | 
 |    x11vnc-side display was to run with "-ncache 10", i.e. a smaller value | 
 |    to be under the krdc threshold. | 
 |  | 
 |    Although this scheme is not as quick (nor as compressed) as | 
 |    nx/nomachine, say, it does provide a good step in the direction of | 
 |    improving VNC performance by client side caching. | 
 |  | 
 |  | 
 |    Q-80: Does x11vnc support TurboVNC? | 
 |  | 
 |    As of Feb/2009 (development tarball) there is an experimental kludge | 
 |    to let you build x11vnc using TurboVNC's modified TightVNC encoding. | 
 |    TurboVNC is part of the VirtualGL project. It does two main things to | 
 |    speed up the TightVNC encoding: | 
 |      * It eliminates bottlenecks, overheads, wait-times in the TightVNC | 
 |        encoding implementation and instead only worries about sending | 
 |        very well (and quickly) compressed JPEG data. | 
 |      * A fast proprietary JPEG implemention is used (Intel IPP on x86) | 
 |        instead of the usual libjpeg implementation. TurboJPEG is an | 
 |        interface library, libturbojpeg, provided by the project that | 
 |        achieves this. | 
 |  | 
 |    TurboVNC works very well over LAN and evidently fast Broadband too. | 
 |    When using it with x11vnc in such a situation you may want to dial | 
 |    down the delays, e.g. "-wait 5" and "-defer 5" (or even a smaller | 
 |    setting) to poll and pump things out more quickly. | 
 |  | 
 |    See the instructions in "x11vnc/misc/turbovnc/README" for how to build | 
 |    x11vnc with TurboVNC support. You will also need to download the | 
 |    TurboJPEG software. | 
 |  | 
 |    In brief, the steps look like this: | 
 |   cd x11vnc-x.y.z/x11vnc/misc/turbovnc | 
 |   ./apply_turbovnc | 
 |   cd ../../.. | 
 |   env LDFLAGS='-L/DIR -Xlinker --rpath=/DIR' ./configure | 
 |   make AM_LDFLAGS='-lturbojpeg' | 
 |  | 
 |    where you replace "/DIR" with the directory containing libturbojpeg.so | 
 |    you downloaded separately. If it works out well enough TurboVNC | 
 |    support will be integrated into x11vnc and more of its tuning features | 
 |    will be implemented. Support for TurboVNC in SSVNC viewer has been | 
 |    added as an experiment as well. If you try either one, let us know how | 
 |    it went. | 
 |  | 
 |    There also may be some Linux.i686 and Darwin.i386 x11vnc binaries with | 
 |    TurboVNC support in the misc. bins directory. For other platforms you | 
 |    will need to compile yourself. | 
 |  | 
 |    On relatively cheap and old hardware (Althon64 X2 5000+ / GeForce | 
 |    6200) x11vnc and SSVNC, both TurboVNC enabled, were able to sustain | 
 |    13.5 frames/sec (fps) and 15 Megapixels/sec using the VirtualGL | 
 |    supplied OpenGL benchmark program glxspheres. VirtualGL on higher-end | 
 |    hardware can sustain 20-30 fps with the glxspheres benchmark. | 
 |  | 
 |    Potential Slowdown: As we describe elsewhere, unless you use x11vnc | 
 |    with an X server using, say, NVidia proprietary drivers (or a virtual | 
 |    X server like Xvfb or Xdummy, or in ShadowFB mode), then the read rate | 
 |    from the graphics card can be rather slow (e.g. 10 MB/sec) and becomes | 
 |    the bottleneck when using x11vnc over fast networks. Note that all of | 
 |    Xorg's drivers currently (2009) have slow read rates (only proprietary | 
 |    drivers appear to have optimized reads.) | 
 |  | 
 |    So under these (more or less typical) conditions, the speed | 
 |    improvement provided by TurboVNC may only be marginal. Look for this | 
 |    output to see your read rate: | 
 |   28/02/2009 11:11:07 Autoprobing TCP port | 
 |   28/02/2009 11:11:07 Autoprobing selected port 5900 | 
 |   28/02/2009 11:11:08 fb read rate: 10 MB/sec | 
 |   28/02/2009 11:11:08 screen setup finished. | 
 |  | 
 |    A rate of 10 MB/sec means a 1280x1024x24 screen takes 0.5 seconds to | 
 |    read in. TurboVNC compresses that to JPEG in a much shorter time. On | 
 |    the other hand, an NVidia driver may have a read rate of 250 MB/sec | 
 |    and so only takes 0.02 seconds to read the entire screen in. | 
 |  | 
 |  | 
 |  | 
 |    [Mouse Cursor Shapes] | 
 |  | 
 |    Q-81: Why isn't the mouse cursor shape (the little icon shape where | 
 |    the mouse pointer is) correct as I move from window to window? | 
 |  | 
 |    On X servers supporting XFIXES or Solaris/IRIX Overlay extensions it | 
 |    is possible for x11vnc to do this correctly. See a few paragraphs down | 
 |    for the answer. | 
 |  | 
 |    Historically, the X11 mouse cursor shape (i.e. little picture: an | 
 |    arrow, X, I-beam, resizer, etc) is one of the few WRITE-only objects | 
 |    in X11. That is, an application can tell the X server what the cursor | 
 |    shape should be when the pointer is in a given window, but a program | 
 |    (like x11vnc) unfortunately cannot read this information. I believe | 
 |    this is because the cursor shape is often downloaded to the graphics | 
 |    hardware (video card), but I could be mistaken. | 
 |  | 
 |    A simple kludge is provided by the "-cursor X" option that changes the | 
 |    cursor when the mouse is on the root background (or any window has the | 
 |    same cursor as the root background.) Note that desktops like GNOME or | 
 |    KDE often cover up the root background, so this won't work for those | 
 |    cases. Also see the "-cursor some" option for additional kludges. | 
 |  | 
 |    Note that as of Aug/2004 on Solaris using the SUN_OVL overlay | 
 |    extension and IRIX, x11vnc can show the correct mouse cursor when the | 
 |    -overlay option is supplied. See this FAQ for more info. | 
 |  | 
 |    Also as of Dec/2004 XFIXES X extension support has been added to allow | 
 |    exact extraction of the mouse cursor shape. XFIXES fixes the problem | 
 |    of the cursor-shape being write-only: x11vnc can now query the X | 
 |    server for the current shape and send it back to the connected | 
 |    viewers. XFIXES is available on recent Linux Xorg based distros and | 
 |    Solaris 10. | 
 |  | 
 |    The only XFIXES issue is the handling of alpha channel transparency in | 
 |    cursors. If a cursor has any translucency then in general it must be | 
 |    approximated to opaque RGB values for use in VNC. There are some | 
 |    situations where the cursor transparency can also handled exactly: | 
 |    when the VNC Viewer requires the cursor shape be drawn into the VNC | 
 |    framebuffer or if you apply a patch to your VNC Viewer to extract | 
 |    hidden alpha channel data under 32bpp. Details can be found here. | 
 |  | 
 |  | 
 |    Q-82: When using XFIXES cursorshape mode, some of the cursors look | 
 |    really bad with extra black borders around the cursor and other cruft. | 
 |    How can I improve their appearance? | 
 |  | 
 |    This happens for cursors with transparency ("alpha channel"); regular | 
 |    X cursors (bitmaps) should be correct. Unfortunately x11vnc 0.7 was | 
 |    released with a very poor algorithm for approximating the | 
 |    transparency, which led to the ugly black borders. | 
 |  | 
 |    The problem is as follows: XFIXES allows x11vnc to retrieve the | 
 |    current X server cursor shape, including the alpha channel for | 
 |    transparency. For traditional bitmap cursors the alpha value will be 0 | 
 |    for completely transparent pixels and 255 for completely opaque | 
 |    pixels; whereas for modern, eye-candy cursors an alpha value between 0 | 
 |    and 255 means to blend in the background colors to that degree with | 
 |    the cursor colors. The pixel color blending formula is something like | 
 |    this: Red = Red_cursor * a + Red_background * (1 - a), (where here 0 | 
 |    =< a =< 1), with similar for Green and Blue. The VNC protocol does not | 
 |    currently support an alpha channel in cursors: it only supports | 
 |    regular X bitmap cursors and Rich Cursors that have RGB (Red, Green, | 
 |    Blue) color data, but no "A" = alpha data. So in general x11vnc has to | 
 |    approximate a cursor with transparency to create a Rich Cursor. This | 
 |    is easier said than done: some cursor themes have cursors with | 
 |    complicated drop shadows and other forms of translucency. | 
 |  | 
 |    Anyway, for the x11vnc 0.7.1 release the algorithm for approximating | 
 |    transparency is much improved and hopefully gives decent cursor shapes | 
 |    for most cursor themes and you don't have to worry about it. | 
 |  | 
 |    In case it still looks bad for your cursor theme, there are (of | 
 |    course!) some tunable parameters. The "-alphacut n" option lets you | 
 |    set the threshold "n" (between 0 and 255): cursor pixels with alpha | 
 |    values below n will be considered completely transparent while values | 
 |    equal to or above n will be completely opaque. The default is 240. The | 
 |    "-alphafrac f" option tries to correct individual cursors that did not | 
 |    fare well with the default -alphacut value: if a cursor has less than | 
 |    fraction f (between 0.0 and 1.0) of its pixels selected by the default | 
 |    -alphacut, the threshold is lowered until f of its pixels are | 
 |    selected. The default fraction is 0.33. | 
 |  | 
 |    Finally, there is an option -alpharemove that is useful for themes | 
 |    where many cursors are light colored (e.g. "whiteglass".) XFIXES | 
 |    returns the cursor data with the RGB values pre-multiplied by the | 
 |    alpha value. If the white cursors look too grey, specify -alpharemove | 
 |    to brighten them by having x11vnc divide out the alpha value. | 
 |  | 
 |    One user played with these parameters and reported back: | 
 |  Of the cursor themes present on my system: | 
 |  | 
 |    gentoo and gentoo-blue:   alphacut:192 - noalpharemove | 
 |  | 
 |    gentoo-silver:            alphacut:127 and alpharemove | 
 |  | 
 |    whiteglass and redglass (presumably also handhelds, which is based | 
 |    heavily on redglass) look fine with the apparent default of alphacut:255. | 
 |  | 
 |  | 
 |    Q-83: In XFIXES mode, are there any hacks to handle cursor | 
 |    transparency ("alpha channel") exactly? | 
 |  | 
 |    As of Jan/2005 libvncserver has been modified to allow an alpha | 
 |    channel (i.e. RGBA data) for Rich Cursors. So x11vnc can now send the | 
 |    alpha channel data to libvncserver. However, this data will only be | 
 |    used for VNC clients that do not support the CursorShapeUpdates VNC | 
 |    extension (or have disabled it.) It can be disabled for all clients | 
 |    with the -nocursorshape x11vnc option. In this case the cursor is | 
 |    drawn, correctly blended with the background, into the VNC framebuffer | 
 |    before being sent out to the client. So the alpha blending is done on | 
 |    the x11vnc side. Use the -noalphablend option to disable this behavior | 
 |    (always approximate transparent cursors with opaque RGB values.) | 
 |  | 
 |    The CursorShapeUpdates VNC extension complicates matters because the | 
 |    cursor shape is sent to the VNC viewers supporting it, and the viewers | 
 |    draw the cursor locally. This improves response over slow links. Alpha | 
 |    channel data for these locally drawn cursors is not supported by the | 
 |    VNC protocol. | 
 |  | 
 |    However, in the libvncserver CVS there is a patch to the TightVNC | 
 |    viewer to make this work for CursorShapeUpdates under some | 
 |    circumstances. This hack is outside of the VNC protocol. It requires | 
 |    the screens on both sides to be depth 24 at 32bpp (it uses the extra 8 | 
 |    bits to secretly hide the cursor alpha channel data.) Not only does it | 
 |    require depth 24 at 32bpp, but it also currently requires the client | 
 |    and server to be of the same endianness (otherwise the hidden alpha | 
 |    data gets reset to zero by a libvncserver translation function; we can | 
 |    fix this at some point if there is interest.) The patch is for the | 
 |    TightVNC 1.3dev5 Unix vncviewer and it enables the TightVNC viewer to | 
 |    do the cursor alpha blending locally. The patch code should give an | 
 |    example on how to change the Windows TightVNC viewer to achieve the | 
 |    same thing (send me the patch if you get that working.) | 
 |  | 
 |    This patch is applied to the Enhanced TightVNC Viewer (SSVNC) package | 
 |    we provide. | 
 |  | 
 |    [Mouse Pointer] | 
 |  | 
 |    Q-84: Why does the mouse arrow just stay in one corner in my | 
 |    vncviewer, whereas my cursor (that does move) is just a dot? | 
 |  | 
 |    This default takes advantage of a tightvnc extension | 
 |    (CursorShapeUpdates) that allows specifying a cursor image shape for | 
 |    the local VNC viewer. You may disable it with the -nocursor option to | 
 |    x11vnc if your viewer does not have this extension. | 
 |  | 
 |    Note: as of Aug/2004 this should be fixed: the default for | 
 |    non-tightvnc viewers (or ones that do not support CursorShapeUpdates) | 
 |    will be to draw the moving cursor into the x11vnc framebuffer. This | 
 |    can also be disabled via -nocursor. | 
 |  | 
 |  | 
 |    Q-85: Can I take advantage of the TightVNC extension to the VNC | 
 |    protocol where Cursor Positions Updates are sent back to all connected | 
 |    clients (i.e. passive viewers can see the mouse cursor being moved | 
 |    around by another viewer)? | 
 |  | 
 |    Use the -cursorpos option when starting x11vnc. A VNC viewer must | 
 |    support the Cursor Positions Updates for the user to see the mouse | 
 |    motions (the TightVNC viewers support this.) As of Aug/2004 -cursorpos | 
 |    is the default. See also -nocursorpos and -nocursorshape. | 
 |  | 
 |  | 
 |    Q-86: Is it possible to swap the mouse buttons (e.g. left-handed | 
 |    operation), or arbitrarily remap them? How about mapping button clicks | 
 |    to keystrokes, e.g. to partially emulate Mouse wheel scrolling? | 
 |  | 
 |    You can remap the mouse buttons via something like: -buttonmap 13-31 | 
 |    (or perhaps 12-21.) Also, note that xmodmap(1) lets you directly | 
 |    adjust the X server's button mappings, but in some circumstances it | 
 |    might be more desirable to have x11vnc do it. | 
 |  | 
 |    One user had an X server with only one mouse button(!) and was able to | 
 |    map all of the VNC client mouse buttons to it via: -buttonmap 123-111. | 
 |  | 
 |    Note that the -debug_pointer option prints out much info for every | 
 |    mouse/pointer event and is handy in solving problems. | 
 |  | 
 |    To map mouse button clicks to keystrokes you can use the alternate | 
 |    format where the keystrokes are enclosed between colons like this | 
 |    :<KeySym>: in place of the mouse button digit. For a sequence of | 
 |    keysyms separate them with "+" signs. Look in the include file | 
 |    <X11/keysymdef.h>, or use xev(1), or -debug_keyboard to find the | 
 |    keysym names. Button clicks can also be included in the sequence via | 
 |    the fake keysyms Button1, etc. | 
 |  | 
 |    As an example, suppose the VNC viewer machine has a mouse wheel (these | 
 |    generate button 4 and 5 events), but the machine that x11vnc is run on | 
 |    only has the 3 regular buttons. In normal operation x11vnc will | 
 |    discard the button 4 and 5 events. However, either of the following | 
 |    button maps could possibly be of use emulating the mouse wheel events | 
 |    in this case: | 
 |   -buttonmap 12345-123:Prior::Next: | 
 |   -buttonmap 12345-123:Up+Up+Up::Down+Down+Down: | 
 |  | 
 |    Exactly what keystroke "scrolling" events they should be bound to | 
 |    depends on one's taste. If this method is too approximate, one could | 
 |    consider not using -buttonmap but rather configuring the X server to | 
 |    think it has a mouse with 5 buttons even though the physical mouse | 
 |    does not. (e.g. 'Option "ZAxisMapping" "4 5"'.) | 
 |  | 
 |    Note that when a keysym-mapped mouse button is clicked down this | 
 |    immediately generates the key-press and key-release events (for each | 
 |    keysym in turn if the mapping has a sequence of keysyms.) When the | 
 |    mouse button goes back up nothing is generated. | 
 |  | 
 |    If you include modifier keys like Shift_L instead of key-press | 
 |    immediately followed by key-release the state of the modifier key is | 
 |    toggled (however the initial state of the modifier key is ignored.) So | 
 |    to map the right button to type my name 'Karl Runge' I could use this: | 
 |   -buttonmap 3-:Shift_L+k+Shift_L+a+r+l+space+Shift_L+r+Shift_L+u+n+g+e: | 
 |  | 
 |    (yes, this is getting a little silly.) | 
 |  | 
 |    BTW, Coming the other way around, if the machine you are sitting at | 
 |    does not have a mouse wheel, but the remote machine does (or at least | 
 |    has 5 buttons configured), this key remapping can be useful: | 
 |   -remap Super_R-Button4,Menu-Button5 | 
 |  | 
 |    you just tap those two keys to get the mouse wheel scrolls (this is | 
 |    more useful than the Up and Down arrow keys because a mouse wheel | 
 |    "click" usually gives a multi-line scroll.) | 
 |    [Keyboard Issues] | 
 |  | 
 |    Q-87: How can I get my AltGr and Shift modifiers to work between | 
 |    keyboards for different languages? | 
 |  | 
 |    The option -modtweak should help here. It is a mode that monitors the | 
 |    state of the Shift and AltGr Modifiers and tries to deduce the correct | 
 |    keycode to send, possibly by sending fake modifier key presses and | 
 |    releases in addition to the actual keystroke. | 
 |  | 
 |    Update:  As of Jul/2004 -modtweak is now the default (use -nomodtweak | 
 |    to get the old behavior.) This was done because it was noticed on | 
 |    newer XFree86 setups even on bland "us" keyboards like "pc104 us" | 
 |    XFree86 included a "ghost" key with both "<" and ">" it. This key does | 
 |    not exist on the keyboard (see this FAQ for more info.) Without | 
 |    -modtweak there was then an ambiguity in the reverse map keysym => | 
 |    keycode, making it so the "<" symbol could not be typed. | 
 |  | 
 |    Also see the FAQ about the -xkb option for a more powerful method of | 
 |    modifier tweaking for use on X servers with the XKEYBOARD extension. | 
 |  | 
 |    When trying to resolve keyboard mapping problems, note that the | 
 |    -debug_keyboard option prints out much info for every keystroke and so | 
 |    can be useful debugging things. | 
 |  | 
 |    Note that one user had a strange setup and none of the above helped. | 
 |    His solution was to disable all of the above and use -nomodtweak. This | 
 |    is the simplest form of keystroke insertion and it actually solved the | 
 |    problem. Try it if the other options don't help. | 
 |  | 
 |  | 
 |    Q-88: When I try to type a "<" (i.e. less than) instead I get ">" | 
 |    (i.e. greater than)! Strangely, typing ">" works OK!! | 
 |  | 
 |    Does your keyboard have a single key with both "<" and ">" on it? Even | 
 |    if it doesn't, your X server may think your keyboard has such a key | 
 |    (e.g. pc105 in the XF86Config file when it should be something else, | 
 |    say pc104.) | 
 |  | 
 |    Short Cut: Try the -xkb or -sloppy_keys options and see if that helps | 
 |    the situation. The discussion below is a bit outdated (e.g. -modtweak | 
 |    is now the default) but it is useful reference for various tricks and | 
 |    so is kept. | 
 |  | 
 |  | 
 |    The problem here is that on the Xserver where x11vnc is run there are | 
 |    two keycodes that correspond to the "<" keysym. Run something like | 
 |    this to see: | 
 |  | 
 |   xmodmap -pk | egrep -i 'KeyCode|less|greater' | 
 |   There are 4 KeySyms per KeyCode; KeyCodes range from 8 to 255. | 
 |       KeyCode     Keysym (Keysym) ... | 
 |        59         0x002c (comma)  0x003c (less) | 
 |        60         0x002e (period) 0x003e (greater) | 
 |        94         0x003c (less)   0x003e (greater) | 
 |  | 
 |    That keycode 94 is the special key with both "<" and ">". When x11vnc | 
 |    receives the "<" keysym over the wire from the remote VNC client, it | 
 |    unfortunately maps it to keycode 94 instead of 59, and sends 94 to the | 
 |    X server. Since Shift is down (i.e. you are Shifting the comma key), | 
 |    the X server interprets this as Shifted-94, which is ">". | 
 |  | 
 |    A workaround in the X server configuration is to "deaden" that special | 
 |    key: | 
 |  | 
 |   xmodmap -e "keycode 94 = " | 
 |  | 
 |    However, one user said he had to do this: | 
 |  | 
 |   xmodmap -e "keycode 94 = 0x002c 0x003c" | 
 |  | 
 |    (If the numerical values are different for your setup, substitute the | 
 |    ones that correspond to your display. The above xmodmap scheme can | 
 |    often be used to work around other ambiguous keysym to keycode | 
 |    mappings.) | 
 |  | 
 |    Alternatively, here are some x11vnc options to try to work around the | 
 |    problem: | 
 |    -modtweak | 
 |  | 
 |    and | 
 |    -remap less-comma | 
 |  | 
 |    These are convenient in that they do not modify the actual X server | 
 |    settings. The former (-modtweak) is a mode that monitors the state of | 
 |    the Shift and AltGr modifiers and tries to deduce the correct keycode | 
 |    sequence to send. Since Jul/2004 -modtweak is now the default. The | 
 |    latter (-remap less-comma) is an immediate remapping of the keysym | 
 |    less to the keysym comma when it comes in from a client (so when Shift | 
 |    is down the comma press will yield "<".) | 
 |  | 
 |    See also the FAQ about the -xkb option as a possible workaround using | 
 |    the XKEYBOARD extension. | 
 |  | 
 |    Note that the -debug_keyboard option prints out much info for every | 
 |    keystroke to aid debugging keyboard problems. | 
 |  | 
 |  | 
 |    Q-89: Extra Character Inserted, E.g.: When I try to type a "<" (i.e. | 
 |    less than) instead I get "<," (i.e. an extra comma.) | 
 |  | 
 |    This is likely because you press "Shift" then "<" but then released | 
 |    the Shift key before releasing the "<". Because of a keymapping | 
 |    ambiguity the last event "< up" is interpreted as "," because that key | 
 |    unshifted is the comma. | 
 |  | 
 |    This extra character insertion will happen for other combinations of | 
 |    characters: in general it can happen whenever the Shift key is | 
 |    released early. | 
 |  | 
 |    This should not happen in -xkb mode, because it works hard to resolve | 
 |    the ambiguities. If you do not want to use -xkb, try the option | 
 |    -sloppy_keys to attempt a similar type of algorithm. | 
 |  | 
 |    One user had this problem for Italian and German keyboards with the | 
 |    key containing ":" and "." When he typed ":" he would get an extra "." | 
 |    inserted after the ":". The solution was -sloppy_keys. | 
 |  | 
 |  | 
 |    Q-90: I'm using an "international" keyboard (e.g. German "de", or | 
 |    Danish "dk") and the -modtweak mode works well if the VNC viewer is | 
 |    run on a Unix/Linux machine with a similar keyboard.   But if I run | 
 |    the VNC viewer on Unix/Linux with a different keyboard (e.g. "us") or | 
 |    Windows with any keyboard, I can't type some keys like:   "@", "$", | 
 |    "<", ">", etc. How can I fix this? | 
 |  | 
 |    The problem with Windows is it does not seem to handle AltGr well. It | 
 |    seems to fake it up by sending Control_L+Alt_R to applications. The | 
 |    Windows VNC viewer sends those two down keystrokes out on the wire to | 
 |    the VNC server, but when the user types the next key to get, e.g., "@" | 
 |    the Windows VNC viewer sends events bringing the up the | 
 |    Control_L+Alt_R keys, and then sends the "@" keysym by itself. | 
 |  | 
 |    The Unix/Linux VNC viewer on a "us" keyboard does a similar thing | 
 |    since "@" is the Shift of the "2" key. The keysyms Shift and "@" are | 
 |    sent to the VNC server. | 
 |  | 
 |    In both cases no AltGr is sent to the VNC server, but we know AltGr is | 
 |    needed on the physical international keyboard to type a "@". | 
 |  | 
 |    This all worked fine with x11vnc running with the -modtweak option (it | 
 |    figures out how to adjust the Modifier keys (Shift or AltGr) to get | 
 |    the "@".) However it fails under recent versions of XFree86 (and the | 
 |    X.org fork.) These run the XKEYBOARD extension by default and make | 
 |    heavy use of it to handle international keyboards. | 
 |  | 
 |    To make a long story short, on these newer XFree86 setups the | 
 |    traditional X keymap lookup x11vnc uses is no longer accurate. x11vnc | 
 |    can't find the keysym "@" anywhere in the keymapping! (even though it | 
 |    is in the XKEYBOARD extended keymapping.) | 
 |  | 
 |    How to Solve: As of Jul/2004 x11vnc has two changes: | 
 |      * -modtweak (tweak Modifier keys) is now the default (use | 
 |        -nomodtweak to go back to the old way) | 
 |      * there is a new option -xkb to use the XKEYBOARD extension API to | 
 |        do the Modifier key tweaking. | 
 |  | 
 |    The -xkb option seems to fix all of the missing keys: "@", "<", ">", | 
 |    etc.: it is recommended that you try it if you have this sort of | 
 |    problem. Let us know if there are any remaining problems (see the next | 
 |    paragraph for some known problems.) If you specify the -debug_keyboard | 
 |    (aka -dk) option twice you will get a huge amount of keystroke | 
 |    debugging output (send it along with any problems you report.) | 
 |  | 
 |    Update: as of Jun/2005 x11vnc will try to automatically enable -xkb if | 
 |    it appears that would be beneficial (e.g. if it sees any of "@", "<", | 
 |    ">", "[" and similar keys are mapped in a way that needs the -xkb to | 
 |    access them.) To disable this automatic check use -noxkb. | 
 |  | 
 |    Known problems: | 
 |      * One user had to disable a "ghost" Mode_switch key that was causing | 
 |        problems under -xkb. His physical AltGr key was bound to | 
 |        ISO_Level3_Shift (which seems to be the XKEYBOARD way of doing | 
 |        things), while there was a ghost key Mode_switch (which seems to | 
 |        be obsolete) in the mapping as well. Both of these keysyms were | 
 |        bound to Mod5 and x11vnc was unfortunately choosing Mode_switch. | 
 |        From the x11vnc -xkb -dk -dk output it was noted that Mode_switch | 
 |        was attached to keycode 93 (no physical key generates this | 
 |        keycode) while ISO_Level3_Shift was attached to keycode 113. The | 
 |        keycode skipping option was used to disable the ghost key: | 
 |        -skip_keycodes 93 | 
 |      * In implementing -xkb we noticed that some characters were still | 
 |        not getting through, e.g. "~" and "^". This is not really an | 
 |        XKEYBOARD problem. What was happening was the VNC viewer was | 
 |        sending the keysyms asciitilde and asciicircum to x11vnc, but on | 
 |        the X server with the international keyboard those keysyms were | 
 |        not mapped to any keys. So x11vnc had to skip them (Note: as of | 
 |        May/2005 they are added by default see -add_keysyms below.) | 
 |        The way these characters are typically entered on international | 
 |        keyboards is by "dead" (aka "mute") keys. E.g. to enter "~" at the | 
 |        physical display the keysym dead_tilde is pressed and released | 
 |        (this usually involves holding AltGr down while another key is | 
 |        pressed) and then space is pressed. (this can also be used get | 
 |        characters with the "~" symbol on top, e.g. "ã" by typing "a" | 
 |        instead of space.) | 
 |        What to do? In general the VNC protocol has not really solved this | 
 |        problem: what should be done if the VNC viewer sends a keysym not | 
 |        recognized by the VNC server side? Workarounds can possibly be | 
 |        created using the -remap x11vnc option: | 
 |   -remap asciitilde-dead_tilde,asciicircum-dead_circumflex | 
 |        etc. Use -remap filename if the list is long. Please send us your | 
 |        workarounds for this problem on your keyboard. Perhaps we can have | 
 |        x11vnc adjust automatically at some point. Also see the | 
 |        -add_keysyms option in the next paragraph. | 
 |        Update: for convenience "-remap DEAD" does many of these mappings | 
 |        at once. | 
 |      * To complement the above workaround using the -remap, an option | 
 |        -add_keysyms was added. This option instructs x11vnc to bind any | 
 |        unknown Keysyms coming in from VNC viewers to unused Keycodes in | 
 |        the X server. This modifies the global state of the X server. When | 
 |        x11vnc exits it removes the extra keymappings it created. Note | 
 |        that the -remap mappings are applied first, right when the Keysym | 
 |        is received from a VNC viewer, and only after that would | 
 |        -add_keysyms, or anything else, come into play. | 
 |        Update: -add_keysyms is now on by default. Use -noadd_keysyms to | 
 |        disable. | 
 |  | 
 |  | 
 |    Q-91: When typing I sometimes get double, triple, or more of my | 
 |    keystrokes repeated. I'm sure I only typed them once, what can I do? | 
 |  | 
 |    This may be due to an interplay between your X server's key autorepeat | 
 |    delay and the extra time delays caused by x11vnc processing. | 
 |  | 
 |    Short answer: disable key autorepeating by running the command "xset r | 
 |    off" on the Xserver where x11vnc is run (restore via "xset r on") or | 
 |    use the new (Jul/2004) -norepeat x11vnc option. You will still have | 
 |    autorepeating because that is taken care of on your VNC viewer side. | 
 |  | 
 |    Update: as of Dec/2004 -norepeat is now the default. Use -repeat to | 
 |    disable it. | 
 |  | 
 |    Details: | 
 |    suppose you press a key DOWN and it generates changes in large regions | 
 |    of the screen. The CPU and I/O work x11vnc does for the large screen | 
 |    change could be longer than your X server's key autorepeat delay. | 
 |    x11vnc may not get to processing the key UP event until after the | 
 |    screen work is completed. The X server believes the key has been held | 
 |    down all this time, and applies its autorepeat rules. | 
 |  | 
 |    Even without inducing changes in large regions of the screen, this | 
 |    problem could arise when accessing x11vnc via a dialup modem or | 
 |    otherwise high latency link (e.g. > 250 ms latency.) | 
 |  | 
 |    Look at the output of "xset q" for the "auto repeat delay" setting. Is | 
 |    it low (e.g. < 300 ms)? If you turn off autorepeat completely: "xset r | 
 |    off", does the problem go away? | 
 |  | 
 |    The workaround is to manually apply "xset r off" and "xset r on" as | 
 |    needed, or to use the -norepeat (which has since Dec/2004 been made | 
 |    the default.) Note that with X server autorepeat turned off the VNC | 
 |    viewer side of the connection will (nearly always) do its own | 
 |    autorepeating so there is no big loss here, unless someone is also | 
 |    working at the physical display and misses his autorepeating. | 
 |  | 
 |  | 
 |    Q-92: The x11vnc -norepeat mode is in effect, but I still get repeated | 
 |    keystrokes!! | 
 |  | 
 |    Are you using x11vnc to log in to an X session via display manager? | 
 |    (as described in this FAQ) If so, x11vnc is starting before your | 
 |    session and it disables autorepeat when you connect, but then after | 
 |    you log in your session startup (GNOME, KDE, ...) could be resetting | 
 |    the autorepeat to be on. Or it could be something inside your desktop | 
 |    trying to be helpful that decides to turn it back on. | 
 |  | 
 |    x11vnc in -norepeat mode will by default reset autorepeat to off 2 | 
 |    times (to help get thru the session startup problem), but it will not | 
 |    continue to battle with things turning autorepeat back on. It will | 
 |    also turn autorepeat off whenever it goes from a state of zero clients | 
 |    to one client. You can adjust the number of resets via "-norepeat N", | 
 |    or use "-norepeat -1" to have it keep resetting it whenever autorepeat | 
 |    gets turned back on when clients are connected. | 
 |  | 
 |    In general you can manually turn autorepeating off by typing "xset r | 
 |    off", or a using desktop utility/menu, or "x11vnc -R norepeat". If | 
 |    something in your desktop is automatically turning it back on you | 
 |    should figure out how to disable that somehow. | 
 |  | 
 |  | 
 |    Q-93: After using x11vnc for a while, I find that I cannot type some | 
 |    (or any) characters or my mouse clicks and drags no longer have any | 
 |    effect, or they lead to strange effects. What happened? | 
 |  | 
 |    Probably a modifier key, e.g. Control or Alt is "stuck" in a pressed | 
 |    down state. | 
 |  | 
 |    This happens for VNC in general by the following mechanism. Suppose on | 
 |    the Viewer side desktop there is some hot-key to switch | 
 |    desktops/rooms/spaces, etc. E.g. suppose Alt+LeftArrow moves to the | 
 |    left desktop/room/space. Or suppose an Alt+hotkey combination | 
 |    iconifies a window. This can leave the Alt key pressed down on the | 
 |    remote side. | 
 |  | 
 |    Consider the sequence that happens. The Alt_L key and then the | 
 |    LeftArrow key go down. Since you are inside the viewer the Alt_L key | 
 |    press is sent to the other side (x11vnc) and so it is pressed down in | 
 |    the remote desktop as well. (by "Alt_L" we mean the Alt key on the | 
 |    left-hand side of the keyboard.) Your local desktop (where the VNC | 
 |    Viewer is running) then warps to the new desktop/room/space: Leaving | 
 |    the Alt_L key still pressed down in the remote desktop. | 
 |  | 
 |    If someone is sitting at the desktop, or when you return in the viewer | 
 |    it may be very confusing because the Alt_L is still pressed down but | 
 |    you (or the person sitting at the desktop) do not realize this. | 
 |    Depending on which remote desktop (x11vnc side) is used, it can act | 
 |    very strangely. | 
 |  | 
 |    A quick workaround when you notice this is to press and release all of | 
 |    the Alt, Shift, Control, Windows-Flag, modifier keys to free the | 
 |    pressed one. You need to do this for both the left and right Shift, | 
 |    Alt, Control, etc. keys to be sure. | 
 |  | 
 |    Note that many VNC Viewers try to guard against this when they are | 
 |    notified by the window system that the viewer app has "lost focus". | 
 |    When it receives the "lost focus" event, the viewer sends VNC | 
 |    Key-Release events for all modifier keys that are currently pressed | 
 |    down. This does not always work, however, since it depends on how the | 
 |    desktop manages these "warps". If the viewer is not notified it cannot | 
 |    know it needs to release the modifiers. | 
 |  | 
 |    You can also use the -clear_mods option to try to clear all of the | 
 |    modifier keys at x11vnc startup. You will still have to be careful | 
 |    that you do not leave the modifier key pressed down during your | 
 |    session. It is difficult to prevent this problem from occurring (short | 
 |    of using -remap to prevent sending all of the problem modifier keys, | 
 |    which would make the destkop pretty unusable.) | 
 |  | 
 |    During a session these x11vnc remote control commands can also help: | 
 |    x11vnc -R clear_mods | 
 |    x11vnc -R clear_keys | 
 |    x11vnc -R clear_locks | 
 |    x11vnc -R clear_all | 
 |  | 
 |    A similar problem can occur if you accidentally press the Caps_Lock or | 
 |    Num_Lock down. When these are locked on the remote side it can | 
 |    sometimes lead to strange desktop behavior (e.g. cannot drag or click | 
 |    on windows.) As above you may not notice this because the lock isn't | 
 |    down on the local (Viewer) side. See this FAQ on lock keys problem. | 
 |    These options may help avoid the problem: -skip_lockkeys and | 
 |    -capslock. See also -clear_all. | 
 |  | 
 |  | 
 |    Q-94: The machine where I run x11vnc has an AltGr key, but the local | 
 |    machine where I run the VNC viewer does not. Is there a way I can map | 
 |    a local unused key to send an AltGr? How about a Compose key as well? | 
 |  | 
 |    Something like "-remap Super_R-Mode_switch" x11vnc option may work. | 
 |    Note that Super_R is the "Right Windoze(tm) Flaggie" key; you may want | 
 |    to choose another. The -debug_keyboard option comes in handy in | 
 |    finding keysym names (so does xev(1).) | 
 |  | 
 |    For Compose how about "-remap Menu-Multi_key" (note that Multi_key is | 
 |    the official name for Compose.) To do both at the same time: "-remap | 
 |    Super_R-Mode_switch,Menu-Multi_key" or use "-remap filename" to | 
 |    specify remappings from a file. | 
 |  | 
 |  | 
 |    Q-95: I have a Sun machine I run x11vnc on. Its Sun keyboard has just | 
 |    one Alt key labelled "Alt" and two Meta keys labelled with little | 
 |    diamonds. The machine where I run the VNC viewer only has Alt keys. | 
 |    How can I send a Meta keypress? (e.g. emacs needs this) | 
 |  | 
 |    Here are a couple ideas. The first one is to simply use xmodmap(1) to | 
 |    adjust the Sun X server. Perhaps xmodmap -e "keysym Alt_L = Meta_L | 
 |    Alt_L" will do the trick. (there are other ways to do it, one user | 
 |    used: xmodmap -e "keycode 26 = Meta_L" for his setup.) | 
 |  | 
 |    Since xmodmap(1) modifies the X server mappings you may not want to do | 
 |    this (because it affects local work on that machine.) Something like | 
 |    the -remap Alt_L-Meta_L to x11vnc may be sufficient for ones needs, | 
 |    and does not modify the X server environment. Note that you cannot | 
 |    send Alt_L in this case, maybe -remap Super_L-Meta_L would be a better | 
 |    choice if the Super_L key is typically unused in Unix. | 
 |  | 
 |  | 
 |    Q-96: Running x11vnc on HP-UX I cannot type "#" I just get a "3" | 
 |    instead. | 
 |  | 
 |    One user reports this problem on HP-UX Rel_B.11.23. The problem was | 
 |    traced to a strange keyboard mapping for the machine (e.g. xmodmap -pk | 
 |    output) that looked like: | 
 |   ... | 
 |   039  2                  at                 at               at | 
 |   ... | 
 |   047  3                  numbersign         numbersign       numbersign | 
 |  | 
 |    and similar triple mappings (with two in the AltGr/Mode_switch group) | 
 |    of a keysum to a single keycode. | 
 |  | 
 |    Use the -nomodtweak option as a workaround. You can also use xmodmap | 
 |    to correct these mappings in the server, e.g.: | 
 |   xmodmap -e "keycode 47 = 3 numbersign" | 
 |  | 
 |    Also, as of Feb/2007, set the environment variable MODTWEAK_LOWEST=1 | 
 |    (either in your shell or via "-env MODTWEAK_LOWEST=1" option) to | 
 |    handle these mappings better. | 
 |  | 
 |  | 
 |    Q-97: Can I map a keystroke to a mouse button click on the remote | 
 |    machine? | 
 |  | 
 |    This can be done directly in some X servers using AccessX and | 
 |    Pointer_EnableKeys, but is a bit awkward. It may be more convenient to | 
 |    have x11vnc do the remapping. This can be done via the -remap option | 
 |    using the fake "keysyms" Button1, Button2, etc. as the "to" keys (i.e. | 
 |    the ones after the "-") | 
 |  | 
 |    As an example, consider a laptop where the VNC viewer is run that has | 
 |    a touchpad with only two buttons. It is difficult to do a middle | 
 |    button "paste" because (using XFree86/Xorg Emulate3Buttons) you have | 
 |    to click both buttons on the touch pad at the same time. This | 
 |    remapping: | 
 |   -remap Super_R-Button2 | 
 |  | 
 |    maps the Super_R "flag" key press to the Button2 click, thereby making | 
 |    X pasting a bit easier. | 
 |  | 
 |    Note that once the key goes down, the button down and button up events | 
 |    are generated immediately on the x11vnc side. When the key is released | 
 |    (i.e. goes up) no events are generated. | 
 |  | 
 |    Q-98: How can I get Caps_Lock to work between my VNC viewer and | 
 |    x11vnc? | 
 |  | 
 |    This is a little tricky because it is possible to get the Caps_Lock | 
 |    state out of sync between your viewer-side machine and the x11vnc-side | 
 |    X server. For best results, we recommend not ever letting the | 
 |    Caps_Lock keypresses be processed by x11vnc. That way when you press | 
 |    Caps_Lock in the viewer your local machine goes into the Caps_Lock on | 
 |    state and sends keysym "A" say when you press "a". x11vnc will then | 
 |    fake things up so that Shift is held down to generate "A". The | 
 |    -skip_lockkeys option should help to accomplish this. For finer grain | 
 |    control use something like: "-remap Caps_Lock-None". | 
 |  | 
 |    Also try the -nomodtweak and -capslock options. | 
 |  | 
 |    Another useful option that turns off any Lock keys on the remote side | 
 |    at startup and end is the -clear_all option. During a session you can | 
 |    run these remote control commands to modify the Lock keys: | 
 |    x11vnc -R clear_locks | 
 |    x11vnc -R clear_all | 
 |  | 
 |    the former will try to unset any Lock keys, the latter will do same | 
 |    and also try to make it so no key is pressed down (e.g. "stuck" Alt_L, | 
 |    etc.) | 
 |    [Screen Related Issues and Features] | 
 |  | 
 |    Q-99: The remote display is larger (in number of pixels) than the | 
 |    local display I am running the vncviewer on. I don't like the | 
 |    vncviewer scrollbars, what I can do? | 
 |  | 
 |    vncviewer has a option (usually accessible via F8 key or -fullscreen | 
 |    option) for vncviewer to run in full screen, where it will | 
 |    automatically scroll when the mouse is near the edge of the current | 
 |    view. For quick scrolling, also make sure Backing Store is enabled on | 
 |    the machine vncviewer is run on. (XFree86/Xorg disables it by default | 
 |    for some reason, add Option "backingstore" to XF86Config on the | 
 |    vncviewer side.) | 
 |  | 
 |    BTW, contact me if you are having problems with vncviewer in | 
 |    fullscreen mode with your window manager (i.e. no keyboard response.) | 
 |    I have a workaround for vncviewer using XGrabServer(). | 
 |  | 
 |    There may also be scaling viewers out there (e.g. TightVNC or UltraVNC | 
 |    on Windows) that automatically shrink or expand the remote framebuffer | 
 |    to fit the local display. Especially for hand-held devices. See also | 
 |    the next FAQ on x11vnc scaling. | 
 |  | 
 |  | 
 |    Q-100: Does x11vnc support server-side framebuffer scaling? (E.g. to | 
 |    make the desktop smaller.) | 
 |  | 
 |    As of Jun/2004 x11vnc provides basic server-side scaling. It is a | 
 |    global scaling of the desktop, not a per-client setting. To enable it | 
 |    use the "-scale fraction" option. "fraction" can either be a floating | 
 |    point number (e.g. -scale 0.75) or the alternative m/n fraction | 
 |    notation (e.g. -scale 3/4.) Note that if fraction is greater than one | 
 |    the display is magnified. | 
 |  | 
 |    Extra resources (CPU, memory I/O, and memory) are required to do the | 
 |    scaling. If the machine is slow where x11vnc is run with scaling | 
 |    enabled, the interactive response can be unacceptable. OTOH, if run | 
 |    with scaling on a fast machine the performance degradation is usually | 
 |    not a big issue or even noticeable. | 
 |  | 
 |    It may help to compile x11vnc with compiler option -O3 or -O4 to speed | 
 |    up the scaling code. Set the CFLAGS env. var. before running | 
 |    configure. | 
 |  | 
 |    Also, if you just want a quick, rough "thumbnail" of the display you | 
 |    can append ":nb" to the fraction to turn on "no blending" mode. E.g.: | 
 |    "-scale 1/3:nb" Fonts will be difficult to read, but the larger | 
 |    features will be recognizable. BTW, "no blending" mode is forced on | 
 |    when scaling 8bpp PseudoColor displays (because blending an indexed | 
 |    colormap is a bad idea and leads to random colors, use :fb to force it | 
 |    on.) | 
 |  | 
 |    One can also use the ":nb" with an integer scale factor (say "-scale | 
 |    2:nb") to use x11vnc as a screen magnifier for vision impaired | 
 |    applications. Since with integer scale factors the framebuffers become | 
 |    huge and scaling operations time consuming, be sure to use ":nb" for | 
 |    the fastest response. | 
 |  | 
 |    In general for a scaled display if you are using a TightVNC viewer you | 
 |    may want to turn off jpeg encoding (e.g. vncviewer -nojpeg host:0.) | 
 |    There appears to be a noise enhancement effect, especially for regions | 
 |    containing font/text: the scaling can introduce some pixel artifacts | 
 |    that evidently causes the tight encoding algorithm to incorrectly | 
 |    detect the regions as image data and thereby introduce additional | 
 |    pixel artifacts due to the lossiness of the jpeg compression | 
 |    algorithm. Experiment to see if -nojpeg vncviewer option improves the | 
 |    readability of text when using -scale to shrink the display size. Also | 
 |    note that scaling may actually slow down the transfer of text regions | 
 |    because after being scaled they do not compress as well. (this can | 
 |    often be a significant slowdown, e.g. 10X.) | 
 |  | 
 |    Another issue is that it appears VNC viewers require the screen width | 
 |    to be a multiple of 4. When scaling x11vnc will round the width to the | 
 |    nearest multiple of 4. To disable this use the ":n4" sub option (like | 
 |    ":nb" in the previous paragraph; to specify both use a comma: | 
 |    ":nb,n4", etc.) | 
 |  | 
 |    If one desires per-client scaling for something like 1:1 from a | 
 |    workstation and 1:2 from a smaller device (e.g. handheld), currently | 
 |    the only option is to run two (or more) x11vnc processes with | 
 |    different scalings listening on separate ports (-rfbport option, etc.) | 
 |  | 
 |    Update: As of May/2006 x11vnc also supports the UltraVNC server-side | 
 |    scaling. This is a per-client scaling by factors 1/2, 1/3, ... and so | 
 |    may be useful for PDA's ("-scale 1/2", etc. will give similar results | 
 |    except that it applies to all clients.) You may need to supply | 
 |    "-rfbversion 3.6" for this to be recognized by UltraVNC viewers. | 
 |  | 
 |    BTW, whenever you run two or more x11vnc's on the same X display and | 
 |    use the GUI, then to avoid all of the x11vnc's simultaneously | 
 |    answering the gui you will need to use something like "-connect file1 | 
 |    -gui ..." with different connect files for each x11vnc you want to | 
 |    control via the gui (or remote-control.) The "-connect file1" usage | 
 |    gives separate communication channels between a x11vnc process and the | 
 |    gui process. Otherwise they all share the same X property channels: | 
 |    VNC_CONNECT and X11VNC_REMOTE. | 
 |  | 
 |    Update: As of Mar/2005 x11vnc now scales the mouse cursor with the | 
 |    same scale factor as the screen. If you don't want that, use the | 
 |    "-scale_cursor frac" option to set the cursor scaling to a different | 
 |    factor (e.g. use "-scale_cursor 1" to keep the cursor at its natural | 
 |    unscaled size.) | 
 |  | 
 |  | 
 |    Q-101: Does x11vnc work with Xinerama? (i.e. multiple monitors joined | 
 |    together to form one big, single screen.) | 
 |  | 
 |    Yes, it should generally work because it simply polls the big | 
 |    effective screen. | 
 |  | 
 |    If the viewing-end monitor is not as big as the remote Xinerama | 
 |    display, then the vncviewer scrollbars, etc, will have to be used to | 
 |    pan across the large area. However one user started two x11vnc's, one | 
 |    with "-clip 1280x1024+0+0" and the other with "-clip 1280x1024+1280+0" | 
 |    to split the big screen into two and used two VNC viewers to access | 
 |    them. | 
 |  | 
 |    As of Jun/2008: Use "-clip xinerama0" to clip to the first xinerama | 
 |    sub-screen (if xinerama is active.) xinerama1 for the 2nd sub-screen, | 
 |    etc. This way you don't need to figure out the WxH+X+Y of the desired | 
 |    xinerama sub-screen. screens are sorted in increasing distance from | 
 |    the (0,0) origin (I.e. not the Xserver's order.) | 
 |  | 
 |    There are a couple potential issues with Xinerama however. If the | 
 |    screen is not rectangular (e.g. 1280x1024 and 1024x768 monitors joined | 
 |    together), then there will be "non-existent" areas on the screen. The | 
 |    X server will return "garbage" image data for these areas and so they | 
 |    may be distracting to the viewer. The -blackout x11vnc option allows | 
 |    you to blacken-out rectangles by manually specifying their WxH+X+Y | 
 |    geometries. If your system has the libXinerama library, the -xinerama | 
 |    x11vnc option can be used to have it automatically determine the | 
 |    rectangles to be blackened out. (Note on 8bpp PseudoColor displays the | 
 |    fill color may not be black.) Update: -xinerama is now on by default. | 
 |  | 
 |    Some users have reported that the mouse does not behave properly for | 
 |    their Xinerama display: i.e. the mouse cannot be moved to all regions | 
 |    of the large display. If this happens try using the -xwarppointer | 
 |    option. This instructs x11vnc to fake mouse pointer motions using the | 
 |    XWarpPointer function instead of the XTestFakeMotionEvent XTEST | 
 |    function. (This may be due to a bug in the X server for XTEST when | 
 |    Xinerama is enabled.) Update: As of Dec/2006 -xwarppointer will be | 
 |    applied automatically if Xinerama is detected. To disable use: | 
 |    -noxwarppointer | 
 |  | 
 |  | 
 |    Q-102: Can I use x11vnc on a multi-headed display that is not Xinerama | 
 |    (i.e. separate screens :0.0, :0.1, ... for each monitor)? | 
 |  | 
 |    You can, but it is a little bit awkward: you must start separate | 
 |    x11vnc processes for each screen, and on the viewing end start up | 
 |    separate VNC viewer processes connecting to them. e.g. on the remote | 
 |    end: | 
 |   x11vnc -display :0.0 -bg -q -rfbport 5900 | 
 |   x11vnc -display :0.1 -bg -q -rfbport 5901 | 
 |  | 
 |    (this could be automated in the display manager Xsetup for example) | 
 |    and then on the local machine where you are sitting: | 
 |   vncviewer somehost:0 & | 
 |   vncviewer somehost:1 & | 
 |  | 
 |    Note: if you are running on Solaris 8 or earlier you can easily hit up | 
 |    against the maximum of 6 shm segments per process (for Xsun in this | 
 |    case) from running multiple x11vnc processes. You should modify | 
 |    /etc/system as mentioned in another FAQ to increase the limit. It is | 
 |    probably also a good idea to run with the -onetile option in this case | 
 |    (to limit each x11vnc to 3 shm segments), or even -noshm to use no shm | 
 |    segments. | 
 |  | 
 |  | 
 |    Q-103: Can x11vnc show only a portion of the display? (E.g. for a | 
 |    special purpose application or a very large screen.) | 
 |  | 
 |    As of Mar/2005 x11vnc has the "-clip WxH+X+Y" option to select a | 
 |    rectangle of width W, height H and offset (X, Y). Thus the VNC screen | 
 |    will be the clipped sub-region of the display and be only WxH in size. | 
 |    One user used -clip to split up a large Xinerama screen into two more | 
 |    managable smaller screens. | 
 |  | 
 |    This also works to view a sub-region of a single application window if | 
 |    the -id or -sid options are used. The offset is measured from the | 
 |    upper left corner of the selected window. | 
 |  | 
 |  | 
 |    Q-104: Does x11vnc support the XRANDR (X Resize, Rotate and | 
 |    Reflection) extension? Whenever I rotate or resize the screen x11vnc | 
 |    just seems to crash. | 
 |  | 
 |    As of Dec/2004 x11vnc supports XRANDR. You enable it with the -xrandr | 
 |    option to make x11vnc monitor XRANDR events and also trap X server | 
 |    errors if the screen change occurred in the middle of an X call like | 
 |    XGetImage. Once it traps the screen change it will create a new | 
 |    framebuffer using the new screen. | 
 |  | 
 |    If the connected vnc viewers support the NewFBSize VNC extension | 
 |    (Windows TightVNC viewer and RealVNC 4.0 windows and Unix viewers do) | 
 |    then the viewer will automatically resize. Otherwise, the new | 
 |    framebuffer is fit as best as possible into the original viewer size | 
 |    (portions of the screen may be clipped, unused, etc.) For these | 
 |    viewers you can try the -padgeom option to make the region big enough | 
 |    to hold all resizes and rotations. We have fixed this problem for the | 
 |    TightVNC Viewer on Unix: SSVNC | 
 |  | 
 |    If you specify "-xrandr newfbsize" then vnc viewers that do not | 
 |    support NewFBSize will be disconnected before the resize. If you | 
 |    specify "-xrandr exit" then all will be disconnected and x11vnc will | 
 |    terminate. | 
 |  | 
 |  | 
 |    Q-105: Independent of any XRANDR, can I have x11vnc rotate and/or | 
 |    reflect the screen that the VNC viewers see? (e.g. for a handheld | 
 |    whose screen is rotated 90 degrees.) | 
 |  | 
 |    As of Jul/2006 there is the -rotate option allow this. E.g's: "-rotate | 
 |    +90", "-rotate -90", "-rotate x", etc. | 
 |  | 
 |  | 
 |    Q-106: Why is the view in my VNC viewer completely black? Or why is | 
 |    everything flashing around randomly? | 
 |  | 
 |    See the next FAQ for a possible explanation. | 
 |  | 
 |  | 
 |    Q-107: I use Linux Virtual Terminals (VT's) to implement 'Fast User | 
 |    Switching' between users' sessions (e.g. Betty is on Ctrl-Alt-F7, | 
 |    Bobby is on Ctrl-Alt-F8, and Sid is on Ctrl-Alt-F1: they use those | 
 |    keystrokes to switch between their sessions.)   How come the view in a | 
 |    VNC viewer connecting to x11vnc is either completely black or | 
 |    otherwise all messed up unless the X session x11vnc is attached to is | 
 |    in the active VT? | 
 |  | 
 |    This seems to have to do with how applications (the X server processes | 
 |    in this case) must "play nicely" if they are not on the active VT | 
 |    (sometimes called VC for virtual console.) That is, they should not | 
 |    read from the keyboard or mouse or manage the video display unless | 
 |    they have the active VT. Given that it appears the XGetImage() call | 
 |    must ultimately retrieve the framebuffer data from the video hardware | 
 |    itself, it would make sense x11vnc's polling wouldn't work unless the | 
 |    X session had active control of the VT. | 
 |  | 
 |    There does not seem to be an easy way to work around this. Even xwd(1) | 
 |    doesn't work in this case (try it.) Something would need to be done at | 
 |    a lower level, say in the XFree86/Xorg X server. Also, using the | 
 |    Shadow Framebuffer (a copy of the video framebuffer is kept in main | 
 |    memory) does not appear to fix the problem. | 
 |  | 
 |    If no one is sitting at the workstation and you just want to remotely | 
 |    switch the VT over to the one associated with your X session (so | 
 |    x11vnc can poll it correctly), one can use the chvt(1) command, e.g. | 
 |    "chvt 7" for VT #7. | 
 |  | 
 |  | 
 |    Q-108: I am using x11vnc where my local machine has "popup/hidden | 
 |    taskbars" and the remote display where x11vnc runs also has | 
 |    "popup/hidden taskbars" and they interfere and fight with each other. | 
 |    What can I do? | 
 |  | 
 |    When you move the mouse to the edge of the screen where the popups | 
 |    happen, the taskbars interfere with each other in strange ways. This | 
 |    sometimes happens where the local machine is GNOME or Mac OS X and the | 
 |    remote machine is GNOME. Is there a way to temporarily disable one or | 
 |    both of these magic desktop taskbars? | 
 |  | 
 |    One x11vnc user suggests: it should be straightforward to right mouse | 
 |    click on the task bar panel, and uncheck "enable auto-hide" from the | 
 |    panel properties dialog box. This will make the panel always visible. | 
 |  | 
 |    Q-109: Help! x11vnc and my KDE screensaver keep switching each other | 
 |    on and off every few seconds. | 
 |  | 
 |    This is a new (Jul/2006) problem seen, say, on the version of KDE that | 
 |    is shipped with SuSE 10.1. It is not yet clear what is causing this... | 
 |    If you move the mouse through x11vnc the screensaver shuts off like it | 
 |    should but then a second or two after you stop moving the mouse the | 
 |    screensaver snaps back on. | 
 |  | 
 |    This may be a bug in kdesktop_lock. For now the only workaround is to | 
 |    disable the screensaver. You can try using another one such as | 
 |    straight xscreensaver (see the instructions here for how to disable | 
 |    kdesktop_lock.) If you have more info on this or see it outside of KDE | 
 |    please let us know. | 
 |  | 
 |    Update: It appears this is due to kdesktop_lock enabling the screen | 
 |    saver when the Monitor is in DPMS low-power state (e.g. standby, | 
 |    suspend, or off.) In Nov/2006 the x11vnc -nodpms option was added as a | 
 |    workaround. Normally it is a good thing that the monitor powers down | 
 |    (since x11vnc can still poll the framebuffer in this state), but if | 
 |    you experience the kdesktop_lock problem you can specify the "-nodpms" | 
 |    option to keep the Monitor out of low power state while VNC clients | 
 |    are connected. This is basically the same as typing "xset dpms force | 
 |    on" periodically. (if you don't want to do these things just disable | 
 |    the screensaver.) Feel free to file a bug against kdesktop_lock with | 
 |    KDE. | 
 |  | 
 |    Q-110: I am running the compiz 3D window manager (or beryl, MythTv, | 
 |    Google Earth, or some other OpenGL app) and I do not get screen | 
 |    updates in x11vnc. | 
 |  | 
 |    This appears to be because the 3D OpenGL/GLX hardware screen updates | 
 |    do not get reported via the XDAMAGE mechanism. So this is a bug in | 
 |    compiz/beryl or XDAMAGE/Xorg or the (possibly 3rd party) video card | 
 |    driver. | 
 |  | 
 |    As a workaround apply the -noxdamage option. As of Feb/2007 x11vnc | 
 |    will try to autodetect the problem and disable XDAMAGE if is appears | 
 |    to be missing a lot of updates. But if you know you are using compiz | 
 |    you might as well always supply -noxdamage. Thanks to this user who | 
 |    reported the problem and discovered the workaround. | 
 |  | 
 |    A developer for MiniMyth reports that the 'alphapulse' tag of the | 
 |    theme G.A.N.T. can also cause problems, and should be avoided when | 
 |    using VNC. | 
 |  | 
 |    Please report a bug or complaint to Beryl/Compiz and/or Xorg about | 
 |    this: running x11vnc with -noxdamage disables a nice improvement in | 
 |    responsiveness (especially for typing) and also leads to unnecessary | 
 |    CPU and memory I/O load due to the extra polling. | 
 |  | 
 |    Update: as of May/2010 NVIDIA may have fixed this problem in their | 
 |    proprietary drivers. See the NVIDIA Release Notes. (look for | 
 |    'x11vnc'.) | 
 |  | 
 |    Q-111: Can I use x11vnc to view my VMWare session remotely? | 
 |  | 
 |    Yes, since VMWare usually runs as an X application you can view it via | 
 |    x11vnc in the normal way. | 
 |  | 
 |    Note that VMWare has several viewing modes: | 
 |      * Normal X application window  (with window manager frame) | 
 |      * Quick-Switch mode  (with no window manager frame) | 
 |      * Fullscreen mode | 
 |  | 
 |    The way VMWare does Fullscreen mode on Linux is to display the Guest | 
 |    desktop in a separate Virtual Terminal (e.g. VT 8) (see this FAQ on | 
 |    VT's for background.) Unfortunately, this Fullscreen VT is not an X | 
 |    server. So x11vnc cannot access it (however, see this discussion of | 
 |    -rawfb for a possible workaround.) x11vnc works fine with "Normal X | 
 |    application window" and "Quick-Switch mode" because these use X. | 
 |  | 
 |    Update: It appears the in VMWare 5.x the Fullscreen mode is X, so | 
 |    x11vnc access does work. | 
 |  | 
 |    One user reports he left his machine with VMWare in the Fullscreen | 
 |    mode, and even though his X session wasn't in the active VT, he could | 
 |    still connect x11vnc to the X session and pass the keystrokes Ctrl-Alt | 
 |    (typing "blind") to the VMWare X app. This induced VMWare to switch | 
 |    out of Fullscreen into Normal X mode and he could continue working in | 
 |    the Guest desktop remotely. | 
 |  | 
 |  | 
 |    Aside: Sometimes it is convenient (for performance, etc.) to start | 
 |    VMWare in its own X session using startx(1). This can be used to have | 
 |    a minimal window manger (e.g. twm or even no window manager), to | 
 |    improve response. One can also cut the display depth (e.g. to 16bpp) | 
 |    in this 2nd X session to improve video performance. This 2nd X session | 
 |    emulates Fullscreen mode to some degree and can be viewed via x11vnc | 
 |    as long as the VMWare X session is in the active VT. | 
 |  | 
 |    Also note that with a little bit of playing with "xwininfo -all | 
 |    -children" output one can extract the (non-toplevel) window-id of the | 
 |    of the Guest desktop only when VMWare is running as a normal X | 
 |    application. Then one can export just the guest desktop (i.e. without | 
 |    the VMWare menu buttons) by use of the -id windowid option. The | 
 |    caveats are the X session VMWare is in must be in the active VT and | 
 |    the window must be fully visible, so this mode is not terribly | 
 |    convenient, but could be useful in some circumstances (e.g. running | 
 |    VMWare on a very powerful server machine in a server room that happens | 
 |    to have a video card, (but need not have a monitor, Keyboard or | 
 |    mouse).) | 
 |  | 
 |  | 
 |  | 
 |    [Exporting non-X11 devices via VNC] | 
 |  | 
 |    Q-112: Can non-X devices (e.g. a raw framebuffer) be viewed (and even | 
 |    controlled) via VNC with x11vnc? | 
 |  | 
 |    As of Apr/2005 there is support for this. Two options were added: | 
 |    "-rawfb string" (to indicate the raw frame buffer device, file, etc. | 
 |    and its parameters) and "-pipeinput command" (to provide an external | 
 |    program that will inject or otherwise process mouse and keystroke | 
 |    input.) Some useful -pipeinput schemes, VID, CONSOLE, and UINPUT, have | 
 |    since been built into x11vnc for convenience. | 
 |  | 
 |    This non-X mode for x11vnc is somewhat experimental because it is so | 
 |    removed in scope from the intended usage of the tool. Incomplete | 
 |    attempt is made to make all of the other options consistent with non-X | 
 |    framebuffer polling. So all of the X-related options (e.g. | 
 |    -add_keysyms, -xkb) are just ignored or may cause an error if used. Be | 
 |    careful applying such an option via remote control. | 
 |  | 
 |    The format for the -rawfb string is: | 
 |     -rawfb <type>:<object>@<W>x<H>x<bpp>[-<BPL>][:<R>/<G>/<B>][+<offset>] | 
 |  | 
 |    There are also some useful aliases (e.g. "console".) Some examples: | 
 |     -rawfb shm:210337933@800x600x32:ff/ff00/ff0000 | 
 |  | 
 |     -rawfb map:/dev/fb0@1024x768x16 | 
 |  | 
 |     -rawfb map:/tmp/Xvfb_screen0@640x480x8+3232 | 
 |  | 
 |     -rawfb file:/tmp/my.pnm@250x200x24+37 | 
 |  | 
 |     -rawfb file:/dev/urandom@128x128x8 | 
 |  | 
 |     -rawfb snap:/dev/video0@320x240x24 -24to32 | 
 |  | 
 |     -rawfb console | 
 |  | 
 |     -rawfb vt2 | 
 |  | 
 |     -rawfb video | 
 |  | 
 |     -rawfb setup:mycmd.sh | 
 |  | 
 |    So the type can be "shm" for shared memory objects, and "map" or | 
 |    "file" for file objects. "map" uses mmap(2) to map the file into | 
 |    memory and is preferred over "file" (that uses the slower lseek(2) | 
 |    access method.) Only use file if map isn't working. BTW, "mmap" is an | 
 |    alias for "map" and if you do not supply a type and the file exists, | 
 |    map is assumed (see the -help output and below for some exceptions to | 
 |    this.) The "snap:" setting applies the -snapfb option with "file:" | 
 |    type reading (this is useful for exporting webcams or TV tuner video; | 
 |    see the next FAQ for more info.) | 
 |  | 
 |    Also, if the string is of the form "setup:cmd" then cmd is run and the | 
 |    first line of its output retrieved and used as the rawfb string. This | 
 |    allows initializing the device, determining WxHxB, etc. | 
 |  | 
 |    The object will be the numerical shared memory id for the case of shm. | 
 |    The idea here is some other program has created this shared memory | 
 |    segment and periodically updates it with new framebuffer data. x11vnc | 
 |    polls the area for changes. See shmat(2) and ipcs(8) for more info. | 
 |    The ipcs command will list current shared memory segments on the | 
 |    system. Sometimes you can snoop on a program's framebuffer it did not | 
 |    expect you would be polling! | 
 |  | 
 |    The object will be the path to the regular or character special file | 
 |    for the cases of map and file. The idea here is that in the case of a | 
 |    regular file some other program is writing/updating framebuffer image | 
 |    data to it. In the case of a character special (e.g. /dev/fb0) it is | 
 |    the kernel that is "updating" the framebuffer data. | 
 |  | 
 |    In most cases x11vnc needs to be told the width, height, and number of | 
 |    bits per pixel (bpp) of the framebuffer. This is the @WxHxB field. For | 
 |    the case of the Linux framebuffer device, /dev/fb0, the fbset(8) may | 
 |    be of use (but may not always be accurate for what is currently | 
 |    viewable.) In general some guessing may be required, especially for | 
 |    the bpp. Update: in "-rawfb console" mode x11vnc will use the linuxfb | 
 |    API to try to guess (it is still not always accurate.) Also try | 
 |    "-rawfb vtN" (on x11vnc 0.9.7 and later) for the N-th Linux text | 
 |    console (aka virtual terminal.) If the number of Bytes Per Line is not | 
 |    WxHxB/8 (i.e. the framebuffer lines are padded) you can specify this | 
 |    information after WxHxB via "-BPL", e.g. @800x600x16-2048 | 
 |  | 
 |    Based on the bpp x11vnc will try to guess the red, green, and blue | 
 |    masks (these indicate which bits correspond to each color.) It if gets | 
 |    it wrong you can specify them manually via the optional ":R/G/B" | 
 |    field. E.g. ":0xff0000/0x00ff00/0x0000ff" (this is the default for | 
 |    32bpp.) | 
 |  | 
 |    Finally, the framebuffer may not begin at the beginning of the memory | 
 |    object, so use the optional "+offset" parameter to indicate where the | 
 |    framebuffer information starts. So as an example, the Xvfb virtual | 
 |    framebuffer has options -shmem and -fbdir for exporting its virtual | 
 |    screen to either shm or a mapped file. The format of these is XWD and | 
 |    so the initial header should be skipped. BTW, since XWD is not | 
 |    strictly RGB the view will only be approximate, but usable. Of course | 
 |    for the case of Xvfb x11vnc can poll it much better via the X API, but | 
 |    you get the idea. | 
 |  | 
 |    By default in -rawfb mode x11vnc will actually close any X display it | 
 |    happened to open. This is basically to shake out bugs (e.g it will | 
 |    crash rather than mysteriously interacting with the X display.) If you | 
 |    want x11vnc to keep the X display open while polling the raw | 
 |    framebuffer prefix a "+" sign at the beginning of the string (e.g. | 
 |    +file:/dev/urandom@64x64x8) This could be convenient for keeping the | 
 |    remote control channel active (it uses X properties.) The "-connect | 
 |    /path/to/file" mechanism could also be used for remote control to | 
 |    avoid the X property channel. Rare usage, but if you also supply | 
 |    -noviewonly in this "+" mode then the mouse and keyboard input are | 
 |    still sent to the X display, presumably for doing something amusing | 
 |    with /dev/fb... | 
 |  | 
 |    Interesting Devices:. Here are some aliases for interesting device | 
 |    files that can be polled via -rawfb: | 
 |    -rawfb console               /dev/fb0        Linux Console | 
 |    -rawfb vt2                   /dev/vcsa2      Linux Console (e.g. virtual ter | 
 | minal #2) | 
 |    -rawfb video                 /dev/video0     Video4Linux Capture device | 
 |    -rawfb rand                  /dev/urandom    Random Bytes | 
 |    -rawfb null                  /dev/zero       Zero Bytes (black screen) | 
 |  | 
 |    The Linux console, /dev/fb0, etc needs to have its driver enabled in | 
 |    the kernel. Some of the drivers are video card specific and | 
 |    accelerated. The console is either the Text consoles (usually | 
 |    tty1-tty6), or X graphical display (usually starting at tty7.) In | 
 |    addition to the text console other graphical ones may be viewed and | 
 |    interacted with as well, e.g. DirectFB or SVGAlib apps, VMWare non-X | 
 |    fullscreen, or Qt-embedded apps (PDAs/Handhelds.) By default the | 
 |    pipeinput mechanisms UINPUT and CONSOLE (keystrokes only) are | 
 |    automatically attempted in this mode under "-rawfb console". | 
 |  | 
 |    The Video4Linux Capture device, /dev/video0, etc is either a Webcam or | 
 |    a TV capture device and needs to have its driver enabled in the | 
 |    kernel. See this FAQ for details. If specified via "-rawfb Video" then | 
 |    the pipeinput method "VID" is applied (it lets you change video | 
 |    parameters dynamically via keystrokes.) | 
 |  | 
 |    The last two, /dev/urandom and /dev/zero are just for fun, but are | 
 |    also useful in testing. | 
 |  | 
 |  | 
 |    All of the above -rawfb options are just for viewing the raw | 
 |    framebuffer (although some of the aliases do imply keystroke and mouse | 
 |    pipeinput methods.) That may be enough for certain applications of | 
 |    this feature (e.g. suppose a video camera mapped its framebuffer into | 
 |    memory and you just wanted to look at it via VNC.) | 
 |    To handle the pointer and keyboard input from the viewer users the | 
 |    "-pipeinput cmd" option was added to indicate a helper program to | 
 |    process the user input. The input is streamed to it and looks | 
 |    something like this: | 
 |    Pointer 1 205 257 0 None | 
 |    Pointer 1 198 253 0 None | 
 |    Pointer 1 198 253 1 ButtonPress-1 | 
 |    Pointer 1 198 253 0 ButtonRelease-1 | 
 |    Pointer 1 198 252 0 None | 
 |    Keysym 1 1 119 w KeyPress | 
 |    Keysym 1 0 119 w KeyRelease | 
 |    Keysym 1 1 65288 BackSpace KeyPress | 
 |    Keysym 1 0 65288 BackSpace KeyRelease | 
 |    Keysym 1 1 112 p KeyPress | 
 |    Keysym 1 0 112 p KeyRelease | 
 |  | 
 |    Run "-pipeinput tee:/bin/cat" to get a description of the format. Note | 
 |    that the -pipeinput option is independent of -rawfb mode and so may | 
 |    have some other interesting uses. The "tee:" prefix means x11vnc will | 
 |    both process the user input and pipe it to the command. The default is | 
 |    to just pipe it to the -pipeinput command. | 
 |  | 
 |    Note the -pipeinput helper program could actually control the raw | 
 |    framebuffer. In the libvncserver CVS a simple example program | 
 |    x11vnc/misc/slide.pl is provided that demonstrates a simple jpeg | 
 |    "slideshow" application. Also the builtin "-pipeinput VID" mode does | 
 |    this for webcams and TV capture devices (/dev/video0.) | 
 |  | 
 |    The -pipeinput program is run with these environment variables set: | 
 |    X11VNC_PID, X11VNC_PROG, X11VNC_CMDLINE, X11VNC_RAWFB_STR to aid its | 
 |    knowing what is up. | 
 |  | 
 |    Another example provided in libvncserver CVS is a script to inject | 
 |    keystrokes into the Linux console (e.g. the virtual consoles: | 
 |    /dev/tty1, /dev/tty2, etc) in x11vnc/misc/vcinject.pl. It is based on | 
 |    the vncterm/LinuxVNC.c program also in the libvncserver CVS. So to | 
 |    view and interact with VT #2 (assuming it is the active VT) one can | 
 |    run something like: | 
 |   x11vnc -rawfb map:/dev/fb0@1024x768x16 -pipeinput './vcinject.pl 2' | 
 |  | 
 |    This assumes your Linux framebuffer device (/dev/fb0) is properly | 
 |    configured. See fbset(8) and other documentation. Try | 
 |    "file:/dev/fb0@WxHxB" as a last resort. Starting with x11vnc 0.8.1, | 
 |    the above VT injection is built in, as well as WxHxB determination. | 
 |    Just use something like: | 
 |   x11vnc -rawfb console | 
 |  | 
 |    this will try to guess the active virtual console (via /dev/tty0) and | 
 |    also the /dev/fb0 WxHxB and rgb masks automatically. Use, e.g., | 
 |    "-rawfb console3" to force the VT number. This input method can be | 
 |    used generally via "-pipeinput CONSOLE". Also starting with x11vnc | 
 |    0.8.2 the "-pipeinput UINPUT" mode is tried first (it does both | 
 |    keyboard and mouse input) and then falls back to CONSOLE mode if it is | 
 |    not available. Here is the -help output for this mode: | 
 |  | 
 |      If the rawfb string begins with "console" the framebuffer device | 
 |      /dev/fb0 is opened (this requires the appropriate kernel modules to | 
 |      be installed) and so is /dev/tty0. The latter is used to inject | 
 |      keystrokes (not all are supported, but the basic ones are.) You | 
 |      will need to be root to inject keystrokes. /dev/tty0 refers to the | 
 |      active VT, to indicate one explicitly, use "console2", etc. using | 
 |      the VT number. | 
 |  | 
 |      If the Linux version seems to be 2.6 or later and the "uinput" | 
 |      module appears to be present, then the uinput method will be used | 
 |      instead of /dev/ttyN. uinput allows insertion of BOTH keystrokes | 
 |      and mouse input and so it preferred when accessing graphical (e.g. | 
 |      Qt-embedded) linux console apps. See -pipeinput UINPUT below for | 
 |      more information on this mode (you may want to also use the | 
 |      -nodragging and -cursor none options.) Use "console0", etc or | 
 |      -pipeinput CONSOLE to force the /dev/ttyN method. | 
 |  | 
 |      Note you can change VT remotely using the chvt(1) command. | 
 |      Sometimes switching out and back corrects the framebuffer state. | 
 |  | 
 |      To skip input injecting entirely use "consolex". | 
 |  | 
 |      The string "/dev/fb0" (1, etc) can be used instead of "console". | 
 |      This can be used to specify a different framebuffer device, e.g. | 
 |      /dev/fb1. As a shortcut the "/dev/" can be dropped. If the name is | 
 |      something nonstandard, use "console:/dev/foofb" | 
 |  | 
 |      If you do not want x11vnc to guess the framebuffer's WxHxB and | 
 |      masks automatically (sometimes the kernel gives inaccurate | 
 |      information), specify them with a @WxHxB at the end of the string. | 
 |  | 
 |    The above is just an example of what can be done. Note that if you | 
 |    really want to view and interact with the Linux Text console it is | 
 |    better to use the more accurate and faster LinuxVNC program. The | 
 |    advantage x11vnc -rawfb might have is that it can allow interaction | 
 |    with a non-text application, e.g. one based on SVGAlib or Qt-embedded | 
 |    Also, for example the VMWare Fullscreen mode is actually viewable | 
 |    under -rawfb and can be interacted with if uinput is enabled. | 
 |  | 
 |    If the Linux uinput driver is available then full keystroke and mouse | 
 |    input into the Linux console can be performed. You may be able to | 
 |    enable uinput via commands like these: | 
 |   modprobe uinput | 
 |   mknod /dev/input/uinput c 10 223 | 
 |  | 
 |    The -rawfb and -pipeinput features are intended to help one creatively | 
 |    "get out of a jam" (say on a legacy or embedded device) where X is | 
 |    absent or doesn't work properly. Feedback and bug reports are welcome. | 
 |    For more control and less overhead use libvncserver in your own C | 
 |    program that passes the framebuffer to libvncserver. | 
 |  | 
 |  | 
 |    Q-113: Can I export the Linux Console (Virtual Terminals) via VNC | 
 |    using x11vnc? | 
 |  | 
 |    Yes, you may need to be root to access the devices that make up the | 
 |    linux console. | 
 |  | 
 |    To access the active Linux console via the computer's framebuffer try | 
 |    something like: | 
 |   x11vnc -rawfb console | 
 |   x11vnc -rawfb console2 | 
 |  | 
 |    These will try to access the framebuffer through /dev/fb (or /dev/fb0, | 
 |    etc.) and if it succeeds it will show any text or graphics that is | 
 |    currently displayed. Keystrokes will be injected via the device | 
 |    /dev/tty0 (to force an explicit virtual terminal append a number, e.g. | 
 |    "console2" to select /dev/tty2.) | 
 |  | 
 |    If your Linux system does not have a framebuffer device (/dev/fb) you | 
 |    can get one by adding, e.g., vga=0x31B boot parameter. This enables | 
 |    the VGA framebuffer device at 1280x1024x24. 0x317 gives 1024x768x16, | 
 |    etc. You can also enable a Linux framebuffer device by modprobing a | 
 |    framebuffer driver specific to your video card. | 
 |  | 
 |    Note that this "-rawfb console" mode shows the contents of the | 
 |    hardware framebuffer, and so will show whatever is on the screen. It | 
 |    has no concept of Virtual Terminals WRT what there is to view, it | 
 |    always shows the active virtual terminal. | 
 |  | 
 |    Another mode is specific to the Linux text Virtual Terminals, it shows | 
 |    their text and colors (but no graphics) regardless of whether it is | 
 |    the active VT or not. It is available on x11vnc 0.9.7 and later. | 
 |    Enable this mode like this: | 
 |   x11vnc -rawfb vt | 
 |   x11vnc -rawfb vt2 | 
 |  | 
 |    The former will select the active one, the latter the 2nd VT. x11vnc | 
 |    implements this mode by opening the current console text file | 
 |    "/dev/vcsa2" instead of "/dev/fb". In this way it provides the basic | 
 |    functionality of the LibVNCServer LinuxVNC program. | 
 |  | 
 |    The vt mode can be a useful way to try to get a machine's X server | 
 |    working remotely, e.g. you edit /etc/X11/xorg.conf and then type | 
 |    startx (or similar, e.g. gdm) in the virtual terminal. A 2nd x11vnc | 
 |    could be used to see if the X server is now working correctly. | 
 |  | 
 |    Q-114: Can I export via VNC a Webcam or TV tuner framebuffer using | 
 |    x11vnc? | 
 |  | 
 |    Yes, this is possible to some degree with the -rawfb option. There is | 
 |    no X11 involved: snapshots from the video capture device are used for | 
 |    the screen image data. See the previous FAQ on -rawfb for background. | 
 |    For best results, use x11vnc version 0.8.1 or later. | 
 |  | 
 |    Roughly, one would do something like this: | 
 |   x11vnc -rawfb snap:/dev/video@320x240x32 | 
 |  | 
 |    This requires that the system allows simple read(2) access to the | 
 |    video device. This is true for video4Linux on Linux kernel 2.6 and | 
 |    later (it won't work for 2.4, you'll need a separate program to | 
 |    snapshot to a file that you point -rawfb to; ask me if it is not clear | 
 |    what to do.) | 
 |  | 
 |    The "snap:" enforces -snapfb mode which appears to be necessary. The | 
 |    read pointer for video capture devices cannot be repositioned (which | 
 |    would be needed for scanline polling), but you can read a full frame | 
 |    of data from the device. | 
 |  | 
 |    On Linux, if the Video4Linux API is present or the v4l-info(1) program | 
 |    (related to xawtv) exists in in PATH, then x11vnc can be instructed to | 
 |    try it to determine the -rawfb WxHxB parameters for you automatically. | 
 |    In this case one would just type: | 
 |   x11vnc -rawfb video | 
 |  | 
 |    or "-rawfb video1" for the 2nd video device, etc. | 
 |  | 
 |    x11vnc has also been extended to use the Video4Linux API over v4l-info | 
 |    if it is available at build time. This enables setting parameters | 
 |    (e.g. size and brightness) via x11vnc. See the description below. | 
 |    Without Video4Linux you will need to initialize the settings of the | 
 |    video device using something like xawtv or spcaview (and then hope the | 
 |    settings persist until x11vnc reopens the device.) | 
 |  | 
 |    Many video4linux drivers tend to set the framebuffer to be 24bpp (as | 
 |    opposed to 32bpp.) Since this can cause problems with VNC viewers, | 
 |    etc, the -24to32 option will be automatically imposed when in 24bpp. | 
 |  | 
 |    Note that by its very nature, video capture involves rapid change in | 
 |    the framebuffer. This is especially true for cameras where slight | 
 |    wavering in brightness is always happening. This can lead to much | 
 |    network bandwidth consumption for the VNC traffic and also local CPU | 
 |    and I/O resource usage. You may want to experiment with "dialing down" | 
 |    the framerate via the -wait, -slow_fb, or -defer options. Decreasing | 
 |    the window size and bpp also helps. | 
 |  | 
 |  | 
 |    Setting Camera/Tuner parameters via x11vnc: | 
 |  | 
 |    There is also some support for setting parameters of the capture | 
 |    device. This is done via "-rawfb video:<settings>". This could be | 
 |    useful for unattended startup at boottime, etc. Here is the -help | 
 |    description: | 
 |  | 
 |      A more sophisticated video device scheme allows initializing the | 
 |      device's settings using: | 
 |  | 
 |            -rawfb video:<settings> | 
 |  | 
 |      The prefix could also be, as above, e.g. "video1:" to specify the | 
 |      device file. The v4l API must be available for this to work. | 
 |      Otherwise, you will need to try to initialize the device with an | 
 |      external program, e.g. xawtv, spcaview, and hope they persist when | 
 |      x11vnc re-opens the device. | 
 |  | 
 |      <settings> is a comma separated list of key=value pairs. The | 
 |      device's brightness, color, contrast, and hue can be set to | 
 |      percentages, e.g. br=80,co=50,cn=44,hu=60. | 
 |  | 
 |      The device filename can be set too if needed (if it does not start | 
 |      with "video"), e.g. fn=/dev/qcam. | 
 |  | 
 |      The width, height and bpp of the framebuffer can be set via, e.g., | 
 |      w=160,h=120,bpp=16. | 
 |  | 
 |      Related to the bpp above, the pixel format can be set via the | 
 |      fmt=XXX, where XXX can be one of: GREY, HI240, RGB555, RGB565, | 
 |      RGB24, and RGB32 (with bpp 8, 8, 16, 16, 24, and 32 respectively.) | 
 |      See http://www.linuxtv.org for more info (V4L api.) | 
 |  | 
 |      For TV/rf tuner cards one can set the tuning mode via tun=XXX where | 
 |      XXX can be one of PAL, NTSC, SECAM, or AUTO. | 
 |  | 
 |      One can switch the input channel by the inp=XXX setting, where XXX | 
 |      is the name of the input channel (Television, Composite1, S-Video, | 
 |      etc.) Use the name that is in the information about the device that | 
 |      is printed at startup. | 
 |  | 
 |      For input channels with tuners (e.g. Television) one can change | 
 |      which station is selected by the sta=XXX setting. XXX is the | 
 |      station number. Currently only the ntsc-cable-us (US cable) | 
 |      channels are built into x11vnc. See the -freqtab option below to | 
 |      supply one from xawtv. If XXX is greater than 500, then it is | 
 |      interpreted as a raw frequency in KHz. | 
 |  | 
 |      Example: | 
 |  | 
 |      -rawfb video:br=80,w=320,h=240,fmt=RGB32,tun=NTSC,sta=47 | 
 |  | 
 |      one might need to add inp=Television too for the input channel to | 
 |      be TV if the card doesn't come up by default in that one. | 
 |  | 
 |      Note that not all video capture devices will support all of the | 
 |      above settings. | 
 |  | 
 |      See the -pipeinput VID option below for a way to control the | 
 |      settings through the VNC Viewer via keystrokes. | 
 |  | 
 |      As above, if you specify a "@WxHxB..." after the <settings> string | 
 |      they are used verbatim: the device is not queried for the current | 
 |      values. Otherwise the device will be queried. | 
 |  | 
 |    Also, if you supply the "-pipeinput VID" (or use "-rawfb Video") | 
 |    option you can control the settings to some degree via keystroke | 
 |    mappings, e.g. B to increase the brightness or Up arrow to change the | 
 |    TV station: | 
 |  | 
 |      For "-pipeinput VID" and you are using the -rawfb for a video | 
 |      capture device, then an internal list of keyboard mappings is used | 
 |      to set parameters of the video. The mappings are: | 
 |  | 
 |          "B" and "b" adjust the brightness up and down. | 
 |          "H" and "h" adjust the hue. | 
 |          "C" and "c" adjust the colour. | 
 |          "N" and "n" adjust the contrast. | 
 |          "S" and "s" adjust the size of the capture screen. | 
 |          "I" and "i" cycle through input channels. | 
 |          Up and Down arrows adjust the station (if a tuner) | 
 |          F1, F2, ..., F6 will switch the video capture pixel | 
 |          format to HI240, RGB565, RGB24, RGB32, RGB555, and | 
 |          GREY respectively. See -rawfb video for details. | 
 |  | 
 |    See also the -freqtab option to supply your own xawtv channel to | 
 |    frequency mappings for your country (only ntsc-cable-us is built into | 
 |    x11vnc.) | 
 |  | 
 |  | 
 |    Q-115: Can I connect via VNC to a Qt-embedded/Qt-enhanced/Qtopia | 
 |    application running on my handheld, cell phone, or PC using the Linux | 
 |    console framebuffer (i.e. not X11)? | 
 |  | 
 |    Yes, the basic method for this is the -rawfb scheme where the Linux | 
 |    console framebuffer (usually /dev/fb0) is polled and the uinput driver | 
 |    is used to inject keystrokes and mouse input. Often you will just have | 
 |    to type: | 
 |   x11vnc -rawfb console | 
 |  | 
 |    (you may need to enable the uinput driver on the system via "modprobe | 
 |    uinput; mknod /dev/input/uinput c 10 223") If this does not find the | 
 |    correct frame buffer properties figure them out or guess them and use | 
 |    something like: | 
 |   x11vnc -rawfb /dev/fb0@640x480x16 | 
 |  | 
 |    Also, to force usage of the uinput injection method use "-pipeinput | 
 |    UINPUT". See the -pipeinput description for tunable parameters, etc. | 
 |  | 
 |    One problem with the x11vnc uinput scheme is that it cannot guess the | 
 |    mouse motion "acceleration" used by the windowing application (e.g. | 
 |    QWS or X11.) For X11 and Qt-embedded the acceleration is usually 2 | 
 |    (i.e. a dx of 1 from the mouse yields a 2 pixel displacement of the | 
 |    mouse cursor.) The default x11vnc uses is 2, since that is often used. | 
 |    However for one Qt-embedded system we needed to do: | 
 |   x11vnc -rawfb console  -pipeinput UINPUT:accel=4.0 | 
 |  | 
 |    to get reasonable positioning of the mouse. | 
 |  | 
 |    Even with the correct acceleration setting there is still some drift | 
 |    (probably because of the mouse threshold where the acceleration kicks | 
 |    in) and so x11vnc needs to reposition the cursor from 0,0 about 5 | 
 |    times a second. See the -pipeinput UINPUT option for tuning parameters | 
 |    that can be set (there are some experimental thresh=N tuning | 
 |    parameters as well) | 
 |  | 
 |    Currently, one can expect mouse input to be a little flakey. All in | 
 |    all, the Linux framebuffer input mechanism for Qt-embedded framebuffer | 
 |    apps is not perfect, but it is usable. | 
 |  | 
 |    If you need to create a smaller x11vnc binary for a handheld | 
 |    environment be sure to run strip(1) on it and also consider | 
 |    configuring with, e.g. "env CPPFLAGS='-DSMALL_FOOTPRINT=1' ./configure | 
 |    ..." to remove rarely used features and large texts (use 2 or 3 | 
 |    instead of 1 to remove more.) Currently (Jul/2006) this can lower the | 
 |    size of the x11vnc from 1.1MB to 0.6-0.7MB. | 
 |  | 
 |    The x11vnc uinput method applies to nearly anything on the Linux | 
 |    framebuffer console, not just Qt-embedded/Qtopia. DirectFB, SDL using | 
 |    fbcon driver, SVGAlib applications can also be viewed and interacted | 
 |    with. Even a Linux X session can be viewed and interacted with without | 
 |    using X11 (and x11vnc does not have to terminate when the X server | 
 |    restarts!) The Linux Text consoles (F1-F6) also work. | 
 |  | 
 |    Note that Qt-embedded supplies its own VNC graphics driver, but it | 
 |    cannot do both the Linux console framebuffer and VNC at the same time, | 
 |    which is often what is desired from VNC. | 
 |  | 
 |    Update: We are finding some setups like Qtopia on the IPAQ do not | 
 |    allow mouse input via uinput. Please help us debug this problem by | 
 |    trying x11vnc on your device and letting us know what does and does | 
 |    not work. See the next FAQ for a possible workaround for touchscreens. | 
 |  | 
 |  | 
 |    Q-116: How do I inject touch screen input into an | 
 |    Qt-embedded/Qt-enhanced/Qtopia cell phone such as openmoko/qtmoko Neo | 
 |    Freerunner? | 
 |  | 
 |    The qtmoko project does not use X11 for the graphical display. | 
 |    Unfortunately the Linux uinput method described in the previous FAQ | 
 |    does not work because Qt is using TSLIB (touch screen library) to | 
 |    process the input and it only reads from one device (often | 
 |    /dev/input/event1) and not from the new UINPUT device that x11vnc | 
 |    creates (under -pipeinput UINPUT) | 
 |  | 
 |    So something else needs to be done. It was discovered that by simply | 
 |    writing the touchscreen events directly to /dev/input/event1 then | 
 |    input can be injected into the system. There is no x11vnc builtin mode | 
 |    for this yet (until we understand it better), but there is a working | 
 |    script provided in x11vnc/misc/qt_tslib_inject.pl. So one could use it | 
 |    this way for example: | 
 |   x11vnc ... -rawfb console -pipeinput path/to/qt_tslib_inject.pl -env INJECT_O | 
 | PTIONS=clickonly,cal=/etc/pointercal | 
 |  | 
 |    Read the script for how to enable other options and what the above | 
 |    options mean (e.g. /etc/pointercal contains TSLIB's calibration | 
 |    parameters and are necessary to achieve accurate pointing.) | 
 |  | 
 |    The x11vnc/misc/qt_tslib_inject.pl script can potentially be modified | 
 |    to handle other devices where the uinput method fails. It could also | 
 |    be modified to create 'hot keys', etc. | 
 |  | 
 |    Please let us know how things go if you try this out; there is much to | 
 |    learn about synthetic input injection in handhelds and cell phones. As | 
 |    we learn more we can develop a builtin x11vnc mode for this sort of | 
 |    injection. | 
 |  | 
 |    Update Dec/2010: There is experimental built-in UINPUT support in the | 
 |    x11vnc development tarball for qtmoko with touchpad managed by tslib. | 
 |    See -pipeinput UINPUT for more info. Here is an example: | 
 |    x11vnc -rawfb console -pipeinput UINPUT:touch,tslib_cal=/etc/pointercal,dire | 
 | ct_abs=/dev/input/event1,nouinput,dragskip=3 | 
 |  | 
 |  | 
 |    Q-117: Now that non-X11 devices can be exported via VNC using x11vnc, | 
 |    can I build it with no dependencies on X11 header files and libraries? | 
 |  | 
 |    Yes, as of Jul/2006 x11vnc enables building for -rawfb only support. | 
 |    Just do something like when building: | 
 |   ./configure --without-x    (plus any other flags) | 
 |   make | 
 |  | 
 |    You can then test via "ldd x11vnc" that the binary does not depend on | 
 |    libX11.so, etc. See the previous FAQ's for non-X11 framebuffer usage. | 
 |    If you use this for an interesting non-X11 application please let us | 
 |    know what you did. | 
 |  | 
 |  | 
 |    Q-118: How do I cross compile x11vnc for a different architecture than | 
 |    my Linux i386 or amd64 PC? | 
 |  | 
 |    You will need a cross-compiling toolchain. Perhaps your distro | 
 |    provides these or you can find a HOWTO for your distro. We found a | 
 |    nice one at qtmoko.org for building armel binaries on Debian Linux | 
 |    i386 machines. It includes most of the libraries that x11vnc needs. We | 
 |    use that example here. | 
 |  | 
 |    We ran this script to set PATH, configure, and build: | 
 | #!/bin/sh | 
 |  | 
 | # toolchain from: qtmoko-debian-toolchain-armv4t-eabi.tar.gz | 
 |  | 
 | export PATH=/opt/toolchains/arm920t-eabi/bin:$PATH | 
 |  | 
 | env CC=arm-linux-gcc ./configure --host=arm-linux --without-avahi | 
 |  | 
 | make | 
 |  | 
 | arm-linux-strip ./x11vnc/x11vnc | 
 | ls -l ./x11vnc/x11vnc | 
 |  | 
 |    Note we had to include --without-avahi due to lack of | 
 |    libavahi-client.so.3 supplied by the toolchain we used. One would need | 
 |    to add it if it was desired on the target machine. We also stripped | 
 |    the binary to make it smaller. | 
 |  | 
 |    For an embedded system one may also want to add --without-x if the | 
 |    embedded system does not use X11 and the -rawfb mechanism must be | 
 |    used. | 
 |  | 
 |  | 
 |    Q-119: Does x11vnc support Mac OS X Aqua/Quartz displays natively | 
 |    (i.e. no X11 involved)? | 
 |  | 
 |    Yes, since Nov/2006 in the development tree (x11vnc-0.8.4 tarball) | 
 |    there is support for native Mac OS X Aqua/Quartz displays using the | 
 |    -rawfb mechanism described above. The mouse and keyboard input is | 
 |    achieved via Mac OS X API's. | 
 |  | 
 |    So you can use x11vnc as an alternative to OSXvnc (aka Vine Server), | 
 |    or Apple Remote Desktop (ARD). Perhaps there is some x11vnc feature | 
 |    you'd like to use on Mac OS X, etc. For a number of activities (e.g. | 
 |    window drags) it seems to be faster than OSXvnc. | 
 |  | 
 |    Notes: | 
 |  | 
 |    X11:  x11vnc will also work (as it has for years) with a X11 server | 
 |    (XDarwin) running on Mac OS X (people often install this software to | 
 |    display remote X11 apps on their Mac OS X system, or use some old | 
 |    favorites locally such as xterm.) However in this case x11vnc will | 
 |    only work reasonably in single window -id windowid mode (and the | 
 |    window may need to have mouse focus.) | 
 |  | 
 |    If you do not have the DISPLAY env. variable set, x11vnc will assume | 
 |    native Aqua/Quartz on Mac OS X, however if DISPLAY is set it will | 
 |    assume an X11 connection. Use "-rawfb console" to force the native | 
 |    display (or unset DISPLAY.) | 
 |  | 
 |    Update: Leopard sets DISPLAY by default in all sessions. Since it | 
 |    starts with the string "/tmp/" x11vnc will use that to know if it | 
 |    should ignore it. Use "-display :0.0" to force it. | 
 |  | 
 |    Building:  If you don't have the X11 build and runtime packages | 
 |    installed you will need to build it like this: | 
 |    (cd to the e.g. x11vnc-0.9, source directory) | 
 |    ./configure --without-x | 
 |    make | 
 |  | 
 |    Win2VNC/x2vnc:  One handy use is to use the -nofb mode to redirect | 
 |    mouse and keyboard input to a nearby Mac (i.e. one to the side of your | 
 |    desk) via x2vnc or Win2VNC. See this FAQ for more info. | 
 |  | 
 |    Options:  Here are the Mac OS X specific x11vnc options: | 
 |    -macnodim              For the native Mac OS X server, disable dimming. | 
 |    -macnosleep            For the native Mac OS X server, disable display sleep | 
 | . | 
 |    -macnosaver            For the native Mac OS X server, disable screensaver. | 
 |    -macnowait             For the native Mac OS X server, do not wait for the | 
 |                           user to switch back to his display. | 
 |    -macwheel n            For the native Mac OS X server, set the mouse wheel | 
 |                           speed to n (default 5.) | 
 |    -macnoswap             For the native Mac OS X server, do not swap mouse | 
 |                           buttons 2 and 3. | 
 |    -macnoresize           For the native Mac OS X server, do not resize or rese | 
 | t | 
 |                           the framebuffer even if it is detected that the scree | 
 | n | 
 |                           resolution or depth has changed. | 
 |    -maciconanim n         For the native Mac OS X server, set n to the number | 
 |                           of milliseconds that the window iconify/deiconify | 
 |                           animation takes.  In -ncache mode this value will be | 
 |                           used to skip the animation if possible. (default 400) | 
 |    -macmenu               For the native Mac OS X server, in -ncache client-sid | 
 | e | 
 |                           caching mode, try to cache pull down menus (not perfe | 
 | ct | 
 |                           because they have animated fades, etc.) | 
 |  | 
 |    PasteBoard/Clipboard:   There is a bug that the Clipboard (called | 
 |    PasteBoard on Mac it appears) exchange will not take place unless | 
 |    x11vnc was started from inside the Aqua display (e.g. started inside a | 
 |    Terminal app window.) Otherwise it cannot connect to the PasteBoard | 
 |    server. So Clipboard exchange won't work for our standard "ssh in" | 
 |    startup scheme. | 
 |  | 
 |    Hopefully this deficiency can be removed, but until then for Clipboard | 
 |    exchange to work you will need to start x11vnc inside the desktop | 
 |    session (i.e. either start it running before you leave, or start up a | 
 |    2nd x11vnc inside from a 1st one started outside, or use the apple | 
 |    script below) | 
 |  | 
 |    Here also is a osascript trick that seems to work (it opens the | 
 |    Terminal app and instructs it to start x11vnc): | 
 |  | 
 | #!/bin/sh | 
 | # | 
 | # start_x11vnc: start x11vnc in a Terminal window | 
 | # (this will allow Clipboard/Pasteboard exchange to work) | 
 |  | 
 | tmp=/tmp/start_x11vnc.$$ | 
 |  | 
 | cat > $tmp <<END | 
 |  | 
 | tell application "Terminal" | 
 |         activate | 
 |         do script with command "$HOME/x11vnc -rfbauth .vnc/passwd -ssl SAVE" | 
 | end tell | 
 |  | 
 | END | 
 |  | 
 | osascript $tmp | 
 | rm -f $tmp | 
 |  | 
 |    where you should customize the x11vnc command line to your needs and | 
 |    the full path to the binary. Save it in a file e.g. "start_x11vnc" and | 
 |    then after you SSH in just type "./start_x11vnc" (or have ssh run the | 
 |    command for you.) Then once you are connected via VNC, iconify the | 
 |    Terminal windows (you can't delete them since that will kill x11vnc.) | 
 |  | 
 |    Update Aug/2010: A user reports the following useful information: | 
 | This is not a problem on Mac OS X 10.6.x (Snow Leopard) when connecting | 
 | via ssh to start x11vnc.  And, on Mac OS X 10.5.x (Leopard), the problem | 
 | can be permanently eliminated by doing this: | 
 |  | 
 |  | 
 | sudo /usr/libexec/PlistBuddy -c 'delete :LimitLoadToSessionType' \ | 
 |    -c 'add :LimitLoadToSessionType string Background' \ | 
 |    /System/Library/LaunchAgents/com.apple.pboard.plist | 
 | # ignore any 'Delete: Entry, ":LimitLoadToSessionType", Does Not Exist' message | 
 |  | 
 | and then restarting (yes, you must restart not just log off).  But | 
 | ONLY do that for Mac OS X 10.5.x and NOT for 10.6.x (which doesn't | 
 | need it anyway). | 
 |  | 
 |    We recently got access to a MacOSX 10.6.4 (Snow Leopard) macbook and | 
 |    have confirmed that the above is correct. | 
 |  | 
 |  | 
 |    Q-120: Can x11vnc be used as a VNC reflector/repeater to improve | 
 |    performance for the case of a large number of simultaneous VNC viewers | 
 |    (e.g. classroom broadcasting or a large demo)? | 
 |  | 
 |    Yes, as of Feb/2007 there is the "-reflect host:N" option to connect | 
 |    to the VNC server "host:N" (either another x11vnc or any other VNC | 
 |    server) and re-export it. VNC viewers then connect to the x11vnc(s) | 
 |    running -reflect. | 
 |  | 
 |    The -reflect option is the same as: "-rawfb vnc:host:N". See the | 
 |    -rawfb description under "VNC HOST" for more details. | 
 |  | 
 |    You can replace "host:N" with "listen" or "listen:port" for reverse | 
 |    connections. | 
 |  | 
 |    One can set up a number of such reflectors/repeaters to spread the | 
 |    resource usage around, e.g.: | 
 |        C -------<-------| | 
 |        C -------<-------| | 
 |        C -------<-------|---- R -----| | 
 |        C -------<-------|            | | 
 |        C -------<-------|            | | 
 |                                      | | 
 |        C -------<-------|            | | 
 |        C -------<-------|            | | 
 |        C -------<-------|---- R -----| | 
 |        C -------<-------|            | | 
 |        C -------<-------|            | | 
 |                                      |====== S | 
 |        C -------<-------|            | | 
 |        C -------<-------|            | | 
 |        C -------<-------|---- R -----| | 
 |        C -------<-------|            | | 
 |        C -------<-------|            | | 
 |                                      | | 
 |        C -------<-------|            | | 
 |        C -------<-------|            | | 
 |        C -------<-------|---- R -----| | 
 |        C -------<-------| | 
 |        C -------<-------| | 
 |  | 
 |    Where "S" is the original VNC Server, "C" denote VNC viewer clients, | 
 |    and "R" denotes an x11vnc running -reflect to "S". | 
 |  | 
 |    Ideally, a client "C" will be fairly close network-wise to its "R". It | 
 |    is fine to run the "R" on the same machine as one of its "C's". A nice | 
 |    setup for a large, (e.g. 64-128) viewer classroom broadcast case would | 
 |    be to run R's on areas isolated by network switches, e.g. one R per | 
 |    switch. | 
 |  | 
 |    In an extreme case (e.g. 1000 viewers) one might actually need a 2nd | 
 |    layer of R's in the tree. If you try something like that let us know! | 
 |  | 
 |    There are many resource savings in doing something like the above. The | 
 |    first obvious one is network bandwidth savings. Another is less CPU | 
 |    load on "S" since it handles many fewer simultaneous connections. | 
 |    Also, if there are a few clients C on very slow links, their presence | 
 |    does not slow down every other client, just the clients on their "R". | 
 |    One way a slow client affects things is if there are some large | 
 |    framebuffer writes (e.g. jpeg image region) then the repeater may | 
 |    block waiting for that large write to finish before going onto the | 
 |    next client (however, if the write is small enough, the kernel will | 
 |    buffer it and the server can go on to service the next client.) | 
 |  | 
 |    The x11vnc -reflect implementation uses the libvncclient library in | 
 |    the LibVNCServer project to handle the connection to "S". It is not | 
 |    currently very efficient since it simply does its normal framebuffer | 
 |    polling scheme on the libvncclient framebuffer (which it then | 
 |    re-exports via VNC to its clients C.) However, CopyRect and | 
 |    CursorShape encodings are preserved in the reflection and that helps. | 
 |    Dragging windows with the mouse can be a problem (especially if S is | 
 |    not doing wireframing somehow, consider -nodragging if the problem is | 
 |    severe) For a really fast reflector/repeater it would have to be | 
 |    implemented from scratch with performance in mind. See these other | 
 |    projects: | 
 |     http://sourceforge.net/projects/vnc-reflector/, | 
 |     http://www.tightvnc.com/projector/                (closed source?), | 
 |  | 
 |  | 
 |    Automation via Reverse Connections:   Instead of having the R's | 
 |    connect directly to S and then the C's connect directly to the R they | 
 |    should use, some convenience can be achieved by using reverse | 
 |    connections (the x11vnc ""-connect host1,host2,..." option.) Suppose | 
 |    all the clients "C" are started up in Listen mode: | 
 |     client1>  vncviewer -listen | 
 |     client2>  vncviewer -listen | 
 |     client3>  vncviewer -listen | 
 |     ... | 
 |     client64> vncviewer -listen | 
 |  | 
 |    (e.g. client1> is the cmdline prompt on machine client1 ... etc) and | 
 |    all the repeaters R are started like this: | 
 |     repeater1> x11vnc -reflect listen -connect client1,client2,...client8 | 
 |     repeater2> x11vnc -reflect listen -connect client9,client10,...client16 | 
 |     ... | 
 |     repeater8> x11vnc -reflect listen -connect client57,client58,...client64 | 
 |  | 
 |    and finally the main server is started to kick the whole thing into | 
 |    motion: | 
 |     vncserver> x11vnc -display :0 -connect repeater1,repeater2,...repeater8 | 
 |  | 
 |    (or instruct a non-x11vnc VNC server to reverse connect to the | 
 |    repeaters.) For a classroom broadcasting setup one might have the | 
 |    first two sets of commands start automatically at bootup or when | 
 |    someone logs in, and then start everything up with the S server. One | 
 |    may even be able to script the forward connection bootstrap case, let | 
 |    us know what you did. A really nice thing would be some sort of | 
 |    auto-discovery of your repeater, etc... | 
 |  | 
 |    Q-121: Can x11vnc be used during a Linux, Solaris, etc. system | 
 |    Installation so the Installation can be done remotely? | 
 |  | 
 |    This can be done, but it doesn't always work because it depends on how | 
 |    the OS does its install. We have to "sneak in" somehow. Note that some | 
 |    OS's have a remote install (ssh etc.) built in and so you might want | 
 |    to use that instead. | 
 |  | 
 |    Usually the OS install will have to be a network-install in order to | 
 |    have networking up during the install. Otherwise, you may have a | 
 |    (slim) chance to configure the networking manually (ifconfig(8) and | 
 |    route(8).) | 
 |  | 
 |    To avoid library dependencies problems in the typical minimal (e.g. | 
 |    busybox) installation OS it is a good idea to build a statically | 
 |    linked x11vnc binary. A way that often works is to do a normal build | 
 |    and then paste the final x11vnc link line into a shell script. Then | 
 |    change the "gcc" to "gcc -static" and run the shell script. You may | 
 |    need to disable features (e.g. "--without-xfixes") if there is not a | 
 |    static library for the feature available. You may also need to add | 
 |    extra link options (e.g. "-lXrender") to complete library dependencies | 
 |    manually. | 
 |  | 
 |    Let's call the binary x11vnc.static. Place it on a webserver | 
 |    somewhere. It may be possible to retrieve it via scp(1) too. | 
 |  | 
 |    During the install you need to get a shell to retreive x11vnc.static | 
 |    and run it. | 
 |  | 
 |    If the Solaris install is an older X-based one, there will be a menu | 
 |    for you to get a terminal window. From that window you might be able | 
 |    to retrieve x11vnc.static via wget, scp, or ftp. Remember to do "chmod | 
 |    755 ./x11vnc.static" and then find the -auth file as in this FAQ. | 
 |  | 
 |    If it is a Linux install that uses an X server (e.g. SuSE and probably | 
 |    Fedora), then you can often get a shell by pressing Ctrl-Alt-F2 or | 
 |    similar. Then get the x11vnc binary via something like this: | 
 |    cd /tmp | 
 |    wget http://192.168.0.22/x11vnc.static | 
 |    chmod 755 ./x11vnc.static | 
 |  | 
 |    Find the name of the auth file as in this FAQ. (maybe run "ps wwaux | | 
 |    grep auth".) Then run it like this: | 
 |    ./x11vnc.static -forever -nopw -display :0 -auth /tmp/wherever/the/authfile | 
 |  | 
 |    then press Alt-F7 to go back to the X install. You should now be able | 
 |    to connect via a vnc viewer and continue the install. Watch out for | 
 |    the display being :1, etc. | 
 |  | 
 |    If there is a firewall blocking incoming connections during the | 
 |    install, use the "-connect hostname" option option for a reverse | 
 |    connection to the hostname running the VNC viewer in listen mode. | 
 |  | 
 |    Debian based installs are either console-text or console-framebuffer | 
 |    based. These are install (or expert) and installgui (or expertgui) | 
 |    boot lines, respectively. For the console-text based installs you | 
 |    probably need to add a boot cmd line option like vga=0x314 (which is | 
 |    800x600x16) to get the console-text to use the linux framebuffer | 
 |    device properly. | 
 |  | 
 |    For a Debian console-text based install after the network is | 
 |    configured press Ctrl-Alt-F2 to get a shell. Retrieve the binary via | 
 |    wget as above and chmod 755 it. Then run it something like this: | 
 |    sleep 10; ./x11vnc.static -forever -nopw -rawfb console | 
 |  | 
 |    then before the sleep is over press Alt-F1 to get back to the install | 
 |    virtual console. You should be able to connect via a VNC viewer and | 
 |    continue with the install. | 
 |  | 
 |    For a recent (2009) Debian install we booted with "expert vga=0x301" | 
 |    and "expert vga=0x311" to get console text based installs at 640x480x8 | 
 |    and 640x480x16, respectively (replace "expert" with "install" if you | 
 |    like.) Otherwise it was giving a 16 color 640x480x4 (4 bit per pixel) | 
 |    display which x11vnc could not handle. | 
 |  | 
 |    For Debian console-framebuffer GUI based installs (installgui or | 
 |    expertgui) we have not be able to enter keystrokes or mouse motions. | 
 |    This may be resolved if the install had the Linux kernel module | 
 |    uinput, but it doesn't; one can wget uinput.ko and then run insmod on | 
 |    it, but the module must match the installation kernel. So, failing | 
 |    that, you can only do the GUI view-only, which can be handy to watch a | 
 |    long network install from your desk instead of in front of the machine | 
 |    being installed. For these, after the network is configured press | 
 |    Ctrl-Alt-F2 to get a shell. Retrieve the binary via wget as above and | 
 |    chmod 755 it. Then run it something like this: | 
 |    sleep 10; ./x11vnc.static -forever -nopw -rawfb console | 
 |  | 
 |    then before the sleep is over press Alt-F5 to get back to the GUI | 
 |    install console. You should be able to connect via a VNC viewer and | 
 |    watch the install. | 
 |    [Misc: Clipboard, File Transfer/Sharing, Printing, Sound, Beeps, | 
 |    Thanks, etc.] | 
 |  | 
 |    Q-122: Does the Clipboard/Selection get transferred between the | 
 |    vncviewer and the X display? | 
 |  | 
 |    As of Jan/2004 x11vnc supports the "CutText" part of the RFB (aka VNC) | 
 |    protocol. When text is selected/copied in the X session that x11vnc is | 
 |    polling it will be sent to connected VNC viewers. And when CutText is | 
 |    received from a VNC viewer then x11vnc will set the X11 selections | 
 |    PRIMARY, CLIPBOARD, and CUTBUFFER0 to it. x11vnc is able to hold the | 
 |    PRIMARY and CLIPBOARD selections (Xvnc does not seem to do this.) | 
 |  | 
 |    The X11 selections can be confusing, especially to those coming from | 
 |    Windows or MacOSX where there is just a single 'Clipboard'. The X11 | 
 |    CLIPBOARD selection is a lot like that of Windows and MacOSX, e.g. | 
 |    highlighted text is sent to the clipboard when the user activates | 
 |    "Edit -> Copy" or presses "Control+C" (and pasting it via "Edit -> | 
 |    Paste" or "Control+V".) The X11 PRIMARY selection has been described | 
 |    as 'for power users' or 'an Easter Egg'. As soon as text is | 
 |    highlighted it is set to the PRIMARY selection and so it is | 
 |    immediately ready for pasting, usually via the Middle Mouse Button or | 
 |    "Shift+Insert". See this jwz link for more information. | 
 |  | 
 |    x11vnc's default behavior is to watch both CLIPBOARD and PRIMARY and | 
 |    whenever one of them changes, it sends the new text to connected | 
 |    viewers. Note that since the RFB protocol only has a single "CutText" | 
 |    then both selections are "merged" to some degree (and this can lead to | 
 |    confusing results.) One user was confused why x11vnc was "forgetting" | 
 |    his CLIPBOARD selection and the reason was he also changed PRIMARY | 
 |    some time after he copied text to the clipboard. Usually an app will | 
 |    set PRIMARY as soon as any text is highlighted so it easy to see how | 
 |    CLIPBOARD was forgotten. Use the -noprimary described below as a | 
 |    workaround. Similarly, by default when x11vnc receives CutText it sets | 
 |    both CLIPBOARD and PRIMARY to it (this is probably less confusing, but | 
 |    could possibly lead to some failure modes as well.) | 
 |  | 
 |    You may not like these defaults. Here are ways to change the behavior: | 
 |      * If you don't want the Clipboard/Selection exchanged at all use the | 
 |        -nosel option. | 
 |      * If you want changes in PRIMARY to be ignored use the -noprimary | 
 |        option. | 
 |      * If you want changes in CLIPBOARD to be ignored use the | 
 |        -noclipboard option. | 
 |      * If you don't want x11vnc to set PRIMARY to the "CutText" received | 
 |        from viewers use the -nosetprimary option. | 
 |      * If you don't want x11vnc to set CLIPBOARD to the "CutText" | 
 |        received from viewers use the -nosetclipboard option. | 
 |  | 
 |    You can also fine-tune it a bit with the -seldir dir option and also | 
 |    -input. | 
 |  | 
 |    You may need to watch out for desktop utilities such as KDE's | 
 |    "Klipper" that do odd things with the selection, clipboard, and | 
 |    cutbuffers. | 
 |  | 
 |  | 
 |    Q-123: Can I use x11vnc to record a Shock Wave Flash (or other format) | 
 |    video of my desktop, e.g. to record a tutorial or demo? | 
 |  | 
 |    Yes, it is possible with a number of tools that record VNC and | 
 |    transform it to swf format or others. One such popular tool is | 
 |    pyvnc2swf. There are a number of tutorials (broken link?) on how to do | 
 |    this. Another option is to use the vnc2mpg that comes in the | 
 |    LibVNCServer package. | 
 |    An important thing to remember when doing this is that tuning | 
 |    parameters should be applied to x11vnc to speed up its polling for | 
 |    this sort of application, e.g. "-wait 10 -defer 10". | 
 |  | 
 |    Q-124: Can I transfer files back and forth with x11vnc? | 
 |  | 
 |    As of Oct/2005 and May/2006 x11vnc enables, respectively, the TightVNC | 
 |    and UltraVNC file transfer implementations that were added to | 
 |    libvncserver. This currently works with TightVNC and UltraVNC viewers | 
 |    (and Windows viewers only support filetransfer it appears... but they | 
 |    do work to some degree under Wine on Linux.) | 
 |  | 
 |    The SSVNC Unix VNC viewer supports UltraVNC file transfer by use of a | 
 |    Java helper program. | 
 |  | 
 |    TightVNC file transfer is off by default, if you want to enable it use | 
 |    the -tightfilexfer option. | 
 |  | 
 |    UltraVNC file transfer is off by default, to enable it use something | 
 |    like "-rfbversion 3.6 -permitfiletransfer" | 
 |    options (UltraVNC incorrectly uses the RFB protocol version to | 
 |    determine if its features are available, so x11vnc has to pretend to | 
 |    be version 3.6.) As of Sep/2006 "-ultrafilexfer" is an alias for these | 
 |    two options. Note that running as RFB version 3.6 may confuse other | 
 |    VNC Viewers. | 
 |  | 
 |    Sadly you cannot do both -tightfilexfer and -ultrafilexfer at the same | 
 |    time because the latter requires setting the version to 3.6 and | 
 |    tightvnc will not do filetransfer when it sees that version number. | 
 |  | 
 |    Also, because of the way the LibVNCServer TightVNC file transfer is | 
 |    implemented, you cannot do Tightvnc file transfer in -unixpw mode. | 
 |    However, UltraVNC file transfer does work in -unixpw (but if a client | 
 |    tries it do a filetransfer during the login process it will be | 
 |    disconnected.) | 
 |  | 
 |    IMPORTANT: please understand if -ultrafilexfer or -tightfilexfer is | 
 |    specified and you run x11vnc as root for, say, inetd or display | 
 |    manager (gdm, kdm, ...) access and you do not have it switch users via | 
 |    the -users option, then VNC Viewers that connect are able to do | 
 |    filetransfer reads and writes as *root*. | 
 |  | 
 |    The UltraVNC and TightVNC settings can be toggled on and off inside | 
 |    the gui or by -R remote control. However for TightVNC the changed | 
 |    setting only applies for NEW clients, current clients retain their | 
 |    TightVNC file transfer ability. For UltraVNC it works better, however | 
 |    if an UltraVNC client has initiated a file transfer dialog it will | 
 |    remain in effect until the dialog is closed. If you want to switch | 
 |    between UltraVNC and TightVNC file transfer in the gui or by remote | 
 |    control you will probably be foiled by the "-rfbversion 3.6" issue. | 
 |  | 
 |  | 
 |    Q-125: Which UltraVNC extensions are supported? | 
 |  | 
 |    Some of them are supported. To get UltraVNC Viewers to attempt to use | 
 |    these extensions you will need to supply this option to x11vnc: | 
 |    -rfbversion 3.6 | 
 |  | 
 |    Or use -ultrafilexfer which is an alias for the above option and | 
 |    "-permitfiletransfer". UltraVNC evidently treats any other RFB version | 
 |    number as non-UltraVNC. | 
 |  | 
 |    Here are a list of the UltraVNC extensions supported by x11vnc: | 
 |      * ServerInput: "Toggle Remote Input and Remote Blank Monitor" | 
 |      * FileTransfer: "Open File Transfer..." | 
 |      * SingleWindow: "Select Single Window..." | 
 |      * TextChat: "Open Chat..." | 
 |      * 1/n Server Scaling | 
 |  | 
 |    The SSVNC Unix VNC viewer supports these UltraVNC extensions. | 
 |  | 
 |    To disable SingleWindow and ServerInput use -noultraext (the others | 
 |    are managed by LibVNCServer.) See this option too: -noserverdpms. | 
 |  | 
 |    Also, the UltraVNC repeater proxy is supported for use with reverse | 
 |    connections: "-connect repeater://host:port+ID:NNNN". Use it for both | 
 |    plaintext and SSL connections. This mode can send any string before | 
 |    switching to the VNC protocol, and so could be used with other | 
 |    proxy/gateway tools. Also, a perl repeater implemention is here: | 
 |    ultravnc_repeater.pl | 
 |  | 
 |  | 
 |    Q-126: Can x11vnc emulate UltraVNC's Single Click helpdesk mode for | 
 |    Unix? I.e. something very simple for a naive user to initiate a | 
 |    reverse vnc connection from their Unix desktop to a helpdesk | 
 |    operator's VNC Viewer. | 
 |  | 
 |    Yes, UltraVNC's Single Click (SC) mode can be emulated fairly well on | 
 |    Unix. | 
 |  | 
 |    We use the term "helpdesk" below, but it could be any sort of remote | 
 |    assistance you want to set up, e.g. something for Unix-using friends | 
 |    or family to use. This includes Mac OS X. | 
 |  | 
 |    Assume you create a helpdesk directory "hd" on your website: | 
 |    http://www.mysite.com/hd (any website that you can upload files to | 
 |    should work, although remember the user will be running the programs | 
 |    you place there.) | 
 |  | 
 |    In that "hd" subdirectory copy an x11vnc binary to be run on the Unix | 
 |    user's machine (e.g. Linux, etc) and also create a file named "vnc" | 
 |    containing the following: | 
 | #!/bin/sh | 
 |  | 
 | webhost="http://www.mysite.com/hd"  # Your helpdesk dir URL. | 
 |  | 
 | vnchost="ip.someplace.net"          # Your host running 'vncviewer -listen' | 
 |                                     # It could also be your IP number. If it is | 
 |                                     # a router/firewall, you will need to | 
 |                                     # configure it to redirect port 5500 to you | 
 | r | 
 |                                     # workstation running 'vncviewer -listen' | 
 |  | 
 | dir=/tmp/vnc_helpdesk.$$            # Make a temporary working dir. | 
 | mkdir $dir || exit 1 | 
 | cd $dir || exit 1 | 
 |  | 
 | trap "cd /tmp; rm -rf $dir" 0 2 15  # Cleans up on exit. | 
 |  | 
 | wget $webhost/x11vnc                # Fetch x11vnc binary.  If multi- | 
 | chmod 755 ./x11vnc                  # platform, use $webhost/`uname`/x11vnc | 
 |                                     # or similar. | 
 |  | 
 | ./x11vnc -connect_or_exit $vnchost -rfbport 0 -nopw | 
 |  | 
 |    with the hostnames / IP addresses customized to your case. | 
 |  | 
 |    On the helpdesk VNC viewer machine (ip.someplace.net in this example) | 
 |    you have the helpdesk operator running VNC viewer in listen mode: | 
 |    vncviewer -listen | 
 |  | 
 |    or if on Windows, etc. somehow have the VNC viewer be in "listen" | 
 |    mode. | 
 |  | 
 |    Then, when the naive user needs assistance you instruct him to open up | 
 |    a terminal window on his Unix desktop and paste the following into the | 
 |    shell: | 
 |    wget -qO - http://www.mysite.com/hd/vnc | sh - | 
 |  | 
 |    and then press Enter. You could have this instruction on a web page or | 
 |    in an email you send him, etc. This requires that the wget is | 
 |    installed on the user's Unix machine (he might only have curl or lynx, | 
 |    see below for more info.) | 
 |  | 
 |  | 
 |    So I guess this is about 3-4 clicks (start a terminal and paste) and | 
 |    pressing "Enter" instead of "single click"... | 
 |  | 
 |    See this page for some variations on this method, e.g. how to add a | 
 |    password, SSL Certificates, etc. | 
 |  | 
 |  | 
 |    If you don't have a website (there are many free ones) or don't want | 
 |    to use one you will have to email him all of the ingredients (x11vnc | 
 |    binary and a launcher script) and tell him how to run it. This could | 
 |    be easy or challenging depending on the skill of the naive unix | 
 |    user... | 
 |  | 
 |    A bit of obscurity security could be put in with a -passwd, -rfbauth | 
 |    options, etc. (note that x11vnc will require a password even for | 
 |    reverse connections.) More info here. | 
 |  | 
 |  | 
 |    Firewalls: If the helpdesk (you) with the vncviewer is behind a | 
 |    NAT/Firewall/Router the router will have to be configured to redirect | 
 |    a port (i.e. 5500 or maybe different one if you like) to the vncviewer | 
 |    machine. If the vncviewer machine also has its own host-level | 
 |    firewall, you will have to open up the port there as well. | 
 |  | 
 |    NAT-2-NAT: There is currently no way to go "NAT-2-NAT", i.e. both User | 
 |    and Helpdesk workstations behind NAT'ing Firewall/Routers without | 
 |    configuring a router to do a port redirection (i.e. on your side, the | 
 |    HelpDesk.) To avoid modifying either firewall/router, one would need | 
 |    some public (IP address reachable on the internet) redirection/proxy | 
 |    service. Perhaps such a thing exists. http://sc.uvnc.com provides this | 
 |    service for their UltraVNC Single Click users. | 
 |  | 
 |    Update: It may be possible to do "NAT-2-NAT" with a UDP tunnel such as | 
 |    http://samy.pl/pwnat/. All that is required is that both NAT firewalls | 
 |    allow in UDP packets from an IP address to which a UDP packet has | 
 |    recently been sent to. If you try it out let us know how it went. | 
 |  | 
 |  | 
 |    Very Naive Users: | 
 |  | 
 |    If it is beyond the user how to open a terminal window and paste in a | 
 |    command (you have my condolences...) you would have to somehow setup | 
 |    his Web browser to download the "vnc" file (or a script containing the | 
 |    above wget line) and prompt the user if he wants to run it. This may | 
 |    be tricky to set up (which is probably a good thing to not have the | 
 |    web browser readily run arbitrary programs downloaded from the | 
 |    internet...) | 
 |  | 
 |    One command-line free way, tested with KDE, is to name the file vnc.sh | 
 |    and then instruct the user to right-click on the link and do "Save | 
 |    Link As" to his Desktop. It will appear as an icon, probably one that | 
 |    looks like a terminal or a command line prompt. He next should | 
 |    right-click on the icon and select "Properties" and go to the | 
 |    "Permissions" tab. Then in that dialog select the checkbox "Is | 
 |    executable". He should then be able to click on the icon to launch it. | 
 |    Another option is to right-click on the icon and select "Open With -> | 
 |    Other ..." and for the name of the application type in "/bin/sh". | 
 |    Unfortunately in both cases the command output is lost and so errors | 
 |    cannot be debugged as easily. A similar thing appears to work in GNOME | 
 |    if under "Properties -> Permissions" they click on "Execute" checkbox | 
 |    for "Owner". Then when they click on the icon, they will get a dialog | 
 |    where they can select "Run in Terminal". In general for such cases, if | 
 |    it is feasible, it might be easier to ssh to his machine and set | 
 |    things up yourself... | 
 |  | 
 |  | 
 |    SSL Encrypted Helpdesk Connections: | 
 |  | 
 |    As of Apr/2007 x11vnc supports reverse connections in SSL and so we | 
 |    can do this. On the Helpdesk side (Viewer) you will need STUNNEL or | 
 |    better use the Enhanced TightVNC Viewer (SSVNC) package we provide | 
 |    that automates all of the SSL for you. | 
 |  | 
 |    To do this create a file named "vncs" in the website "hd" directory | 
 |    containing the following: | 
 | #!/bin/sh | 
 |  | 
 | webhost="http://www.mysite.com/hd"  # Your helpdesk dir URL. | 
 |  | 
 | vnchost="ip.someplace.net"          # Your host running 'vncviewer -listen' | 
 |                                     # It could also be your IP number. If it is | 
 |                                     # a router/firewall, you will need to | 
 |                                     # configure it to redirect port 5500 to you | 
 | r | 
 |                                     # workstation running 'vncviewer -listen' | 
 |  | 
 | dir=/tmp/vnc_helpdesk.$$            # Make a temporary working dir. | 
 | mkdir $dir || exit 1 | 
 | cd $dir || exit 1 | 
 |  | 
 | trap "cd /tmp; rm -rf $dir" 0 2 15  # Cleans up on exit. | 
 |  | 
 | wget $webhost/x11vnc                # Fetch x11vnc binary.  If multi- | 
 | chmod 755 ./x11vnc                  # platform, use $webhost/`uname`/x11vnc | 
 |                                     # or similar. | 
 |  | 
 | ./x11vnc -connect_or_exit $vnchost -rfbport 0 -nopw -ssl    # Note -ssl option. | 
 |  | 
 |    with the hostnames or IP addresses customized to your case. | 
 |  | 
 |    The only change from the "vnc" above is the addition of the -ssl | 
 |    option to x11vnc. This will create a temporary SSL cert: openssl(1) | 
 |    will need to be installed on the user's end. A fixed SSL cert file | 
 |    could be used to avoid this (and provide some authentication; more | 
 |    info here.) | 
 |  | 
 |    The naive user will be doing this: | 
 |    wget -qO - http://www.mysite.com/hd/vncs | sh - | 
 |  | 
 |    (or perhaps even use https:// if available.) | 
 |  | 
 |    But before that, the helpdesk operator needs to have "vncviewer | 
 |    -listen" running as before, however he needs an SSL tunnel at his end. | 
 |    The easiest way to do this is use Enhanced TightVNC Viewer (SSVNC). | 
 |    Start it, and select Options -> 'Reverse VNC Connection (-listen)'. | 
 |    Then UN-select 'Verify All Certs' (this can be enabled later if you | 
 |    want; you'll need the x11vnc SSL certificate), and click 'Listen'. | 
 |  | 
 |    If you don't want to use SSVNC for the viewer, but rather set up | 
 |    STUNNEL manually instead, make a file "stunnel.cfg" containing: | 
 | foreground = yes | 
 | pid = | 
 |  | 
 | [vnc] | 
 | accept = 5500 | 
 | connect = localhost:5501 | 
 |  | 
 |    and run: | 
 |   stunnel ./stunnel.cfg | 
 |  | 
 |    and then start the "vncviewer -listen 1" (i.e. 1 to correspond to the | 
 |    5501 port.) Note that this assumes the stunnel install created a | 
 |    Server SSL cert+key, usually /etc/stunnel/stunnel.pem (not all distros | 
 |    will do this.) Also, that file is by default only readable by root, so | 
 |    stunnel needs to be run as root. If your system does not have a key | 
 |    installed or you do not want to run stunnel as root (or change the | 
 |    permissions on the file), you can use x11vnc to create one for you for | 
 |    example: | 
 |   x11vnc -sslGenCert server self:mystunnel | 
 |  | 
 |    answer the prompts with whatever you want; you can take the default | 
 |    for all of them if you like. The openssl(1) package must be installed. | 
 |    See this link and this one too for more info on SSL certs. This | 
 |    creates $HOME/.vnc/certs/server-self:mystunnel.pem, then you would | 
 |    change the "stunnel.cfg" to look something like: | 
 | foreground = yes | 
 | pid = | 
 | cert = /home/myusername/.vnc/certs/server-self:mystunnel.pem | 
 |  | 
 | [vnc] | 
 | accept = 5500 | 
 | connect = localhost:5501 | 
 |  | 
 |    In any event, with stunnel having been setup, the naive user is | 
 |    instructed to paste in and run: | 
 |    wget -qO - http://www.mysite.com/hd/vncs | sh - | 
 |  | 
 |    to pick up the vncs script this time. | 
 |  | 
 |    Of course if a man-in-the-middle can alter what the user downloads | 
 |    then all bets are off!. | 
 |  | 
 |    More SSL variations and info about certificates can be found here. | 
 |  | 
 |  | 
 |    OpenSSL libssl.so.0.9.7 problems: | 
 |  | 
 |    If you build your own stunnel or x11vnc for deployment, you may want | 
 |    to statically link libssl.a and libcrypto.a into it because Linux | 
 |    distros are currently a bit of a mess regarding which version of | 
 |    libssl is installed. | 
 |  | 
 |    You will find the details here. | 
 |  | 
 |  | 
 |    Q-127: Can I (temporarily) mount my local (viewer-side) Windows/Samba | 
 |    File share on the machine where x11vnc is running? | 
 |  | 
 |    You will have to use an external network redirection for this. | 
 |    Filesystem mounting is not part of the VNC protocol. | 
 |  | 
 |    We show a simple Samba example here. | 
 |  | 
 |    First you will need a tunnel to redirect the SMB requests from the | 
 |    remote machine to the one you sitting at. We use an ssh tunnel: | 
 |   sitting-here> ssh -C -R 1139:localhost:139 far-away.east | 
 |  | 
 |    Or one could combine this with the VNC tunnel at the same time, e.g.: | 
 |   sitting-here> ssh -C -R 1139:localhost:139 -t -L 5900:localhost:5900 far-away | 
 | .east 'x11vnc -localhost -display :0' | 
 |  | 
 |    Port 139 is the Windows Service port. For Windows systems instead of | 
 |    Samba, you may need to use the actual IP address of the Window machine | 
 |    instead of "localhost" in the -R option (since the Windows service | 
 |    does not listen on localhost by default.) | 
 |  | 
 |    Note that we use 1139 instead of 139 on the remote side because 139 | 
 |    would require root permission to listen on (and you may have a samba | 
 |    server running on it already.) | 
 |  | 
 |    The ssh -C is to enable compression, which might speed up the data | 
 |    transfers. | 
 |  | 
 |    Depending on the remote system side configuration, it may or may not | 
 |    be possible to mount the SMB share as a non-root user. Try it first as | 
 |    a non-root user and if that fails you will have to become root. | 
 |  | 
 |    We will assume the user name is "fred" and we will try to mount the | 
 |    viewer-side Windows SMB share "//haystack/pub" in | 
 |    /home/fred/smb-haystack-pub. | 
 |   far-away> mkdir -p /home/fred/smb-haystack-pub | 
 |   far-away> smbmount //haystack/pub /home/fred/smb-haystack-pub -o username=fre | 
 | d,ip=127.0.0.1,port=1139 | 
 |  | 
 |    (The 2nd command may need to be run as root.) Then run "df" or "ls -l | 
 |    /home/fred/smb-haystack-pub" to see if it is mounted properly. Consult | 
 |    the smbmount(8) and related documentation (it may require some | 
 |    fiddling to get write permissions correct, etc.) To unmount: | 
 |   far-away> smbumount /home/fred/smb-haystack-pub | 
 |  | 
 |    At some point we hope to fold some automation for SMB ssh redir setup | 
 |    into the Enhanced TightVNC Viewer (SSVNC) package we provide (as of | 
 |    Sep 2006 it is there for testing.) | 
 |  | 
 |  | 
 |    Q-128: Can I redirect CUPS print jobs from the remote desktop where | 
 |    x11vnc is running to a printer on my local (viewer-side) machine? | 
 |  | 
 |    You will have to use an external network redirection for this. | 
 |    Printing is not part of the VNC protocol. | 
 |  | 
 |    We show a simple Unix to Unix CUPS example here. Non-CUPS port | 
 |    redirections (e.g. LPD) should also be possible, but may be a bit more | 
 |    tricky. If you are viewing on Windows SMB and don't have a local cups | 
 |    server it may be trickier still (see below.) | 
 |  | 
 |    First you will need a tunnel to redirect the print requests from the | 
 |    remote machine to the one you sitting at. We use an ssh tunnel: | 
 |   sitting-here> ssh -C -R 6631:localhost:631 far-away.east | 
 |  | 
 |    Or one could combine this with the VNC tunnel at the same time, e.g.: | 
 |   sitting-here> ssh -C -R 6631:localhost:631 -t -L 5900:localhost:5900 far-away | 
 | .east 'x11vnc -localhost -display :0' | 
 |  | 
 |    Port 631 is the default CUPS port. The above assumes you have a Cups | 
 |    server running on your viewer machine (localhost:631), if not, use | 
 |    something like my-cups-srv:631 (the viewer-side Cups server) in the -R | 
 |    instead. | 
 |  | 
 |    Note that we use 6631 instead of 631 on the remote side because 631 | 
 |    would require root permission to listen on (and you likely have a cups | 
 |    server running on it already.) | 
 |  | 
 |    Now the tricky part: to get applications to notice your cups | 
 |    server/printer on localhost:6631. | 
 |  | 
 |    If you have administrative privilege (i.e. root password) on the | 
 |    x11vnc side where the desktop is running, it should be easy to add the | 
 |    printer through some configuration utility (e.g. in KDE: Utilities -> | 
 |    Printing -> Printing Manager, and then supply admin password, and then | 
 |    Add Printer/Class, and then fill in the inquisitive wizard. Most | 
 |    important is the "Remote IPP server" panel where you put in localhost | 
 |    for Host and 6631 for Port.) The main setting you want to convey is | 
 |    the host is localhost and the port is non-standard (e.g. 6631.) Some | 
 |    configuration utilities will take an Internet Printing Protocol (IPP) | 
 |    URI, e.g. http://localhost:6631/printers/, | 
 |    ipp://localhost:6631/printers/printer-name, | 
 |    ipp://localhost:6631/ipp/printer-name, etc. Check your CUPS | 
 |    documentation and admin interfaces to find what the syntax is and what | 
 |    the "printer name" is. | 
 |  | 
 |    If you do not have root or print admin privileges, but are running a | 
 |    recent (version 1.2 or greater) of the Cups client software, then an | 
 |    easy way to temporarily switch Cups servers is to create the directory | 
 |    and file: $HOME/.cups/client.conf on the remote side with a line like: | 
 |   ServerName localhost:6631 | 
 |  | 
 |    When not using x11vnc for remote access you can comment the above line | 
 |    out with a '#' (or rename the client.conf file), to have normal cups | 
 |    operation. | 
 |  | 
 |    Unfortunately, running applications may need to be restarted to notice | 
 |    the new printers (libcups does not track changes in client.conf.) | 
 |    Depending on circumstances, a running application may actually notice | 
 |    the new printers without restarting (e.g. no print dialog has taken | 
 |    place yet, or there are no CUPS printers configured on the remote | 
 |    side.) | 
 |  | 
 |    Cups client software that is older (1.1) does not support appending | 
 |    the port number, and for newer ones there is a bug preventing it from | 
 |    always working (fixed in 1.2.3.) Kludges like these at the command | 
 |    line will work: | 
 |   far-away> env CUPS_SERVER=localhost IPP_PORT=6631 lpstat -p -d | 
 |   far-away> env CUPS_SERVER=localhost IPP_PORT=6631 lpr -P myprinter file.ps | 
 |   far-away> env CUPS_SERVER=localhost IPP_PORT=6631 firefox | 
 |  | 
 |    but are somewhat awkward since you have to retroactively set the env. | 
 |    var IPP_PORT. Its value cannot be broadcast to already running apps | 
 |    (like the $HOME/.cups/client.conf trick sometimes does.) A common | 
 |    workaround for an already running app is to somehow get it to "Print | 
 |    To File", e.g. file.ps and then use something like the lpr example | 
 |    above. Also, the option "-h host:port" works with CUPS lp(1) and | 
 |    lpr(1). | 
 |  | 
 |    You can also print to Windows shares printers in principle. You may do | 
 |    this with the smbspool(8) command, or configure the remote CUPS via | 
 |    lpadmin(8), etc, to use a printer URI something like | 
 |    smb://machine:port/printer (this may have some name resolution | 
 |    problems WRT localhost.) Also, as with SMB mounting, the port redir | 
 |    (-R) to the Windows machine must use the actual IP address instead of | 
 |    "localhost". | 
 |  | 
 |    At some point we hope to fold some automation for CUPS ssh redir setup | 
 |    into the Enhanced TightVNC Viewer (SSVNC) package we provide (as of | 
 |    Sep 2006 it is there for testing.) | 
 |  | 
 |  | 
 |    Q-129: How can I hear the sound (audio) from the remote applications | 
 |    on the desktop I am viewing via x11vnc? | 
 |  | 
 |    You will have to use an external network audio mechanism for this. | 
 |    Audio is not part of the VNC protocol. | 
 |  | 
 |    We show a simple Unix to Unix esd example here (artsd should be | 
 |    possible too, we have also verified the esd Windows port works for the | 
 |    method described below.) | 
 |  | 
 |    First you will need a tunnel to redirect the audio from the remote | 
 |    machine to the one you sitting at. We use an ssh tunnel: | 
 |   sitting-here> ssh -C -R 16001:localhost:16001 far-away.east | 
 |  | 
 |    Or one could combine this with the VNC tunnel at the same time, e.g.: | 
 |   sitting-here> ssh -C -R 16001:localhost:16001 -t -L 5900:localhost:5900 far-a | 
 | way.east 'x11vnc -localhost -display :0' | 
 |  | 
 |    Port 16001 is the default ESD uses. So when an application on the | 
 |    remote desktop makes a sound it will connect to this tunnel and be | 
 |    redirected to port 16001 on the local machine (sitting-here in this | 
 |    example.) The -C option is an attempt to compress the audio a little | 
 |    bit. | 
 |  | 
 |    So we next need a local (sitting-here) esd daemon running that will | 
 |    receive those requests and play them on the local sound device: | 
 |   sitting-here> esd -promiscuous -port 16001 -tcp -bind 127.0.0.1 | 
 |  | 
 |    See the esd(1) man page for the meaning of the options (the above are | 
 |    not very secure.) (This method also works with the EsounD windows port | 
 |    esd.exe) | 
 |  | 
 |    To test this sound tunnel, we use the esdplay program to play a simple | 
 |    .wav file: | 
 |   far-away> esdplay -s localhost:16001 im_so_happy.wav | 
 |  | 
 |    If you hear the sound (Captain Kirk in this example), that means you | 
 |    are in great shape. | 
 |  | 
 |    To run individual audio applications you can use the esddsp(1) | 
 |    command: | 
 |   far-away> esddsp -s localhost:16001 xmms | 
 |  | 
 |    Then you could try playing some sounds inside xmms. You could also set | 
 |    the environment variable ESPEAKER=localhost:16001 to not need to | 
 |    supply the -s option all the time. (for reasons not clear, sometimes | 
 |    esddsp can figure it out on its own.) All the script esddsp does is to | 
 |    set ESPEAKER and LD_PRELOAD for you so that when the application opens | 
 |    the sound device (usually /dev/dsp) its interactions with the device | 
 |    will be intercepted and sent to the esd daemon running on sitting-here | 
 |    (that in turn writes them to the real, local /dev/dsp.) | 
 |  | 
 |    Redirecting All sound: | 
 |  | 
 |    It does not seem to be possible to switch all of the sound of the | 
 |    remote machine from its sound device to the above esd+ssh tunnel | 
 |    without some preparation. But it can be done reasonably well if you | 
 |    prepare (i.e. restart) the desktop with this in mind. | 
 |  | 
 |    Here is one way to redirect all sound. The idea is we run the entire | 
 |    desktop with sound directed to localhost:16001. When we are sitting at | 
 |    far-away.east we run "esd -promiscuous -port 16001 -tcp -bind | 
 |    127.0.0.1" on far-away.east (to be able to hear the sound.) However, | 
 |    when we are sitting at sitting-here.west we kill that esd process and | 
 |    run that same esd command on sitting-here.west and start up the above | 
 |    ssh tunnel. This is a little awkward, but with some scripts one would | 
 |    probably kill and restart the esd processes automatically when x11vnc | 
 |    is used. | 
 |  | 
 |    So next we have to run the whole desktop pointing toward our esd. Here | 
 |    is a simple way to test. Log in to the machine via the "FailSafe" | 
 |    desktop. Then in the lone terminal type something like: | 
 |   esddsp -s localhost:16001 gnome-session | 
 | or: | 
 |   esddsp -s localhost:16001 startkde | 
 |  | 
 |    where the last part is whatever command starts your desktop (even | 
 |    fvwm2.) This causes the environment variables ESPEAKER and LD_PRELOAD | 
 |    to be set appropriately and every application (processes with the | 
 |    desktop as an ancestor) will use them. If this scheme works well you | 
 |    can make it less klunky by adding the command to your ~/.xsession, | 
 |    etc. file that starts your default desktop. Or you may be able to | 
 |    configure your desktop to use localhost:16001, or whatever is needed, | 
 |    via a gui configuration panel. Some Notes: | 
 |      * Not all audio applications are compatible with the esd and artsd | 
 |        mechanisms, but many are. | 
 |      * The audio is not compressed so you probably need a broadband or | 
 |        faster connection. Listening to music may not be very pleasant... | 
 |        (Although we found streaming music from across the US over cable | 
 |        modem worked OK, but took 200 KB/sec, to use less bandwidth | 
 |        consider something like "ssh far-away.east 'cat favorite.mp3' | | 
 |        mpg123 -b 4000 -") | 
 |      * Linux does not seem to have the concept of LD_PRELOAD_64 so if you | 
 |        run on a mixed 64- and 32-bit ABI system (e.g. AMD x86_64) some of | 
 |        the applications will fail to run because LD_PRELOAD will point to | 
 |        libraries of the wrong wordsize. | 
 |      * At some point we hope to fold some automation for esd or artsd ssh | 
 |        redir setup into the Enhanced TightVNC Viewer (SSVNC) package we | 
 |        provide (as of Sep/2006 it is there for testing.) | 
 |  | 
 |  | 
 |    Q-130: Why don't I hear the "Beeps" in my X session (e.g. when typing | 
 |    tput bel in an xterm)? | 
 |  | 
 |    As of Dec/2003 "Beep" XBell events are tracked by default. The X | 
 |    server must support the XKEYBOARD extension (this is not on by default | 
 |    in Solaris, see Xserver(1) for how to turn it on via +kb), and so you | 
 |    won't hear them if the extension is not present. | 
 |  | 
 |    If you don't want to hear the beeps use the -nobell option. If you | 
 |    want to hear the audio from the remote applications, consider trying a | 
 |    redirector such as esd. | 
 |  | 
 |  | 
 |    Q-131: Does x11vnc work with IPv6? | 
 |  | 
 |    Update: as of Apr/2010 in the 0.9.10 x11vnc development tarball, there | 
 |    is now built-in support for IPv6 (128 bit internet addresses.) See the | 
 |    -6 and -connect options for details. | 
 |  | 
 |    The remainder of this FAQ entry shows how to do with this with pre | 
 |    0.9.10 x11vnc using IPv6 helper tools. | 
 |      _________________________________________________________________ | 
 |  | 
 |    Using an external IPv6 helper: | 
 |    A way to do this is via a separate helper program such as inetd (or | 
 |    for encrypted connections: ssh or stunnel.) For example, you configure | 
 |    x11vnc to be run from inetd or xinetd and instruct it to listen on an | 
 |    IPv6 address. For xinetd the setting "flags = IPv6" will be needed. | 
 |    For inetd.conf, an example is: | 
 |   5900 stream tcp6 nowait root /usr/sbin/tcpd /usr/local/bin/x11vnc_wrapper.sh | 
 |  | 
 |    We also provide a transitional tool in "x11vnc/misc/inet6to4" that | 
 |    acts as a relay for any IPv4 application to allow connections over | 
 |    IPv6. For example: | 
 |   inet6to4 5900 localhost:5900 | 
 |  | 
 |    where x11vnc is listening on IPv4 port 5900. | 
 |  | 
 |    Also note that not all VNC Viewers are IPv6 enabled, so a redirector | 
 |    may also be needed for them. The tool "inet6to4 -r ..." can do this as | 
 |    well. SSVNC (see below) supports IPv6 without need for the helper. | 
 |  | 
 |   # ./inet6to4 -help | 
 |  | 
 |   inet6to4:  Act as an ipv6-to-ipv4 relay for tcp applications that | 
 |              do not support ipv6. | 
 |  | 
 |   Usage:     inet6to4 | 
 |              inet6to4 -r | 
 |  | 
 |   Examples:  inet6to4 5900 localhost:5900 | 
 |              inet6to4 8080 web1:80 | 
 |              inet6to4 -r 5900 fe80::217:f2ff:fee6:6f5a%eth0:5900 | 
 |  | 
 |   The -r option reverses the direction of translation (e.g. for ipv4 | 
 |   clients that need to connect to ipv6 servers.)  Reversing is the default | 
 |   if this script is named 'inet4to6' (e.g. by a symlink.) | 
 |  | 
 |   Use Ctrl-C to stop this program. | 
 |  | 
 |   You can also set env. vars INET6TO4_LOOP=1 or INET6TO4_LOOP=BG | 
 |   to have an outer loop restarting this program (BG means do that | 
 |   in the background), and INET6TO4_LOGFILE for a log file. | 
 |   Also set INET6TO4_VERBOSE to verbosity level and INET6TO4_WAITTIME | 
 |   and INET6TO4_PIDFILE (see below.) | 
 |  | 
 |    The "INET6TO4_LOOP=BG" and "INET6TO4_LOGFILE=..." env. variables make | 
 |    the tool run reliably as a daemon for very long periods. Read the top | 
 |    part of the script for more information. | 
 |      _________________________________________________________________ | 
 |  | 
 |    Encrypted Tunnels with IPv6 Support: | 
 |    For SSH tunnelled encrypted VNC connections, one can of course use the | 
 |    IPv6 support in ssh(1). | 
 |  | 
 |    For SSL encrypted VNC connections, one possibility is to use the IPv6 | 
 |    support in stunnel(1). This includes the built-in support via the | 
 |    -stunnel option. For example: | 
 |   x11vnc -stunnel SAVE -env STUNNEL_LISTEN=:: -env STUNNEL_DEBUG=1 ... | 
 |      _________________________________________________________________ | 
 |  | 
 |    SSH IPv6 Tricks: | 
 |    It is interesting to note that ssh(1) can do basically the same thing | 
 |    as inet6to4 above by: | 
 |   ssh -g -L 5900:localhost:5901 localhost "printf 'Press Enter to Exit: '; read | 
 |  x" | 
 |  | 
 |    (where we have x11vnc running via "-rfbport 5901" in this case.) | 
 |  | 
 |    Note that one can also make a home-brew SOCKS5 ipv4-to-ipv6 gateway | 
 |    proxy using ssh like this: | 
 |   ssh -D '*:1080' localhost "printf 'Press Enter to Exit: '; read x" | 
 |  | 
 |    then specify a proxy like socks://hostname:1080 where hostname is the | 
 |    machine running the above ssh command (add -v to ssh for connection | 
 |    logging info.) | 
 |      _________________________________________________________________ | 
 |  | 
 |    IPv6 SSVNC Viewer: | 
 |    Our SSVNC VNC Viewer is basically a wrapper for ssh(1) and stunnel(1), | 
 |    and so it already has good IPv6 support because these two commands do. | 
 |    On Unix, MacOSX, and Windows nearly all of the the remaining parts of | 
 |    SSVNC (e.g. the built-in proxying and un-encrypted connections) have | 
 |    been modified to support IPv6 in SSVNC 1.0.26. | 
 |  | 
 |  | 
 |  | 
 |  | 
 |  | 
 |  | 
 |     Contributions: | 
 |  | 
 |    Q-132: Thanks for your program or for your help! Can I make a | 
 |    donation? | 
 |  | 
 |    Please do (any amount is appreciated; very few have donated) and thank | 
 |    you for your support! Click on the PayPal button below for more info. | 
 |  | 
 |    [x-click-but04.gif]-Submit | 
 | 	 | 
 | ======================================================================= | 
 | http://www.karlrunge.com/x11vnc/chainingssh.html: | 
 |  | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |    Chaining ssh's: Note that for use of a ssh gateway and -L redirection | 
 |    to an internal host (e.g. "-L 5900:otherhost:5900") the VNC traffic | 
 |    inside the firewall is not encrypted and you have to manually log into | 
 |    otherhost to start x11vnc. Kyle Amon shows a method where you chain | 
 |    two ssh's together that encrypts all network traffic and also | 
 |    automatically starts up x11vnc on the internal workstation: | 
 | #!/bin/sh | 
 | # | 
 | gateway="example.com"   # or "[email protected]" | 
 | host="labyrinth"        # or "user@hostname" | 
 | user="kyle" | 
 |  | 
 | # Need to sleep long enough for all of the passwords and x11vnc to start up. | 
 | # The </dev/null below makes the vncviewer prompt for passwd via popup window. | 
 | # | 
 | (sleep 10; vncviewer -encodings "copyrect tight zrle zlib hextile" \ | 
 |     localhost:0 </dev/null >/dev/null) & | 
 |  | 
 | # Chain the vnc connection thru 2 ssh's, and connect x11vnc to user's display: | 
 | # | 
 | exec /usr/bin/ssh -t -L 5900:localhost:5900 $gateway \ | 
 |      /usr/bin/ssh -t -L 5900:localhost:5900 $host \ | 
 |      sudo /usr/bin/x11vnc -localhost -auth /home/$user/.Xauthority \ | 
 |          -rfbauth .vnc/passwd -display :0 | 
 |  | 
 |    Also note the use of sudo(1) to switch to root so that the different | 
 |    user's .Xauthority file can be accessed. See the visudo(8) manpage for | 
 |    details on how to set this up (remove the sudo if you do not want to | 
 |    do this). One can also chain together ssh's for reverse connections | 
 |    with vncviewers using the -listen option. For this case -R would | 
 |    replace the -L (and 5500 the 5900, see the #2 example script above). | 
 |    If the gateway machine's sshd is configured with GatewayPorts=no (the | 
 |    default) then the double chaining of "ssh -R ..." will be required for | 
 |    reverse connections to work. | 
 | 	 | 
 | ======================================================================= | 
 | http://www.karlrunge.com/x11vnc/miscbuild.html: | 
 |  | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |    Misc. Build problems:   We collect here rare build problems some users | 
 |    have reported and the corresponding workarounds. See also the FAQ's on | 
 |    building. | 
 |      _________________________________________________________________ | 
 |  | 
 |    ENV parameter: One user had a problem where the build script below was | 
 |    failing because his work environment had the ENV variable set to a | 
 |    script that was resetting his PATH so that gcc could no longer be | 
 |    found. Make sure you do not have any ENV or BASH_ENV in your | 
 |    environment doing things like that. Typing "unset ENV", etc. before | 
 |    configuring and building should clear it. | 
 |      _________________________________________________________________ | 
 |  | 
 |    Bash xpg: One user had his bash shell compiled with | 
 |    --enable-xpg-echo-default that causes some strange behavior with | 
 |    things like echo "\\1 ..." the configure script executes. In | 
 |    particular instead of getting "\1" the non-printable character "^A" is | 
 |    produced, and causes failures at compile time like: | 
 |   ../rfb/rfbconfig.h:9:22: warning: extra tokens at end of #ifndef directive | 
 |  | 
 |    The workaround is to configure like this: | 
 |   env CONFIG_SHELL=/bin/sh /bin/sh ./configure | 
 |  | 
 |    i.e. avoid using the bash with the misbehavior. A bug has been filed | 
 |    against autoconf to guard against this. | 
 |      _________________________________________________________________ | 
 |  | 
 |    AIX: one user had to add the "X11.adt" package to AIX to get build | 
 |    header files like XShm.h, etc. | 
 |      _________________________________________________________________ | 
 |  | 
 |    Ubuntu Feisty Fawn 7.04: In May/2007 one user said he needed to add | 
 |    these packages to compile x11vnc on that Linux distro and version: | 
 |   apt-get install build-essential make bin86 libjpeg62-dev libssl-dev libxtst-d | 
 | ev | 
 |  | 
 |    Note that Ubuntu is based on Debian, so perhaps this is the list | 
 |    needed on Debian (testing?) as well. To build in Avahi (mDNS service | 
 |    advertising) support it would appear that libavahi-client-dev is | 
 |    needed as well. | 
 |      _________________________________________________________________ | 
 |  | 
 |    Exceedingly slow compilation: x11vnc has a couple of files which | 
 |    contain very large "case statements" (over 100 cases) that on some | 
 |    platforms can take a very long time to compile (in extreme cases over | 
 |    an hour). However on 32bit Linux with intel/amd processor and gcc | 
 |    these files usually take less than 10 seconds to compile. For 64bit | 
 |    systems using gcc the problem appears to be much worse. | 
 |  | 
 |    The two files with the large number of cases, remote.c and x11vnc.c, | 
 |    have no real need to be optimized (the code is used only very | 
 |    infrequently). So it is fine to supply "-O0" (disables optimization) | 
 |    to CFLAGS when compiling them. However, it is tricky with | 
 |    autoconf/automake to do this (especially since both the compiler and | 
 |    make versions have a big effect). | 
 |  | 
 |    So if the compile times are getting too long for you for these two | 
 |    files you will need to manually change some things. First, run | 
 |    configure and when it has finished, edit the generated file | 
 |    x11vnc/Makefile and put these lines at the very top: | 
 | x11vnc-x11vnc.o :  CFLAGS += -O0 | 
 | x11vnc-remote.o :  CFLAGS += -O0 | 
 |  | 
 |    Those lines assume gnu make (gmake) is being used. If you are using | 
 |    another make, say Solaris make, insert these instead: | 
 | x11vnc-x11vnc.o := CFLAGS += -O0 | 
 | x11vnc-remote.o := CFLAGS += -O0 | 
 |  | 
 |    You could write a build shell script that modified the Makefile this | 
 |    way before running make. | 
 |  | 
 |    The "-O0" (note it is "capital Oh" followed by "zero") assumes the gcc | 
 |    compiler. If you are using a different compiler you will need to find | 
 |    the command line option to disable optimization, or otherwise have the | 
 |    lines set CFLAGS to the empty string. | 
 |      _________________________________________________________________ | 
 |  | 
 |    Broken Thread Local Storage on SuSE 9.2: Starting with x11vnc 0.9.8 | 
 |    the bundled libvncserver uses the __thread keyword to make some of the | 
 |    encodings (i.e. tight) thread safe (multiple VNC clients can be using | 
 |    tight at the same time in x11vnc -threads mode.) Evidently on the old | 
 |    SuSE 9.2 system the compiler does not support the thread local storage | 
 |    properly. Here is an example build failure: | 
 | tight.c:1126: error: unrecognizable insn: | 
 | (insn:HI 11 10 13 0 (nil) (set (reg/f:SI 59) | 
 |         (const:SI (plus:SI (symbol_ref:SI ("%lpalette")) | 
 |                 (const_int 2048 [0x800])))) -1 (nil) | 
 |     (expr_list:REG_EQUAL (const:SI (plus:SI (symbol_ref:SI ("%lpalette")) | 
 |                 (const_int 2048 [0x800]))) | 
 |         (nil))) | 
 | tight.c:1126: internal compiler error: in extract_insn, at recog.c:2175 | 
 | Please submit a full bug report, | 
 | with preprocessed source if appropriate. | 
 | See URL:http://www.suse.de/feedback for instructions. | 
 |  | 
 |    The workaround is to disable thread local storage at configure time | 
 |    like this: | 
 | env CPPFLAGS="-DTLS=''" ./configure | 
 |  | 
 |    and then build it. | 
 |      _________________________________________________________________ | 
 | 	 | 
 | ======================================================================= | 
 | http://www.karlrunge.com/x11vnc/sunray.html: | 
 |  | 
 |  | 
 |     Sun Ray Notes: | 
 |  | 
 |    You can run x11vnc on your (connected or disconnected) SunRay session | 
 |    (Please remember to use settings like -wait 200, -sb 15, and not | 
 |    running a screensaver animation (blank instead) to avoid being a | 
 |    resource hog! x11vnc does induce a lot of memory I/O from polling the | 
 |    X server. It also helps to have a solid background color, e.g. | 
 |    -solid). | 
 |  | 
 |    News: Sun Ray Remote Control Toolkit: See the nice set of tools in the | 
 |    Sun Ray Remote Control Toolkit that launch x11vnc automatically for | 
 |    you for certain usage modes. | 
 |  | 
 |    You have to know the name of the machine your SunRay session X server | 
 |    is running on (so you can ssh into it and start x11vnc). You also need | 
 |    to know the X11 DISPLAY number for the session: on a SunRay it could | 
 |    be a large number, e.g. :137, since there are many people with X | 
 |    sessions (Xsun processes) on the same machine. If you don't know it, | 
 |    you can get it by running who(1) in a shell on the SunRay server and | 
 |    looking for the dtlocal entry with your username (and if you don't | 
 |    even know which server machine has your session, you could login to | 
 |    all possible ones looking at the who output for your username...). | 
 |  | 
 |    I put some code in my ~/.dtprofile script that stores $DISPLAY | 
 |    (including the hostname) in a ~/.sunray_current file at session | 
 |    startup (and deletes it when the X session ends) to make it easy to | 
 |    get at the hostname and X11 display number info for my current X | 
 |    sessions when I ssh in and am about to start x11vnc. | 
 |  | 
 |    SunRay Gotcha #1:   Note that even though your SunRay X11 DISPLAY is | 
 |    something like :137, x11vnc still tries for port 5900 as its listening | 
 |    port if it can get it, in which case the VNC display (i.e. the | 
 |    information you supply to the VNC viewer) is something like | 
 |    sunray-server:0   (note the :0 corresponding to port 5900, it is not | 
 |    :137). If it cannot get 5900, it tries for 5901, and so on. You can | 
 |    also try to force the port (and thereby the VNC display) using the | 
 |    -rfbport NNNN option. | 
 |  | 
 |    Especially on a busy Sun Ray server it is often difficult to find free | 
 |    ports for both VNC and the HTTP Java applet server to listen on. This | 
 |    script, vnc_findports may be of use for doing this automatically. It | 
 |    suggests x11vnc command line options based on netstat output that | 
 |    lists the occupied ports. It is even more difficult to start | 
 |    vncserver/Xvnc on a busy Sun Ray because then 3 ports (HTTP, VNC, and | 
 |    X11), all separated by 100 are needed! This script, findvncports may | 
 |    be helpful as well. Both scripts start at VNC display :10 and work | 
 |    their way up. | 
 |  | 
 |    SunRay Gotcha #2:   If you get an error like: | 
 |         shmget(tile) failed. | 
 |         shmget: No space left on device | 
 |  | 
 |    when starting up x11vnc that most likely means all the shared memory | 
 |    (shm) slots are filled up on your machine. The Solaris default is only | 
 |    100, and that can get filled up in a week or so on a SunRay server | 
 |    with lots of users. If the shm slot is orphaned (e.g. creator process | 
 |    dies) the slot is not reclaimed. You can view the shm slots with the | 
 |    "ipcs -mA" command. If there are about 100 then you've probably hit | 
 |    this problem. They can be cleaned out (by the owner or by root) using | 
 |    the ipcrm command. I wrote a script shm_clear that finds the orphans | 
 |    and lists or removes them. Longer term, have your SunRay sysadmin add | 
 |    something like this to /etc/system: | 
 |         set shmsys:shminfo_shmmax = 0x2000000 | 
 |         set shmsys:shminfo_shmmni = 0x1000 | 
 |  | 
 |    SunRay Gotcha #3:   Some SunRay installations have implemented | 
 |    suspending certain applications when a SunRay session is in a | 
 |    disconnected state (e.g. Java Badge pulled out, utdetach, etc). This | 
 |    is a good thing because it limits hoggy or runaway apps from wasting | 
 |    the shared CPU resource. Think how much CPU and memory I/O is wasted | 
 |    by a bunch of Firefox windows running worthless Flash animations while | 
 |    your session is disconnected! | 
 |  | 
 |    So some sites have implemented scripts to suspend (e.g. kill -STOP) | 
 |    certain apps when your badge is removed from the SunRay terminal. When | 
 |    you reattach, it kill -CONT them. This causes problems for viewing the | 
 |    detached SunRay session via x11vnc: those suspended apps will not | 
 |    respond (their windows will be blank or otherwise inactive). | 
 |  | 
 |    What to do? Well, since you are going to be using the application you | 
 |    might as well unfreeze it rather than starting up a 2nd instance. Here | 
 |    is one way to do it using the kill -CONT mechanism: | 
 |    kill -CONT `ps -ealf | grep ' T ' | grep $LOGNAME | awk '{print $4}'` | 
 |  | 
 |    If you want to be a good citizen and re-freeze them before you exit | 
 |    x11vnc this script could be of use: | 
 | #!/bin/sh | 
 | # | 
 | # kill -STOP/-CONT script for x11vnc (or other) SunRay usage ("freezes" | 
 | # certain apps from hogging resources when disconnected). | 
 | # | 
 | # Put here a pattern that matches the apps that are frozen: | 
 | # | 
 | appmatch="java_vm|jre|netscape-bin|firefox-bin|realplay|acroread|mozilla-bin" | 
 |  | 
 | if [ "X$1" = "Xfreeze" ]; then | 
 |         pkill -STOP -U $LOGNAME "$appmatch" | 
 | elif [ "X$1" = "Xthaw" ]; then | 
 |         pkill -CONT -U $LOGNAME "$appmatch" | 
 |  | 
 | elif [ "$RFB_MODE" = "afteraccept" -a "$RFB_STATE" = "NORMAL" ]; then | 
 |         # a valid x11vnc login. | 
 |         if [ "$RFB_CLIENT_COUNT" = "1" ]; then | 
 |                 # only one client present. | 
 |                 pkill -CONT -U $LOGNAME "$appmatch" | 
 |         fi | 
 | elif [ "$RFB_MODE" = "gone" -a "$RFB_STATE" = "NORMAL" ]; then | 
 |         # a valid x11vnc login. | 
 |         if [ "$RFB_CLIENT_COUNT" = "0" ]; then | 
 |                 # last client present has just left. | 
 |                 pkill -STOP -U $LOGNAME "$appmatch" | 
 |         fi | 
 | fi | 
 | exit 0 | 
 |  | 
 |    If you called the script "goodcitizen" you could type "goodcitizen | 
 |    thaw" to unfreeze them, and then "goodcitizen freeze" to refreeze | 
 |    them. One could also use these x11vnc options "-afteraccept | 
 |    goodcitizen -gone goodcitizen" to do it automatically. | 
 |  | 
 |    SunRay Gotcha #4:   Recent versions of the Sun Ray Server Software | 
 |    SRSS (seems to be version 3.0 or 3.1) have a "misfeature" that when | 
 |    the session is disconnected (i.e. badge/smartcard out) the screen | 
 |    locker (xscreensaver) will freeze the X server just when the "Enter | 
 |    Password" dialog box appears. So you cannot unlock the screen remotely | 
 |    via x11vnc! | 
 |  | 
 |    Update: please see Bob Doolittle's detailed description of the this | 
 |    issue at the bottom of this section. | 
 |  | 
 |    Here "freeze" means "stop other X clients from inserting keyboard and | 
 |    mouse input and from viewing the current contents of the screen". Or | 
 |    something like that; the upshot is x11vnc can't do its normal thing. | 
 |  | 
 |    There are several workarounds for this. | 
 |  | 
 |    1) The easiest one by far is to put these lines in your | 
 |    $HOME/.dtprofile file: | 
 | SUN_SUNRAY_UTXLOCK_PREF="/usr/openwin/bin/xlock -mode blank" | 
 | export SUN_SUNRAY_UTXLOCK_PREF | 
 |  | 
 |    One might argue that xlock isn't particularly "pretty". (Just IMHO, | 
 |    but if something like this not being pretty actually gets in the way | 
 |    of your work I think some introspection may be in order. :-) | 
 |  | 
 |    2) The problem has been traced to the pam_sunray.so PAM module. | 
 |    Evidently xscreensaver invokes this pam module and it communicates | 
 |    with utsessiond who in turn instructs the Xsun server to not process | 
 |    any synthetic mouse/keyboard input or to update the screen | 
 |    framebuffer. It is not clear if this is by design (security?) or | 
 |    something else. | 
 |  | 
 |    In any event, the problem can be avoided, somewhat drastically, by | 
 |    commenting out the corresponding line in /etc/pam.conf: | 
 | #xscreensaver auth sufficient /opt/SUNWut/lib/pam_sunray.so syncondisplay | 
 |  | 
 |    Leave the other xscreensaver pam authentication lines unchanged. The | 
 |    dtsession-SunRay line may also need to be commented out to avoid the | 
 |    problem for CDE sessions. N.B. it is possible the application of a | 
 |    SSRS patch, etc, may re-enable that /etc/pam.conf line. It may be | 
 |    difficult to convince a sysadmin to make this change. | 
 |  | 
 |    3) A more forceful way is to kill the xscreensaver process from a | 
 |    shell prompt whenever you connect via x11vnc and the screen is in a | 
 |    locked state: | 
 | pkill -U $LOGNAME '^xscreensaver$' | 
 |  | 
 |    And then after you are in be sure to restart it by typing something | 
 |    like: | 
 | xscreensaver & | 
 |  | 
 |    You may want to avoid restarting it until you are about to disconnect | 
 |    your VNC viewer (since if it locks the screen while you are working | 
 |    you'll be stuck again). | 
 |  | 
 |    3') The above idea can be done a bit more cleanly by having x11vnc do | 
 |    it. Suppose we called the following script xss_killer: | 
 | #!/bin/sh | 
 | # | 
 | # xss_killer: kill xscreensaver after a valid x11vnc client logs in. | 
 | #             Restart xscreensaver and lock it when the last client | 
 | #             disconnects. | 
 |  | 
 | PATH=/usr/openwin/bin:/usr/bin:$PATH | 
 | export PATH | 
 |  | 
 | if [ "$RFB_MODE" = "afteraccept" -a "$RFB_STATE" = "NORMAL" ]; then | 
 |         # a valid x11vnc login. | 
 |         if [ "$RFB_CLIENT_COUNT" = "1" ]; then | 
 |                 # only one client present. | 
 |                 pkill -U $LOGNAME '^xscreensaver$' | 
 |                 pkill -KILL -U $LOGNAME -f xscreensaver/hacks | 
 |         fi | 
 | elif [ "$RFB_MODE" = "gone" -a "$RFB_STATE" = "NORMAL" ]; then | 
 |         # a valid x11vnc login. | 
 |         if [ "$RFB_CLIENT_COUNT" = "0" ]; then | 
 |                 # last client present has just left. | 
 |                 xscreensaver -nosplash & | 
 |                 sleep 1 | 
 |                 xscreensaver-command -lock & | 
 |         fi | 
 | fi | 
 |  | 
 |    Then we would run x11vnc with these options: "-afteraccept xss_killer | 
 |    -gone xss_killer". The -afteraccept option (introduced in version 0.8) | 
 |    is used to run a command after a vncviewer has successfully logged in | 
 |    (note that this is a VNC login, not a Unix login, so you may not want | 
 |    to do this if you are really paranoid...) | 
 |  | 
 |    Note if you use the above script and also plan to Ctrl-C (SIGINT) | 
 |    x11vnc you have to run the xscreensaver in a new process group to | 
 |    avoid killing it as well. One way to do this is via this kludge: | 
 | perl -e 'setpgrp(0,0); exec "xscreensaver -nosplash &"' | 
 |  | 
 |    in the above script. | 
 |  | 
 |    4) There appears to be a bug in pam_sunray.so in that it doesn't seem | 
 |    to honor the convention that, say, DISPLAY=unix:3 means to use Unix | 
 |    sockets to connect to display 3 on the local machine (this is a bit | 
 |    faster than TCP sockets). Rather, it thinks the display is a non-local | 
 |    one to a machine named "unix" (that usually does not resolve to an IP | 
 |    address). | 
 |  | 
 |    Amusingly, this can be used to bypass the pam_sunray.so blocking of | 
 |    Xsun that prevents one from unlocking the screen remotely via x11vnc. | 
 |    One could put something like this in $HOME/.dtprofile to kill any | 
 |    existing xscreensavers and then start up a fresh xscreensaver using | 
 |    DISPLAY=unix:N | 
 | # stop/kill any running xscreensavers (probably not running yet, but to be sure | 
 | ) | 
 | xscreensaver-command -exit | 
 | pkill -U $LOGNAME '^xscreensaver$' | 
 | env DISPLAY=`echo $DISPLAY | sed -e 's/^.*:/unix:/'` xscreensaver & | 
 |  | 
 |  | 
 |    Important: Note that all of the above workarounds side-step the | 
 |    pam_sunray.so PAM module in one way or another. You'll need to see if | 
 |    that is appropriate for your site's SunRay / smartcard usage. Also, | 
 |    these hacks may break other things and so you may want to test various | 
 |    scenarios carefully. E.g. check corner cases like XDMCP/dtremote, | 
 |    NSCM, etc. | 
 |  | 
 |  | 
 |    Update May 2008: Here is a useful description of this issue from Bob | 
 |    Doolittle who is a developer for Sun Ray at Sun. I don't have the time | 
 |    to digest and distill it and then adjust the above methods to provide | 
 |    a clearer description, so I just include below the description he sent | 
 |    me with the hope that it will help some users: | 
 |  | 
 |      In SRSS 4.0 and earlier, the purpose of pam_sunray.so in the "auth" | 
 |      PAM stack of screensavers is to enable NSCM (and, although this is | 
 |      much less commonly used, "SC", which is configured when 3rd-party | 
 |      software is installed to allow smartcards to be used as part of the | 
 |      authentication process) to work. It should have no effect with | 
 |      smartcards. Currently, however, it does block the PAM stack for all | 
 |      sessions, which causes xscreensaver, when it locks a disconnected | 
 |      session, to not process any mouse or keyboard events as you | 
 |      describe (unless xscreensaver does an X server grab, however, other | 
 |      applications should still be able to draw in the session although | 
 |      xscreensaver may be playing tricks like putting a black window on | 
 |      top of everything). In both of the NSCM and SC models, | 
 |      authentication occurs in a separate session before SRSS will | 
 |      reconnect to the user session, in which case pam_sunray.so causes | 
 |      xscreensaver to just unlock the screen without prompting the user | 
 |      to enter their password again. To do this, pam_sunray.so has to | 
 |      block until the session becomes reconnected, so it can query SRSS | 
 |      at that time to determine whether the user has already | 
 |      authenticated or not. In SRSS 4.0 and earlier releases, | 
 |      pam_sunray.so could have been optimized to not block smartcard | 
 |      sessions, although since the session is disconnected this typically | 
 |      isn't important (except in the x11vnc case, as you've observed). | 
 |  | 
 |      In SRSS 4.1, however, for increased security the out-of-session | 
 |      authentication model has been extended to *all* session types, so | 
 |      pam_sunray.so will be required in all cases unless users are | 
 |      willing to authenticate twice upon hotdesking (e.g. when their card | 
 |      is inserted). In future, we may do away with pam_sunray.so, and in | 
 |      fact with any traditional screen locker in the user session, since | 
 |      SRSS itself will be providing better security than a screen locker | 
 |      running entirely within the user's X session is capable of | 
 |      providing. | 
 |  | 
 |      Your trick of setting DISPLAY to unix:DPY will effectively disable | 
 |      pam_sunray.so (I'm not sure I'd call that a bug - you're going out | 
 |      of your way to do something that wouldn't occur in the normal | 
 |      course of events, and really provides no useful value other than to | 
 |      tickle this behavior in pam_sunray.so). This will mean that, in | 
 |      SRSS 4.0 and earlier releases, users will be prompted for their | 
 |      passwords twice when reconnecting to their sessions for NSCM and SC | 
 |      session types. In 4.1, disabling pam_sunray.so in this way will | 
 |      cause this double-authentication to occur for *all* sessions, | 
 |      including simple smartcard sessions. Users may be willing to pay | 
 |      that price in order to be able to use x11vnc in disconnected | 
 |      sessions. I like this hack, personally. It's a little less | 
 |      convenient than some of the other approaches you describe, but it's | 
 |      lighter-weight and more secure than most of the other approaches, | 
 |      and provides the value of being able to use x11vnc in locked | 
 |      sessions. | 
 |  | 
 |      Here are some other minor notes: - I wouldn't recommend storing | 
 |      your display in your .dtprofile, unless you're willing to live with | 
 |      a single session at a time. Personally, I often find myself using | 
 |      several sessions, in several FoGs, for short periods of time so | 
 |      this would certainly break. IMO it's pretty easy to use $DISPLAY to | 
 |      do what you want on the fly, as needed, so I don't think the price | 
 |      of breaking multiple-session functionality would be worth the | 
 |      convenience, to me at least. Here's some ksh/bash syntax to extract | 
 |      the hostname and display number on the fly which you may find | 
 |      useful: | 
 | HOSTNAME=${DISPLAY%:*} | 
 | FULLDPY=${DISPLAY#*:} | 
 | DPYNUM=${FULLDPY%.*} | 
 |  | 
 |      A final note may give you some insight into other clever hacks in | 
 |      this area: - Check out utaction. It's a very handy little utility | 
 |      that can be run as a daemon in the user session which will invoke a | 
 |      specified command upon session connects and/or disconnects. | 
 |      Personally, I start one up in my .dtprofile as follows: | 
 | utaction -c $HOME/.srconnectrc -d $HOME/.srdisconnectrc & | 
 |  | 
 |      This then allows me to construct a .srconnectrc script containing | 
 |      useful commands I'd like to have run every time I insert my | 
 |      smartcard, and a .srdisconnectrc script of commands to be run every | 
 |      time I remove my smartcard (or, connect/disconnect to my session | 
 |      via NSCM or SC). This can be used for things like notifying a chat | 
 |      client of away status, as well as some of the hacks you've | 
 |      described on your page such as freeze/unfreeze, or perhaps to | 
 |      terminate an xscreensaver and start up a new one with the unix:DPY | 
 |      $DISPLAY specification as you describe (although it probably makes | 
 |      most sense to do this at login time, as opposed to every connect or | 
 |      disconnect event). | 
 | 	 | 
 | ======================================================================= | 
 | http://www.karlrunge.com/x11vnc/ssl.html: | 
 |  | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |    Notes on x11vnc SSL Certificates and Key Management: | 
 |  | 
 |    The simplest scheme ("x11vnc -ssl TMP") is where x11vnc generates a | 
 |    temporary, self-signed certificate each time (automatically using | 
 |    openssl(1)) and the VNC viewer client accepts the certificate without | 
 |    question (e.g. user clicks "Yes" in a dialog box. Perhaps the dialog | 
 |    allows them to view the certificate too). Also note stunnel's default | 
 |    is to quietly accept all certificates. | 
 |  | 
 |    The encryption this provides protects against all passive sniffing of | 
 |    the VNC traffic and passwords on the network and so it is quite good, | 
 |    but it does not prevent a Man-In-The-Middle active attack: e.g. an | 
 |    attacker intercepts the VNC client stream and sends it his own Public | 
 |    key for SSL negotiation (pretending to be the server). Then it makes a | 
 |    connection to SSL x11vnc itself and forwards the data back and forth. | 
 |    He can see all the traffic and modify it as well. | 
 |  | 
 |    Most people don't seem to worry about Man-In-The-Middle attacks these | 
 |    days; they are more concerned about passive sniffing of passwords, | 
 |    etc. Perhaps someday that will change if attack tools are used more | 
 |    widely to perform the attack. NOTE: There are hacker tools like | 
 |    dsniff/webmitm and cain that implement SSL Man-In-The-Middle attacks. | 
 |    They all rely on the client not bothering to check that the cert is | 
 |    valid. | 
 |  | 
 |    If you are not worried about Man-In-The-Middle attacks you do not have | 
 |    to read the techniques described in the rest of this document. | 
 |  | 
 |    To prevent Man-In-The-Middle attacks, certificates must somehow be | 
 |    verified. This requires the VNC client side have some piece of | 
 |    information that can be used to verify the SSL x11vnc server. | 
 |    Alternatively, although rarely done, x11vnc can verify VNC Clients' | 
 |    certificates, see the -sslverify option that is discussed below. | 
 |  | 
 |    There are a number of ways to have the client authenticate the SSL | 
 |    x11vnc server. The quickest way perhaps would be to copy (safely) the | 
 |    certificate x11vnc prints out: | 
 | 26/03/2006 21:12:00 Creating a temporary, self-signed PEM certificate... | 
 | ... | 
 | -----BEGIN CERTIFICATE----- | 
 | MIIC4TCCAkqgAwIBAgIJAMnwCaOjvEKaMA0GCSqGSIb3DQEBBAUAMIGmMQswCQYD | 
 | VQQGEwJBVTEOMAwGA1UEBxMFTGludXgxITAfBgNVBAsTGGFuZ2VsYS0xMTQzNDI1 | 
 | NTIwLjQxMTE2OTEPMA0GA1UEChMGeDExdm5jMS4wLAYDVQQDEyV4MTF2bmMtU0VM | 
 | (more lines) ... | 
 | -----END CERTIFICATE----- | 
 |  | 
 |    to the client machine(s) and have the client's SSL machinery (e.g. | 
 |    stunnel, Web Browser, or Java plugin) import the certificate. That way | 
 |    when the connection to x11vnc is made the client can verify that is it | 
 |    the desired server on the other side of the SSL connection. | 
 |  | 
 |    So, for example suppose the user is using the SSL enabled Java VNC | 
 |    Viewer and has incorporated the x11vnc certificate into his Web | 
 |    browser on the viewing side. If he gets a dialog that the certificate | 
 |    is not verified he knows something is wrong. It may be a | 
 |    Man-In-The-Middle attack, but more likely x11vnc certificate has | 
 |    changed or expired or his browser was reinstalled and/or lost the | 
 |    certificate, etc, etc. | 
 |  | 
 |    As another example, if the user was using stunnel with his VNC viewer | 
 |    (this is mentioned in this FAQ), e.g. STUNNEL.EXE on Windows, then he | 
 |    would have to set the "CAfile = path-to-the-cert" and "verify = 2" | 
 |    options in the stunnel.conf file before starting up the tunnel. If a | 
 |    x11vnc certificate cannot be verified, stunnel will drop the | 
 |    connection (and print a failure message in its log file). | 
 |  | 
 |    A third example, using the VNC viewer on Unix with stunnel the wrapper | 
 |    script can be used this way: "ss_vncviewer -verify ./x11vnc.crt | 
 |    far-away.east:0" where ./x11vnc.crt is the copied certificate x11vnc | 
 |    printed out. | 
 |  | 
 |    As fourth example, our SSVNC enhanced tightvnc viewer can also use | 
 |    these certificate files for server authentication. You can load them | 
 |    via the SSVNC 'Certs...' dialog and set 'ServerCert' to the | 
 |    certificate file you safely copied there. | 
 |  | 
 |    Note that in principle the copying of the certificate to the client | 
 |    machine(s) itself could be altered by a Man-In-The-Middle attack! You | 
 |    can't win; it is very difficult to be completely secure. It is | 
 |    unlikely the attacker could predict how you were going to send it | 
 |    unless you had, say, done it many times before the same way. SSH is a | 
 |    very good way to send it (but of course it too depends on public keys | 
 |    being sent unaltered between the two machines!). | 
 |  | 
 |    If you are really paranoid, I'm sure you'll figure out a really good | 
 |    way to transport the certificates. See the Certificate Authority | 
 |    scheme below for a way to make this easier (you just have to do it | 
 |    once). | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |    Saving SSL certificates and keys: | 
 |  | 
 |    Now, it would be very inconvenient to copy the new temporary | 
 |    certificate every time x11vnc is run in SSL mode. So for convenience | 
 |    there is the "SAVE" keyword to instruct x11vnc to save the certificate | 
 |    it creates: | 
 |   x11vnc -ssl SAVE -display :0 ... | 
 |  | 
 |    This behavior is now the default, you must use "TMP" for a temporary | 
 |    one. It will save the certificate and private key in these files: | 
 |   ~/.vnc/certs/server.crt | 
 |   ~/.vnc/certs/server.pem | 
 |  | 
 |    The ".crt" file contains only the certificate and should be safely | 
 |    copied to the VNC Viewer machine(s) that will be authenticating the | 
 |    x11vnc server. The ".pem" file contains both the certificate and the | 
 |    private key and should be kept secret. (If you don't like the default | 
 |    location ~/.vnc/certs, e.g. it is on an NFS share and you are worried | 
 |    about local network sniffing, use the -ssldir dir option to point to a | 
 |    different directory.) | 
 |  | 
 |    So the next time you run "x11vnc -ssl SAVE ..." it will read the | 
 |    server.pem file directly instead of creating a new one. | 
 |  | 
 |    You can manage multiple SSL x11vnc server keys in this simple way by | 
 |    using: | 
 |   x11vnc -ssl SAVE-key2 -display :0 ... | 
 |  | 
 |    etc, where you put whatever name you choose for the key after "SAVE-". | 
 |    E.g. "-ssl SAVE-fred". | 
 |  | 
 |    Also, if you want to be prompted to possibly change the made up names, | 
 |    etc. that x11vnc creates (e.g. "x11vnc-SELF-SIGNED-CERT-7762" for the | 
 |    CommonName) for the certificates distinguished name (DN), then use | 
 |    "x11vnc -ssl SAVE_PROMPT ...", "x11vnc -ssl SAVE_PROMPT-fred ..." etc. | 
 |    when you create the key the first time. | 
 |  | 
 |    Tip: when prompting, if you choose the CommonName entry to be the full | 
 |    internet hostname of the machine the clients will be connecting to | 
 |    then that will avoid an annoying dialog box in their Web browsers that | 
 |    warn that the CommonName doesn't match the hostname. | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |    Passphrases for server keys: | 
 |  | 
 |    Well, since now with the "SAVE" keyword the certificate and key will | 
 |    be longer lived, one can next worry about somebody stealing the | 
 |    private key and pretending to be the x11vnc server! How to guard | 
 |    against this? | 
 |  | 
 |    The first is that the file is created with perms 600 (i.e. -rw-------) | 
 |    to make it harder for an untrusted user to copy the file. A better way | 
 |    is to also encrypt the private key with a passphrase. You are prompted | 
 |    whether you want to do this or not when the key is first created under | 
 |    "-ssl SAVE" mode ("Protect key with a passphrase? y/n"). It is | 
 |    suggested that you use a passphrase. The inconvenience is every time | 
 |    you run "x11vnc -ssl SAVE ..." you will need to supply the passphrase | 
 |    to access the private key: | 
 |   06/04/2006 11:39:11 using PEM /home/runge/.vnc/certs/server.pem  0.000s | 
 |  | 
 |   A passphrase is needed to unlock an OpenSSL private key (PEM file). | 
 |   Enter passphrase> | 
 |  | 
 |    before x11vnc can continue. | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |    Being your own Certificate Authority: | 
 |  | 
 |    A very sophisticated way that scales well if the number of users is | 
 |    large is to use a Certificate Authority (CA) whose public certificate | 
 |    is available to all of the VNC clients and whose private key has been | 
 |    used to digitally sign the x11vnc server certificate(s). | 
 |  | 
 |    The idea is as follows: | 
 |      * A special CA cert and key is generated. | 
 |      * Its private key is always protected by a good passphrase since it | 
 |        is only used for signing. | 
 |      * The CA cert is (safely) distributed to all machines where VNC | 
 |        clients will run. | 
 |      * One or more x11vnc server certs and keys are generated. | 
 |      * The x11vnc server cert is signed with the CA private key. | 
 |      * x11vnc is run using the server key. (e.g. "-ssl SAVE") | 
 |      * VNC clients (viewers) can now authenticate the x11vnc server | 
 |        because they have the CA certificate. | 
 |  | 
 |    The advantage is the CA cert only needs to be distributed once to the | 
 |    various machines, that can be done even before x11vnc server certs are | 
 |    generated. | 
 |  | 
 |    As above, it is important the CA private key and the x11vnc server key | 
 |    are kept secret, otherwise someone could steal them and pretend to be | 
 |    the CA or the x11vnc server if they copied the key. It is recommended | 
 |    that the x11vnc server keys are also protected via a passphrase (see | 
 |    the previous section). | 
 |  | 
 |    Optionally, VNC viewer certs and keys could also be generated to | 
 |    enable the x11vnc server to authenticate each client. This is not | 
 |    normally done (usually a simple viewer password scheme is used), but | 
 |    this can be useful in some situations. These optional steps go like | 
 |    this: | 
 |      * One or more VNC client certs and keys are generated. | 
 |      * These VNC client certs are signed with the CA private key. | 
 |      * The VNC client certs+keys are safely distributed to the | 
 |        corresponding client machines. | 
 |      * x11vnc is told to verify clients by using the CA cert. (e.g. | 
 |        "-sslverify CA") | 
 |      * When VNC clients (viewers) connect, they must authenticate | 
 |        themselves to x11vnc by using their client key. | 
 |  | 
 |    Again, it is a good idea if the client private keys are protected with | 
 |    a passphrase, otherwise if stolen they could be used to gain access to | 
 |    the x11vnc server. Once distributed to the client machines, there is | 
 |    no need to keep the client key on the CA machine that generated and | 
 |    signed it. You can keep the client certs if you like because they are | 
 |    public. | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |    How to do the above CA steps with x11vnc: | 
 |  | 
 |    Some utility commands are provided to ease the cert+key creation, | 
 |    signing, and management: -sslGenCA, -sslGenCert, -sslDelCert, | 
 |    -sslEncKey, -sslCertInfo. They basically run the openssl(1) command | 
 |    for you to manage the certs/keys. It is required that openssl(1) is | 
 |    installed on the machine and available in PATH. All commands can be | 
 |    pointed to an alternate toplevel certificate directory via the -ssldir | 
 |    option if you don't want to use the default ~/.vnc/certs. | 
 |  | 
 |    1) To generate your Certificate Authority (CA) cert and key run this: | 
 |   x11vnc -sslGenCA | 
 |  | 
 |    Follow the prompts, you can modify any informational strings you care | 
 |    to. You will also be required to encrypt the CA private key with a | 
 |    passphrase. This generates these files: | 
 |   ~/.vnc/certs/CA/cacert.pem             (the CA public certificate) | 
 |   ~/.vnc/certs/CA/private/cakey.pem      (the encrypted CA private key) | 
 |  | 
 |    If you want to use a different directory use -ssldir It must supplied | 
 |    with all subsequent SSL utility options to point them to the correct | 
 |    directory. | 
 |  | 
 |    2) To generate a signed x11vnc server cert and key run this: | 
 |   x11vnc -sslGenCert server | 
 |  | 
 |    As with the CA generation, follow the prompts and you can modify any | 
 |    informational strings that you care to. This will create the files: | 
 |   ~/.vnc/certs/server.crt             (the server public certificate) | 
 |   ~/.vnc/certs/server.pem             (the server private key + public cert) | 
 |  | 
 |    It is recommended to protect the server private key with a passphrase | 
 |    (you will be prompted whether you want to). You will need to provide | 
 |    it whenever you start x11vnc using this key. | 
 |  | 
 |    3) Start up x11vnc using this server key: | 
 |   x11vnc -ssl SAVE -display :0 ... | 
 |  | 
 |    (SAVE corresponds to server.pem, see -sslGenCert server somename info | 
 |    on creating additional server keys, server-somename.crt ...) | 
 |  | 
 |    4) Next, safely copy the CA certificate to the VNC viewer (client) | 
 |    machine(s). Perhaps: | 
 |   scp ~/.vnc/CA/cacert.pem clientmachine:. | 
 |  | 
 |    5) Then the tricky part, make it so the SSL VNC Viewer uses this | 
 |    certificate! There are a number of ways this might be done, it depends | 
 |    on what your client and/or SSL tunnel is. Some examples: | 
 |  | 
 |    For the SSL Java VNC viewer supplied with x11vnc in | 
 |    classes/ssl/VncViewer.jar or classes/ssl/SignedVncViewer.jar: | 
 |      * Import the cacert.pem cert into your Web Browser (e.g. Edit -> | 
 |        Preferences -> Privacy & Security -> Manage Certificates -> | 
 |        WebSites -> Import) | 
 |      * Or Import the cacert.pem cert into your Java Plugin (e.g. run | 
 |        ControlPanel, then Security -> Certificates -> Secure Site -> | 
 |        Import) | 
 |  | 
 |    When importing, one would give the browser/java-plugin the path to the | 
 |    copied cacert.pem file in some dialog. Note that the Web browser or | 
 |    Java plugin is used for the server authentication. If the user gets a | 
 |    "Site not verified" message while connecting he should investigate | 
 |    further. | 
 |  | 
 |    For the use of stunnel (e.g. on Windows) one would add this to the | 
 |    stunnel.conf: | 
 |   # stunnel.conf: | 
 |   client = yes | 
 |   options = ALL | 
 |   CAfile = /path/to/cacert.pem          # or maybe C:\path\to\cacert.pem | 
 |   [myvncssl] | 
 |   accept = 5901 | 
 |   connect = far-away.east:5900 | 
 |  | 
 |    (then point the VNC viewer to localhost:1). | 
 |  | 
 |    Here is an example for the Unix stunnel wrapper script ss_vncviewer in | 
 |    our SSVNC package: | 
 |   ss_vncviewer -verify ./cacert.pem far-away.east:0 | 
 |  | 
 |    Our SSVNC enhanced tightvnc viewer GUI can also use the certificate | 
 |    file for server authentication. You can load it via the SSVNC | 
 |    'Certs...' dialog and set 'ServerCert' to the cacert.pem file you | 
 |    safely copied there. | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |    Tricks for server keys: | 
 |  | 
 |    To create additional x11vnc server keys do something like this: | 
 |   x11vnc -sslGenCert server myotherkey | 
 |  | 
 |    and use it this way: | 
 |   x11vnc -ssl SAVE-myotherkey ... | 
 |  | 
 |    The files will be ~/.vnc/certs/server-myotherkey.{crt,pem} | 
 |  | 
 |    You can also create a self-signed server key: | 
 |   x11vnc -sslGenCert server self:third_key | 
 |  | 
 |    and use it this way: | 
 |   x11vnc -ssl SAVE-self:third_key ... | 
 |  | 
 |    This key is not signed by your CA. This can be handy to have a key set | 
 |    separate from your CA when you do not want to create a 2nd CA | 
 |    cert+key. | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |    Using external CA's: | 
 |  | 
 |    You don't have to use your own CA cert+key, you can use a third | 
 |    party's instead. Perhaps you have a company-wide CA or you can even | 
 |    have your x11vnc certificate signed by a professional CA (e.g. | 
 |    www.thawte.com or www.verisign.com or perhaps the free certificate | 
 |    service www.startcom.org or www.cacert.org). | 
 |  | 
 |    The advantage to doing this is that the VNC client machines will | 
 |    already have the CA certificates installed and you don't have to | 
 |    install it on each machine. | 
 |  | 
 |    To generate an x11vnc server cert+key this way you should generate a | 
 |    "request" for a certicate signing something like this (we use the name | 
 |    "external" in this example, it could be anything you want): | 
 |   x11vnc -sslGenCert server req:external | 
 |  | 
 |    This will create the request file: | 
 |   ~/.vnc/certs/server-req:external.req | 
 |  | 
 |    Which you should send to the external CA. When you get the signed | 
 |    certificate back from them, save it in the file: | 
 |   ~/.vnc/certs/server-req:external.crt | 
 |  | 
 |    and create the .pem this way: | 
 |   mv  ~/.vnc/certs/server-req:external.key    ~/.vnc/certs/server-req:external. | 
 | pem | 
 |   chmod 600 ~/.vnc/certs/server-req:external.pem | 
 |   cat ~/.vnc/certs/server-req:external.crt >> ~/.vnc/certs/server-req:external. | 
 | pem | 
 |  | 
 |    You also rename the two files (.crt and .pem) to have a shorter | 
 |    basename if you like. E.g.: | 
 |   mv  ~/.vnc/certs/server-req:external.pem  ~/.vnc/certs/server-ext.pem | 
 |   mv  ~/.vnc/certs/server-req:external.crt  ~/.vnc/certs/server-ext.crt | 
 |  | 
 |    and the use via "x11vnc -ssl SAVE-ext ...", etc. | 
 |  | 
 |    On the viewer side make sure the external CA's certificate is | 
 |    installed an available for the VNC viewer software you plan to use. | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |    Using Client Keys for Authentication: | 
 |  | 
 |    You can optionally create certs+keys for your VNC client machines as | 
 |    well. After distributing them to the client machines you can have | 
 |    x11vnc verify the clients using SSL. Here is how to do this: | 
 |  | 
 |   x11vnc -sslGenCert client dilbert | 
 |   x11vnc -sslGenCert client wally | 
 |   x11vnc -sslGenCert client alice | 
 |   ... | 
 |  | 
 |    As usual, follow the prompts if you want to change any of the info | 
 |    field values. As always, it is a good idea (although inconvenient) to | 
 |    protect the private keys with a passphrase. These files are created: | 
 |   ~/.vnc/certs/clients/dilbert.crt | 
 |   ~/.vnc/certs/clients/dilbert.pem | 
 |   ... | 
 |  | 
 |    Note that these are kept in a clients subdirectory. | 
 |  | 
 |    Next, safely copy the .pem files to each corresponding client machine | 
 |    and incorporate them into the VNC viewer / SSL software (see the ideas | 
 |    mentioned above for the CA and server keys). The only difference is | 
 |    these certificates might be referred to as "My Certificates" or | 
 |    "Client Certificates". They are used for client authentication (which | 
 |    is relatively rare for SSL). | 
 |  | 
 |    After copying them you can delete the clients/*.pem files for extra | 
 |    safety because the private keys are not needed by the x11vnc server. | 
 |    You don't really need the clients/*.crt files either (because they | 
 |    have been signed by the CA). But they could come in handy for tracking | 
 |    or troubleshooting, etc. | 
 |  | 
 |    Now start up x11vnc and instruct it to verify connecting clients via | 
 |    SSL and the CA cert: | 
 |   x11vnc -ssl SAVE -sslverify CA | 
 |  | 
 |    The "CA" special token instructs x11vnc to use its CA signed certs for | 
 |    verification. | 
 |  | 
 |    For arbitrary self-signed client certificates (no CA) it might be | 
 |    something like this: | 
 |   x11vnc -ssl SAVE -sslverify path/to/client.crt | 
 |   x11vnc -ssl SAVE -sslverify path/to/client-hash-dir | 
 |   x11vnc -ssl SAVE -sslverify path/to/certs.txt | 
 |  | 
 |    Where client.crt would be an individual client certificate; | 
 |    client-hash-dir a directory of file names based on md5 hashes of the | 
 |    certs (see -sslverify); and certs.txt signifies a single file full of | 
 |    client certificates. | 
 |  | 
 |    Finally, connect with your VNC viewer using the key. Here is an | 
 |    example for the Unix stunnel wrapper script ss_vncviewer: using client | 
 |    authentication (and the standard server authentication with the CA | 
 |    cert): | 
 |   ss_vncviewer -mycert ./dilbert.pem -verify ./cacert.pem far-away.east:0 | 
 |  | 
 |    Our SSVNC enhanced tightvnc viewer can also use these openssl .pem | 
 |    files (you can load them via Certs... -> MyCert dialog). | 
 |  | 
 |    It is also possible to use -sslverify on a per-client key basis, and | 
 |    also using self-signed client keys (x11vnc -sslGenCert client | 
 |    self:dilbert) | 
 |  | 
 |    Now a tricky part is to get Web browsers or Java Runtime to import and | 
 |    use the openssl .pem cert+key files. See the next paragraph on how to | 
 |    convert them to pkcs12 format. If you find a robust way to import them | 
 |    and and get them to use the cert please let us know! | 
 |  | 
 |    Here is how to convert our openssl crt/pem files to pkcs12 format | 
 |    (contains both the client certificate and key) that can be read by Web | 
 |    browsers and Java for use in client authentication: | 
 |   openssl pkcs12 -export -in mycert.crt -inkey mycert.pem -out mycert.p12 | 
 |  | 
 |    it will ask for a passphrase to protect mycert.p12. Some software | 
 |    (e.g. Java ControlPanel) may require a non-empty passphrase. Actually, | 
 |    since our .pem contains both the certificate and private key, you | 
 |    could just supply it for the -in and remove the -inkey option. It | 
 |    appears that for certificates only importing, our .crt file is | 
 |    sufficient and can be read by Mozilla/Firefox and Java... | 
 |  | 
 |    If you have trouble getting your Java Runtime to import and use the | 
 |    cert+key, there is a workaround for the SSL-enabled Java applet. On | 
 |    the Web browser URL that retrieves the VNC applet, simply add a | 
 |    "/?oneTimeKey=..." applet parameter (see ssl-portal for more details | 
 |    on applet parameters; you don't need to do the full portal setup | 
 |    though). The value of the oneTimeKey will be the very long string that | 
 |    is output of the onetimekey program found in the classes/ssl x11vnc | 
 |    directory. Or you can set oneTimeKey=PROMPT in which case the applet | 
 |    will ask you to paste in the long string. These scheme is pretty ugly, | 
 |    but it works. A nice application of it is to make one time keys for | 
 |    users that have already logged into a secure HTTPS site via password. | 
 |    A cgi program then makes a one time key for the logged in user to use: | 
 |    it is passed back over HTTPS as the applet parameter in the URL and so | 
 |    cannot be sniffed. x11vnc is run to use that key via -sslverify. | 
 |  | 
 |    Update: as of Apr 2007 in the 0.9.1 x11vnc tarball there is a new | 
 |    option setting "-users sslpeer=" that will do a switch user much like | 
 |    -unixpw does, but this time using the emailAddress field of the | 
 |    Certificate subject of the verified Client. This mode requires | 
 |    -sslverify turned on to verify the clients via SSL. This mode can be | 
 |    useful in situations using -create or -svc where a new X server needs | 
 |    to be started up as the authenticated user (but unlike in -unixpw | 
 |    mode, the unix username is not obviously known). | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |    Revoking Certificates: | 
 |  | 
 |    A large, scaled-up installation may benefit from being able to revoke | 
 |    certificates (e.g. suppose a user's laptop with a vnc client or server | 
 |    key is compromised.) You can use this option with x11vnc: -sslCRL. See | 
 |    the info at that link for a guide on what openssl(1) commands you will | 
 |    need to run to revoke a certificate. | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |    Additional utlities: | 
 |  | 
 |    You can get information about your keys via -sslCertInfo. These lists | 
 |    all your keys: | 
 |   x11vnc -sslCertInfo list | 
 |   x11vnc -sslCertInfo ll | 
 |  | 
 |    (the latter is long format). | 
 |  | 
 |    These print long output, including the public certificate, for | 
 |    individual keys: | 
 |   x11vnc -sslCertInfo server | 
 |   x11vnc -sslCertInfo dilbert | 
 |   x11vnc -sslCertInfo all             (every key, very long) | 
 |  | 
 |    If you want to add a protecting passphrase to a key originally created | 
 |    without one: | 
 |   x11vnc -sslEncKey SAVE | 
 |   x11vnc -sslEncKey SAVE-fred | 
 |  | 
 |    To delete a cert+key: | 
 |   x11vnc -sslDelCert SAVE | 
 |   x11vnc -sslDelCert SAVE-fred | 
 |   x11vnc -sslDelCert wally | 
 |  | 
 |    (but rm(1) will be just as effective). | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |    Chained Certificates: | 
 |  | 
 |    There is increasing interest in using chained CA's instead of a single | 
 |    CA. The merits of using chained CA's are not described here besides to | 
 |    say its use may make some things easier when a certificate needs to be | 
 |    revoked. | 
 |  | 
 |    x11vnc supports chained CA certificates. We describe a basic use case | 
 |    here. | 
 |  | 
 |    Background: Of course the most straight forward way to use SSL with | 
 |    x11vnc is to use no CA at all (see above): a self-signed certificate | 
 |    and key is used and its certificate needs to be safely copied to the | 
 |    client side. This is basically the same as the SSH style of managing | 
 |    keys. Next level up, one can use a single CA to sign server keys: then | 
 |    only the CA's certificate needs to be safely copied to the client | 
 |    side, this can happen even before any server certs are created (again, | 
 |    see all of the discussion above.) | 
 |  | 
 |    With a certificate chain there are two or more CA's involved. Perhaps | 
 |    it looks like this: | 
 |   root_CA ---> intermediate_CA ---> server_cert | 
 |  | 
 |    Where the arrow basically means "signs". | 
 |  | 
 |    In this usage mode the client (viewer-side) will have root_CA's | 
 |    certificate available for verifying (and nothing else.) If the viewer | 
 |    only received server_cert's certificate, it would not have enough info | 
 |    to verify the server. The client needs to have intermediate_CA's cert | 
 |    as well. The way to do this with x11vnc (i.e. an OpenSSL using app) is | 
 |    to concatenate the server_cert's pem and the intermediate_CA's | 
 |    certificate together. | 
 |  | 
 |    For example, suppose the file intermediate_CA.crt had | 
 |    intermediate_CA's certificate. And suppose the file server_cert.pem | 
 |    had the server's certificate and private key pair as described above | 
 |    on this page. We need to do this: | 
 |   cat intermediate_CA.crt >> server_cert.pem | 
 |  | 
 |    (Note: the order of the items inside the file matters; intermediate_CA | 
 |    must be after the server key and cert) and then we run x11vnc like | 
 |    this: | 
 |   x11vnc -ssl ./server_cert.pem ... | 
 |  | 
 |    Then, on the VNC viewer client side, the viewer authenticates the | 
 |    x11vnc server by using root_CA's certificate. Suppose that is in a | 
 |    file named root_CA.crt, then using the SSVNC wrapper script | 
 |    ss_vncviewer (which is also included in the SSVNC package) as our | 
 |    example, we have: | 
 |   ss_vncviewer -verify ./root_CA.crt hostname:0 | 
 |  | 
 |    (where "hostname" is the machine where x11vnc is running.) One could | 
 |    also use the SSVNC GUI setting Certs -> ServerCert to the root_CA.crt | 
 |    file. Any other SSL enabled VNC viewer would use root_CA.crt in a | 
 |    similar way. | 
 |      _________________________________________________________________ | 
 |  | 
 |    Creating Chained Certificates: | 
 |  | 
 |    Here is a fun example using VeriSign's "Trial Certificate" program. | 
 |    Note that VeriSign has a Root CA and also an Intermediate CA and uses | 
 |    the latter to sign customers certificates. So this provides an easy | 
 |    way to test out the chained certificates mechanism with x11vnc. | 
 |  | 
 |    First we created a test x11vnc server key: | 
 |   openssl genrsa -out V1.key 1024 | 
 |  | 
 |    then we created a certificate signing request (CSR) for it: | 
 |   openssl req -new -key V1.key -out V1.csr | 
 |  | 
 |    (we followed the prompts and supplied information for the various | 
 |    fields.) | 
 |  | 
 |    Then we went to VeriSign's page http://www.verisign.com/ssl/index.html | 
 |    and clicked on "FREE TRIAL" (the certificate is good for 14 days.) We | 
 |    filled in the forms and got to the point where it asked for the CSR | 
 |    and so we pasted in the contents of the above V1.csr file. Then, after | 
 |    a few more steps, VeriSign signed and emailed us our certificate. | 
 |  | 
 |    The VeriSign Trial certificates were found here: | 
 |   http://www.verisign.com/support/verisign-intermediate-ca/Trial_Secure_Server_ | 
 | Root/index.html | 
 |   http://www.verisign.com/support/verisign-intermediate-ca/trial-secure-server- | 
 | intermediate/index.html | 
 |  | 
 |    The former was pasted into a file V-Root.crt and the latter was pasted | 
 |    into V-Intermediate.crt | 
 |  | 
 |    We pasted our Trial certificate that VeriSign signed and emailed to us | 
 |    into a file named V1.crt and then we typed: | 
 |   cat V1.key V1.crt > V1.pem | 
 |   cat V1.pem V-Intermediate.crt > V1-combined.pem | 
 |   chmod 600 V1.pem V1-combined.pem | 
 |  | 
 |    So now the file V1-combined.pem has our private key and (VeriSign | 
 |    signed) certificate and VeriSign's Trial Intermediate certificate. | 
 |  | 
 |    Next, we start x11vnc: | 
 |   x11vnc -ssl ./V1-combined.pem ... | 
 |  | 
 |    and finally, on the viewer side (SSVNC wrapper script example): | 
 |   ss_vncviewer -verify ./V-Root.crt hostname:0 | 
 |  | 
 |    One will find that only that combination of certs and keys will work, | 
 |    i.e. allow the SSL connection to be established. Every other | 
 |    combination we tried failed (note that ss_vncviewer uses the external | 
 |    stunnel command to handle the SSL so we are really testing stunnel's | 
 |    SSL implementation on the viewer side); and so the system works as | 
 |    expected. | 
 |      _________________________________________________________________ | 
 |  | 
 |    VNC Client Authentication using Certificate Chains: | 
 |  | 
 |    Now, going the other way around with the client authenticating himself | 
 |    via this chain of SSL certificates, x11vnc is run this way: | 
 |   x11vnc -ssl SAVE -sslverify ./V-Root.crt ... | 
 |  | 
 |    (note since the server must always supply a cert, we use its normal | 
 |    self-signed, etc., one via "-ssl SAVE" and use the VeriSign root cert | 
 |    for client authentication via -sslverify. The viewer must now supply | 
 |    the combined certificates, e.g.: | 
 |   ss_vncviewer -mycert ./V1-combined.pem hostname:0 | 
 |      _________________________________________________________________ | 
 |  | 
 |    Using OpenSSL and x11vnc to create Certificate Chains: | 
 |  | 
 |    Although the x11vnc CA mechanism (-sslGenCA and -sslGenCert; see | 
 |    above) was designed to only handle a single root CA (to sign server | 
 |    and/or client certs) it can be coerced into creating a certificate | 
 |    chain by way of an extra openssl(1) command. | 
 |  | 
 |    We will first create two CA's via -sslGenCA; then use one of these CA | 
 |    to sign the other; create a new (non-CA) server cert; and append the | 
 |    intermediate CA's cert to the server cert to have everything needed in | 
 |    the one file. | 
 |  | 
 |    Here are the commands we ran to do what the previous paragraph | 
 |    outlines. | 
 |  | 
 |    First we create the two CA's, called CA_root and CA_Intermediate here, | 
 |    in separate directories via x11vnc: | 
 |   x11vnc -ssldir ~/CA_Root -sslGenCA | 
 |      (follow the prompts, we included "CA_Root", e.g. Common Name, to aid ident | 
 | ifying it) | 
 |  | 
 |   x11vnc -ssldir ~/CA_Intermediate -sslGenCA | 
 |      (follow the prompts, we included "CA_Intermediate", e.g. Common Name, to a | 
 | id identifying it) | 
 |  | 
 |    Next backup CA_Intermediate's cert and then sign it with CA_Root: | 
 |   mv ~/CA_Intermediate/CA/cacert.pem ~/CA_Intermediate/CA/cacert.pem.ORIG | 
 |   cd ~/CA_Root | 
 |   openssl ca -config ./CA/ssl.cnf -policy policy_anything -extensions v3_ca -no | 
 | text -ss_cert ~/CA_Intermediate/CA/cacert.pem.ORIG -out ~/CA_Intermediate/CA/ca | 
 | cert.pem | 
 |  | 
 |    Note that it is required to cd to the ~/CA_Root directory and run the | 
 |    openssl command from there. | 
 |  | 
 |    You can print out info about the cert you just modified by: | 
 |   openssl x509 -noout -text -in ~/CA_Intermediate/CA/cacert.pem | 
 |  | 
 |    Now we create an x11vnc server cert named "test_chain" that is signed | 
 |    by CA_Intermediate: | 
 |   x11vnc -ssldir ~/CA_Intermediate -sslGenCert server test_chain | 
 |      (follow the prompts) | 
 |  | 
 |    You can print out information about this server cert just created via | 
 |    this command: | 
 |   x11vnc -ssldir ~/CA_Intermediate -sslCertInfo SAVE-test_chain | 
 |  | 
 |    This will tell you the full path to the server certificate, which is | 
 |    needed because we need to manually append the CA_Intermediate cert for | 
 |    the chain to work: | 
 |   cat ~/CA_Intermediate/CA/cacert.pem >> ~/CA_Intermediate/server-test_chain.pe | 
 | m | 
 |  | 
 |    Now we are finally ready to use it. We can run x11vnc using this | 
 |    server cert+key by either this command: | 
 |   x11vnc -ssldir ~/CA_Intermediate -ssl SAVE-test_chain ... | 
 |  | 
 |    or this command: | 
 |   x11vnc -ssl ~/CA_Intermediate/server-test_chain.pem ... | 
 |  | 
 |    since they are equivalent (both load the same pem file.) | 
 |  | 
 |    Finally we connect via VNC viewer that uses CA_Root to verify the | 
 |    server. As before we use ss_vncviewer: | 
 |   ss_vncviewer -verify ~/CA_Root/CA/cacert.pem hostname:0 | 
 |  | 
 |    Client Certificates (see above) work in a similar manner. | 
 |  | 
 |    So although it is a little awkward with the extra steps (e.g. | 
 |    appending the CA_Intermediate cert) it is possible. If you want to do | 
 |    this entirely with openssl(1) you will have to learn the openssl | 
 |    commands corresponding to -genCA and -genCert. You may be able to find | 
 |    guides on the Internet to do this. Starting with x11vnc 0.9.10, you | 
 |    can have it print out the wrapper scripts it uses via: -sslScripts | 
 |    (you will still need to fill in a few pieces of information; ask if it | 
 |    is not clear from the source code.) | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |    More info: | 
 |  | 
 |    See also this article for some some general info and examples using | 
 |    stunnel and openssl on Windows with VNC. Also | 
 |    http://www.stunnel.org/faq/certs.html is a very good source of | 
 |    information on SSL certificate creation and management. | 
 | 	 | 
 | ======================================================================= | 
 | http://www.karlrunge.com/x11vnc/ssl-portal.html: | 
 |  | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |    Using Apache as an SSL Gateway to multiple x11vnc servers inside a | 
 |    firewall: | 
 |  | 
 |    Background: | 
 |  | 
 |    The typical way to allow access to x11vnc (or any other VNC server) | 
 |    running on multiple workstations inside a firewall is via SSH. The | 
 |    user somewhere out on the Internet logs in to the SSH gateway machine | 
 |    and uses port forwarding (e.g. ssh -t -L 5900:myworkstation:5900 | 
 |    user@gateway) to set up the encrypted channel that VNC is then | 
 |    tunneled through. Next he starts up the VNC viewer on the machine | 
 |    where he is sitting directed to the local tunnel port (e.g. | 
 |    localhost:0). | 
 |  | 
 |    The SSH scheme is nice because it is a widely used and well tested | 
 |    login technique for users connecting to machines inside their company | 
 |    or home firewall. For VNC access it is a bit awkward, however, because | 
 |    SSH needs to be installed on the Viewer machine and the user usually | 
 |    has to rig up his own port redirection plumbing (however, see our | 
 |    other tool). | 
 |  | 
 |    Also, some users have restrictive work environments where SSH and | 
 |    similar applications are prohibited (i.e. only outgoing connections to | 
 |    standard WWW ports from a browser are allowed, perhaps mediated by a | 
 |    proxy server). These users have successfully used the method described | 
 |    here for remote access. | 
 |  | 
 |    With the SSL support in x11vnc and the SSL enabled Java VNC viewer | 
 |    applet, a convenient and secure alternative exists that uses the | 
 |    Apache webserver as a gateway. The idea is that the company or home | 
 |    internet connection is already running apache as a web server (either | 
 |    SSL or non-SSL) and we add to it the ability to act as a gateway for | 
 |    SSL VNC connections. The only thing needed on the Viewer side is a | 
 |    Java enabled Web Browser: the user simply enters a URL that starts the | 
 |    entire VNC connection process. No VNC or SSH specific software needs | 
 |    to be installed on the viewer side machine. | 
 |  | 
 |    The stunnel VNC viewer stunnel wrapper script provided (ss_vncviewer) | 
 |    can also take advantage of the method described here with its -proxy | 
 |    option. | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |    Simpler Solutions: This apache SSL VNC portal solution may be too much | 
 |    for you. It is mainly intended for automatically redirecting to | 
 |    MULTIPLE workstations inside the firewall. If you only have one or two | 
 |    inside machines that you want to access, the method described here is | 
 |    overly complicated! See below for some simpler (and still non-SSH) | 
 |    encrypted setups. | 
 |  | 
 |    Also see the recent (Mar/2010) desktop.cgi x11vnc desktop web login | 
 |    CGI script that achieves much of what the method describes here | 
 |    (especially if its 'port redirection' feature is enabled.) | 
 |      _________________________________________________________________ | 
 |  | 
 |  | 
 |  | 
 |    There are numerous ways to achieve this with Apache. We present one of | 
 |    the simplest ones here. | 
 |  | 
 |    Important: these sorts of schemes allow incoming connections from | 
 |    anywhere on the Internet to fixed ports on machines inside the | 
 |    firewall. Care must be taken to implement and test thoroughly. If one | 
 |    is paranoid one can (and should) add extra layers of protection. (e.g. | 
 |    extra passwords, packet filtering, SSL certificate verification, etc). | 
 |  | 
 |    Also, it is easy to miss the point that unless precautions are taken | 
 |    to verify SSL Certificates, then the VNC Viewer is vulnerable to | 
 |    man-in-the-middle attacks (but not to the more common passive sniffing | 
 |    attacks). Note that there are hacker tools like dsniff/webmitm and | 
 |    cain that implement SSL Man-In-The-Middle attacks. They rely on the | 
 |    client not bothering to check the cert. | 
 |      _________________________________________________________________ | 
 |  | 
 |    The Holy Grail: a single https port (443) | 
 |  | 
 |    Before we discuss the self-contained apache examples here, we want to | 
 |    mention that many x11vnc users who read this page and implement the | 
 |    apache SSL VNC portal ask for something that (so far) seems difficult | 
 |    or impossible to do entirely inside apache: | 
 |      * A single port, 443 (the default https:// port), is open to the | 
 |        Internet | 
 |      * It is HTTPS/SSL encrypted | 
 |      * It handles both VNC traffic and Java VNC Applet downloads. | 
 |      * And the server can also serve normal HTTPS webpages, CGI, etc. | 
 |  | 
 |    It is the last item that makes it tricky (otherwise the method | 
 |    described on this page will work). If you are interested in such a | 
 |    solution and are willing to run a separate helper program | 
 |    (connect_switch) look here. Also, see this apache patch. | 
 |      _________________________________________________________________ | 
 |  | 
 |    Example: | 
 |  | 
 |    The scheme described here sets up apache on the firewall/gateway as a | 
 |    regular Web proxy into the intranet and allows connections to a single | 
 |    fixed port on a limited set of machines. | 
 |  | 
 |    The configuration described in this section does not use the mod_ssl | 
 |    apache module (the optional configuration described in the section | 
 |    "Downloading the Java applet to the browser via HTTPS" does take | 
 |    advantage of mod_ssl) | 
 |  | 
 |    In this example suppose the gateway machine running apache is named | 
 |    "www.gateway.east" (e.g. it may also provide normal web service). We | 
 |    also choose the Internet-facing port for this VNC service to be port | 
 |    563. One could choose any port, including the default HTTP port 80. | 
 |  | 
 |    Detail: We choose 563 because it is the rarely used SNEWS port that is | 
 |    often allowed by Web proxies for the CONNECT method. The idea is the | 
 |    user may be coming out of another firewall using a proxy (not the one | 
 |    we describe here, that is, the case when two proxies are involved, | 
 |    e.g. one at work and another Apache (described here) at home | 
 |    redirecting into our firewall; the "double proxy" or "double firewall" | 
 |    problem). Using port 563 simplifies things because CONNECT's to it are | 
 |    usually allowed by default. | 
 |  | 
 |    We also assume all of the x11vnc servers on the internal machines are | 
 |    all listening on port 5915 ("-rfbport 5915") instead of the default | 
 |    5900. This is to limit any unintended proxy redirections to a lesser | 
 |    used port, and also to stay out of the way of normal VNC servers on | 
 |    the same machines. One could obviously implement a scheme that handles | 
 |    different ports, but we just discuss this simple setup here. | 
 |  | 
 |    So we basically assume x11vnc has been started this way on all of the | 
 |    workstations to be granted VNC access: | 
 |   x11vnc -ssl SAVE -http -display :0 -forever -rfbauth ~/.vnc/passwd -rfbport 5 | 
 | 915 | 
 |  | 
 |    i.e. we force SSL VNC connections, port 5915, serve the Java VNC | 
 |    viewer applet, and require a VNC password (another option would be | 
 |    -unixpw). The above command could also be run out of inetd(8). It can | 
 |    also be used to autodetect the user's display and Xauthority data. | 
 |  | 
 |  | 
 |    These sections are added to the httpd.conf apache configuration file | 
 |    on www.gateway.east: | 
 |  | 
 | # In the global section you need to enable these modules. | 
 | # Note that the ORDER MATTERS! mod_rewrite must be before mod_proxy | 
 | # (so that we can check the allowed host list via rewrite) | 
 | # | 
 | LoadModule rewrite_module modules/mod_rewrite.so | 
 | LoadModule proxy_module modules/mod_proxy.so | 
 | LoadModule proxy_connect_module modules/mod_proxy_connect.so | 
 | LoadModule proxy_ftp_module modules/mod_proxy_ftp.so | 
 | LoadModule proxy_http_module modules/mod_proxy_http.so | 
 | <IfDefine SSL> | 
 | LoadModule ssl_module modules/mod_ssl.so | 
 | </IfDefine> | 
 |  | 
 |  | 
 | # Near the bottom of httpd.conf you put the port 563 virtual host: | 
 |  | 
 | Listen 563 | 
 |  | 
 | <VirtualHost *:563> | 
 |  | 
 |    # Allow proxy CONNECT requests *only* to port 5915. | 
 |    # If the machines use different ports, e.g. 5916 list them here as well: | 
 |    # | 
 |    ProxyRequests On | 
 |    AllowCONNECT 5915 | 
 |  | 
 |    RewriteEngine On | 
 |  | 
 |    # Convenience rules to expand applet parameters.  These do not have a traili | 
 | ng "/" | 
 |    # | 
 |    # /vnc   for http jar file downloading: | 
 |    # | 
 |    RewriteRule /vnc/([^/]+)$               /vnc/$1/index.vnc?CONNECT=$1+5915&PO | 
 | RT=563&urlPrefix=_2F_vnc_2F_$1 [R,NE,L] | 
 |    RewriteRule /vnc/trust/([^/]+)$         /vnc/$1/index.vnc?CONNECT=$1+5915&PO | 
 | RT=563&urlPrefix=_2F_vnc_2F_$1&trustAllVncCerts=yes [R,NE,L] | 
 |    RewriteRule /vnc/proxy/([^/]+)$         /vnc/$1/proxy.vnc?CONNECT=$1+5915&PO | 
 | RT=563&urlPrefix=_2F_vnc_2F_$1&forceProxy=yes [R,NE,L] | 
 |    RewriteRule /vnc/trust/proxy/([^/]+)$   /vnc/$1/proxy.vnc?CONNECT=$1+5915&PO | 
 | RT=563&urlPrefix=_2F_vnc_2F_$1&forceProxy=yes&trustAllVncCerts=yes [R,NE,L] | 
 |  | 
 |    # Read in the allowed host to vnc display mapping file.  It looks like: | 
 |    # | 
 |    #   host1     15 | 
 |    #   host2     15 | 
 |    #   ... | 
 |    # | 
 |    # the display "15" means 5815 for http applet download, 5915 for SSL vnc. | 
 |    # | 
 |    RewriteMap vnchosts txt:/dist/apache/conf/vnc.hosts | 
 |  | 
 |    # Proxy: check for the CONNECT hostname and port being in the vnc.hosts list | 
 | . | 
 |    # | 
 |    RewriteCond %{THE_REQUEST} ^CONNECT [NC] | 
 |    RewriteCond %{REQUEST_URI} ^(.*):(.*)$ | 
 |    RewriteCond ${vnchosts:%1|NOTFOUND} NOTFOUND | 
 |    RewriteRule ^.*$ /VNCFAIL [F,L] | 
 |  | 
 |    RewriteCond %{THE_REQUEST} ^CONNECT [NC] | 
 |    RewriteCond %{REQUEST_URI} ^(.*):(.*)$ | 
 |    RewriteCond 59${vnchosts:%1}=%2 !^(.*)=(\1)$ | 
 |    RewriteRule ^.*$ /VNCFAIL [F,L] | 
 |  | 
 |  | 
 |    # Remap /vnc to the proxy http download (e.g. http://host:5815) | 
 |    # | 
 |    # First, fail if it starts with the string /vnc0: | 
 |    # | 
 |    RewriteRule ^/vnc0.*            /VNCFAIL [F,L] | 
 |    # | 
 |    # Next, map the prefix to /vnc0/host:protocol:port | 
 |    # | 
 |    RewriteRule ^/vnc/([^/]+)/(.*)  /vnc0/$1:http:58${vnchosts:$1|NOTFOUND}/$2 | 
 | [NE] | 
 |    # | 
 |    # Drop any not found: | 
 |    # | 
 |    RewriteRule ^/vnc0.*NOTFOUND.*  /VNCFAIL [F,L] | 
 |  | 
 |    # Construct the proxy URL and retrieve it: | 
 |    # | 
 |    RewriteRule ^/vnc0/([^/]+):([^/]+):([^/]+)/(.*) $2://$1:$3/$4 [P,NE,L] | 
 |  | 
 | </VirtualHost> | 
 |  | 
 |    Then restart apache (perhaps: "apachectl stop; apachectl start"). | 
 |  | 
 |    Note that the listing of allowed internal workstations is done in an | 
 |    external file (/dist/apache/conf/vnc.hosts in the example above), the | 
 |    format is like this: | 
 | # allowed vnc hosts file: | 
 | hostname1  15 | 
 | hostname2  15 | 
 | ... | 
 |  | 
 |    You list the hostname and the VNC display (always 15 in our example). | 
 |    Only to these hosts will the external VNC viewers be able to connect | 
 |    to (via the HTTP CONNECT method). | 
 |  | 
 |    The above setup requires mod_rewrite and mod_proxy be enabled in the | 
 |    apache web server. In this example they are loaded as modules (and | 
 |    note that mod_rewrite must be listed before mod_proxy); | 
 |  | 
 |    The user at the Java enabled Web browser would simply enter this URL | 
 |    into the browser: | 
 |    http://www.gateway.east:563/vnc/host2 | 
 |  | 
 |    to connect to internal workstation host2, etc. | 
 |  | 
 |    Important: do not put a trailing "/" on the URL, since that will | 
 |    defeat the RewriteRules that look for the hostname at the very end. | 
 |  | 
 |    There will be a number of SSL certificate, etc, dialogs he will have | 
 |    to respond to in addition to any passwords he is required to provide | 
 |    (this depends on how you set up user authentication for x11vnc). | 
 |  | 
 |    If a second Web proxy is involved (i.e. the user's browser is inside | 
 |    another firewall and policy requires using a Web proxy server) then | 
 |    use this URL: | 
 |    http://www.gateway.east:563/vnc/proxy/host2 | 
 |  | 
 |    This will involve downloading a signed java viewer applet jar file | 
 |    that is able to interact with the internal proxy for the VNC | 
 |    connection. See this FAQ for more info on how this works. Note: | 
 |    sometimes with the Proxy case if you see 'Bad Gateway' error you will | 
 |    have to wait 10 or so seconds and then hit reload. This seems to be | 
 |    due to having to wait for a Connection Keepalive to terminate... | 
 |  | 
 |    For completeness, the "trust" cases that skip a VNC certificate dialog | 
 |    (discussed below) would be entered as: | 
 |    http://www.gateway.east:563/vnc/trust/host2 | 
 |    http://www.gateway.east:563/vnc/trust/proxy/host2 | 
 |  | 
 |    You can of course choose shorter or more easy to remember URL formats. | 
 |    Just change the Convenience RewriteRules in httpd.conf. | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |    Port Variations: | 
 |  | 
 |    Note that you can run this on the default HTTP port 80 instead of port | 
 |    563. If you do not expect to have a browser connecting from inside a | 
 |    proxying firewall (where sometimes only connections to ports 443 and | 
 |    563 are allowed) this should be fine. Use "80" instead of "563" in the | 
 |    httpd.conf config file (you may need to merge it with other default | 
 |    port 80 things you have there). | 
 |  | 
 |    Then the URL's will be a bit simpler: | 
 |    http://www.gateway.east/vnc/host2 | 
 |    http://www.gateway.east/vnc/trust/host2 | 
 |  | 
 |    etc. | 
 |  | 
 |    Besides 80 one could use any other random port number (since there are | 
 |    so many port scans on 80, a little obscurity might be useful). | 
 |  | 
 |    One option is to use port "443" (the default https:// port) instead of | 
 |    "563". In this case Apache is not configured for mod_ssl; we just | 
 |    happen to use port "443" in the way any random port would be used. | 
 |    This could be handy if the Viewer side environment is restrictive in | 
 |    that it only allows outgoing connections to ports 80 and 443 (and, | 
 |    say, you didn't want to use port 80, or you wanted to use 80 for | 
 |    something else). Another reason for using 443 would be some web proxy | 
 |    environments only allow the CONNECT method to go to port 443 (and not | 
 |    even the case 563 we use above). | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |    Details: | 
 |  | 
 |    Let's go through the httpd.conf additions in detail from the top. | 
 |  | 
 |    The LoadModules directives load the necessary apache modules. Note | 
 |    that mod_rewrite must be listed first. If you are compiling from | 
 |    scratch something like this worked for us: | 
 |   ./configure --enable-proxy=shared --enable-proxy-connect=shared --enable-ssl= | 
 | shared --enable-rewrite=shared --prefix=/dist/apache | 
 |  | 
 |    Then the VirtualHost *:563 virtual host section starts. | 
 |  | 
 |    The "ProxyRequests On" and "AllowCONNECT 5915" enable the web server | 
 |    to forward proxy requests to port 5915 (and only this port) INSIDE the | 
 |    firewall. Think about the implications of this thoroughly and test it | 
 |    carefully. | 
 |  | 
 |    The RewriteRule's are for convenience only so that the URL entered | 
 |    into the Web browser does not need the various extra parameters, e.g.: | 
 |    http://www.gateway.east:563/vnc/host2/index.vnc?CONNECT=host2+5915&PORT=563, | 
 | blah,blah... | 
 |  | 
 |    (or otherwise make direct edits to index.vnc to set these parameters). | 
 |    The forceProxy=yes parameter is passed to the applet to force the use | 
 |    of a outgoing proxy socket connection. Use it only if the Web browser | 
 |    is inside a separate Web proxying environment (i.e. large corporation) | 
 |  | 
 |    The rewrites with parameter urlPrefix are described under Tricks for | 
 |    Better Response. The "trust" ones (also described under Tricks) with | 
 |    trustAllVncCerts tell the Java VNC applet to skip a dialog asking | 
 |    about the VNC Certificate. They are a bit faster and more reliable | 
 |    than the original method. In the best situation they lead to being | 
 |    logged in 20 seconds or less (without them the time to login can be | 
 |    much longer since a number of connections must timeout). | 
 |  | 
 |    All of the x11vnc Java Viewer applet parameters are described in the | 
 |    file classes/ssl/README | 
 |  | 
 |    The external file /dist/apache/conf/vnc.hosts containing the allowed | 
 |    VNC server hostnames is read in. Its 2nd column contains the VNC | 
 |    display of the host (always 15 in our example; if you make it vary you | 
 |    will need to adjust some lines in the httpd.conf accordingly, e.g. | 
 |    AllowCONNECT). This list is used to constrain both the Jar file | 
 |    download URL and the proxy CONNECT the VNC viewer makes to only the | 
 |    intended VNC servers. | 
 |  | 
 |    Limiting the proxy CONNECT is done with the two sets of RewriteCond | 
 |    conditions. | 
 |  | 
 |    Limiting the Jar file download URL is done in the remaining 4 | 
 |    RewriteRule's. | 
 |  | 
 |    Note that these index.vnc and VncViewer.jar downloads to the browser | 
 |    are not encrypted via SSL, and so in principle could be tampered with | 
 |    by a really bad guy. The subsequent VNC connection, however, is | 
 |    encrypted through a single SSL connection (it makes a CONNECT straight | 
 |    to x11vnc). See below for how to have these initial downloads | 
 |    encrypted as well (if the apache web server has SSL/mod_ssl, i.e. | 
 |    https, enabled and configured). | 
 |  | 
 |    Unfortunately the Java VNC viewer applet currently is not able to save | 
 |    its own list of Certificates (e.g. the user says trust this VNC | 
 |    certificate 'always'). This is because an applet it cannot open local | 
 |    files, etc. Sadly, the applet cannot even remember certificates in the | 
 |    same browser session because it is completely reinitialized for each | 
 |    connection (see below). | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |    Too Much? | 
 |  | 
 |    If these apache rules are a little too much for you, there is a little | 
 |    bit simpler scheme where you have to list each of the individual | 
 |    machines in the httpd.conf and ssl.conf files. It may be a little more | 
 |    typing to maintain, but perhaps being more straight forward (less | 
 |    RewriteRule's) is desirable. | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |    Problems? | 
 |  | 
 |    To see example x11vnc output for a successful https://host:5900/ | 
 |    connection with the Java Applet see This Page. | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |    Some Ideas for adding extra authentication, etc. for the paranoid: | 
 |      * VNC passwords: -rfbauth, -passwdfile, or -usepw. Even adding a | 
 |        simple company-wide VNC password helps block unwanted access. | 
 |      * Unix passwords: -unixpw | 
 |      * SSL Client certificates: -sslverify | 
 |      * Apache AuthUserFile directive: .htaccess, etc. | 
 |      * Filter connections based on IP address or hostname. | 
 |      * Use Port-knocking on your firewall as described in: Enhanced | 
 |        TightVNC Viewer (ssvnc). | 
 |      * Add proxy password authentication (requires Viewer changes?) | 
 |      * Run a separate instance of Apache that provides this VNC service | 
 |        so it can be brought up and down independently of the normal web | 
 |        server. | 
 |      * How secure is the Client side? Public machines in internet cafes, | 
 |        etc, are often hacked, with backdoors and VNC servers of their | 
 |        own. Prefer using your own firewalled laptop to a public machine. | 
 |  | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |    Using non-Java viewers with this scheme: | 
 |  | 
 |    The ss_vncviewer stunnel wrapper script for VNC viewers has the -proxy | 
 |    option that can take advantage of this method. | 
 |    ss_vncviewer -proxy www.gateway.east:563   host1:15 | 
 |  | 
 |    For the case of the "double proxy" situation (see below) supply both | 
 |    separated by a comma. | 
 |    ss_vncviewer -proxy proxy1.foobar.com:8080,www.gateway.east:563   host1:15 | 
 |  | 
 |    For the Enhanced TightVNC Viewer (ssvnc) GUI (it uses ss_vncviewer on | 
 |    Unix) put 'host1:15' into the 'VNC Server' entry box, and here are | 
 |    possible Proxy/Gateway entries | 
 |    Proxy/Gateway:   www.gateway.east:563 | 
 |    Proxy/Gateway:   proxy1.foobar.com:8080,www.gateway.east:563 | 
 |  | 
 |    then click on the 'Connect' button. | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |    Downloading the Java applet to the browser via HTTPS: | 
 |  | 
 |    To have the Java applet downloaded to the user's Web Browser via an | 
 |    encrypted (and evidently safer) SSL connection the Apache webserver | 
 |    should be configured for SSL via mod_ssl. | 
 |  | 
 |    It is actually possible to use the x11vnc Key Management utility | 
 |    "-sslGenCert" to generate your Apache/SSL .crt and .key files. (In | 
 |    brief, run something like "x11vnc -sslGenCert server self:apache" then | 
 |    copy the resulting self:apache.crt file to conf/ssl.crt/server.crt and | 
 |    extract the private key part from self:apache.pem and paste it into | 
 |    conf/ssl.key/server.key). Setting the env var REQ_ARGS='-days 1095' | 
 |    before running x11vnc will bump up the expiration date (3 years in | 
 |    this case). | 
 |  | 
 |    Or you can use the standard methods described in the Apache mod_ssl | 
 |    documentation to create your keys. Then restart Apache, usually | 
 |    something like "apachectl stop" followed by "apachectl startssl" | 
 |  | 
 |    In addition to the above sections in httpd.conf one should add the | 
 |    following to ssl.conf: | 
 |    SSLProxyEngine  On | 
 |  | 
 |    RewriteEngine On | 
 |  | 
 |    # Convenience rules to expand applet parameters.  These do not have a traili | 
 | ng "/" | 
 |    # | 
 |    # /vnc   http jar file downloading: | 
 |    # | 
 |    RewriteRule /vnc/([^/]+)$                        /vnc/$1/index.vnc?CONNECT=$ | 
 | 1+5915&PORT=563&httpsPort=443&GET=1&urlPrefix=_2F_vnc_2F_$1 [R,NE,L] | 
 |    RewriteRule /vnc/proxy/([^/]+)$                  /vnc/$1/proxy.vnc?CONNECT=$ | 
 | 1+5915&PORT=563&httpsPort=443&GET=1&urlPrefix=_2F_vnc_2F_$1&forceProxy=yes [R,N | 
 | E,L] | 
 |    # | 
 |    # (we skipped the "trust" ones above, put them in if you like) | 
 |    # | 
 |    # /vncs  https jar file downloading: | 
 |    # | 
 |    RewriteRule /vncs/([^/]+)$                      /vncs/$1/index.vnc?CONNECT=$ | 
 | 1+5915&PORT=563&httpsPort=443&GET=1&urlPrefix=_2F_vncs_2F_$1 [R,NE,L] | 
 |    RewriteRule /vncs/proxy/([^/]+)$                /vncs/$1/proxy.vnc?CONNECT=$ | 
 | 1+5915&PORT=563&httpsPort=443&GET=1&urlPrefix=_2F_vncs_2F_$1&forceProxy=yes [R, | 
 | NE,l] | 
 |    RewriteRule /vncs/trust/([^/]+)$                /vncs/$1/index.vnc?CONNECT=$ | 
 | 1+5915&PORT=563&httpsPort=443&GET=1&urlPrefix=_2F_vncs_2F_$1&trustAllVncCerts=y | 
 | es [R,NE,L] | 
 |    RewriteRule /vncs/trust/proxy/([^/]+)$          /vncs/$1/proxy.vnc?CONNECT=$ | 
 | 1+5915&PORT=563&httpsPort=443&GET=1&urlPrefix=_2F_vncs_2F_$1&forceProxy=yes&tru | 
 | stAllVncCerts=yes [R,NE,L] | 
 |  | 
 |    # Convenience rules used for the connect_switch helper (requires Listen 127. | 
 | 0.0.1:443 above): | 
 |    # | 
 |    RewriteRule /vnc443/([^/]+)$                    /vncs/$1/index.vnc?CONNECT=$ | 
 | 1+5915&PORT=443&httpsPort=443&GET=1&urlPrefix=_2F_vncs_2F_$1 [R,NE,L] | 
 |    RewriteRule /vnc443/proxy/([^/]+)$              /vncs/$1/proxy.vnc?CONNECT=$ | 
 | 1+5915&PORT=443&httpsPort=443&GET=1&urlPrefix=_2F_vncs_2F_$1&forceProxy=yes [R, | 
 | NE,L] | 
 |    RewriteRule /vnc443/trust/([^/]+)$              /vncs/$1/index.vnc?CONNECT=$ | 
 | 1+5915&PORT=443&httpsPort=443&GET=1&urlPrefix=_2F_vncs_2F_$1&trustAllVncCerts=y | 
 | es [R,NE,L] | 
 |    RewriteRule /vnc443/trust/proxy/([^/]+)$        /vncs/$1/proxy.vnc?CONNECT=$ | 
 | 1+5915&PORT=443&httpsPort=443&GET=1&urlPrefix=_2F_vncs_2F_$1&forceProxy=yes&tru | 
 | stAllVncCerts=yes [R,NE,L] | 
 |  | 
 |    # Read in the allowed host to vnc display mapping file.  It looks like: | 
 |    # | 
 |    #   host1     15 | 
 |    #   host2     15 | 
 |    #   ... | 
 |    # | 
 |    # the display "15" means 5915 for SSL VNC and 5815 for http applet download. | 
 |    # | 
 |    RewriteMap vnchosts txt:/dist/apache/conf/vnc.hosts | 
 |  | 
 |  | 
 |    # Remap /vnc and /vncs to the proxy http download (e.g. https://host:5915) | 
 |    # | 
 |    # First, fail if it starts with the string /vnc0: | 
 |    # | 
 |    RewriteRule ^/vnc0.*            /VNCFAIL [F,L] | 
 |    # | 
 |    # Next, map the prefix to /vnc0:host:protocol:port | 
 |    # | 
 |    RewriteRule ^/vnc/([^/]+)/(.*)  /vnc0/$1:http:58${vnchosts:$1|NOTFOUND}/$2 | 
 | [NE] | 
 |    RewriteRule ^/vncs/([^/]+)/(.*) /vnc0/$1:https:59${vnchosts:$1|NOTFOUND}/$2 | 
 | [NE] | 
 |    # | 
 |    # Drop any not found: | 
 |    # | 
 |    RewriteRule ^/vnc0.*NOTFOUND.*  /VNCFAIL [F,L] | 
 |  | 
 |    # Construct the proxy URL and retrieve it: | 
 |    # | 
 |    RewriteRule ^/vnc0/([^/]+):([^/]+):([^/]+)/(.*) $2://$1:$3/$4 [P,NE,L] | 
 |  | 
 |    This is all in the "<VirtualHost _default_:443>" section of ssl.conf. | 
 |  | 
 |    The user could then point the Web Browser to: | 
 |    https://www.gateway.east/vnc/host2 | 
 |  | 
 |    or | 
 |    https://www.gateway.east/vnc/proxy/host2 | 
 |  | 
 |    for the "double proxy" case. (Important: do not put a trailing "/" on | 
 |    the URL, since that will defeat the RewriteRules.) | 
 |  | 
 |    As with the httpd.conf case, the external file | 
 |    (/dist/apache/conf/vnc.hosts in the above example) contains the | 
 |    hostnames of the allowed VNC servers. | 
 |  | 
 |    Note that inside the firewall the Java applet download traffic is not | 
 |    encrypted (only over the Internet is SSL used) for these cases: | 
 |    https://www.gateway.east/vnc/host2 | 
 |    https://www.gateway.east/vnc/proxy/host2 | 
 |  | 
 |    However for the special "vncs" rules above: | 
 |    https://www.gateway.east/vncs/host2 | 
 |  | 
 |    the Java applet download is encrypted via SSL for both legs. Note that | 
 |    the two legs are two separate SSL sessions. So the data is decrypted | 
 |    inside an apache process and reencrypted by the apache process for the | 
 |    2nd SSL session inside the same apache process (a very small gap one | 
 |    might overlook). | 
 |  | 
 |    The "vncs/trust" ones are like the "trust" ones described earlier | 
 |    https://www.gateway.east/vncs/trust/mach2 | 
 |  | 
 |    and similarly for the httpsPort ones. See Tricks for Better Response. | 
 |  | 
 |    In all of the above cases the VNC traffic from Viewer to x11vnc is | 
 |    encrypted end-to-end in a single SSL session, even for the "double | 
 |    proxy" case because the CONNECT method is used (there are actually two | 
 |    CONNECT's for the "double proxy" case). This part (the VNC traffic) is | 
 |    the most important part to have encrypted. | 
 |  | 
 |    Note that the Certificate dialogs the user has in his web browser will | 
 |    be for the Apache Certificate, while for the Java applet it will be | 
 |    the x11vnc certificate. | 
 |  | 
 |    Note also that you can have Apache serve up the Jar file VncViewer.jar | 
 |    and/or index.vnc/proxy.vnc instead of each x11vnc if you want to. | 
 |  | 
 |    The rules in ssl.conf are similar to the ones in httpd.conf and so are | 
 |    not discussed in detail. The only really new thing is the /vncs | 
 |    handling to download the applet jar via HTTPS on port 5915. | 
 |  | 
 |    The special entries "/vnc443" are only used for the special helper | 
 |    program (connect_switch) for the https port 443 only mode discussed | 
 |    here. | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |    INETD automation: | 
 |  | 
 |    The "single-port" (i.e. 5915) HTTPS applet download and VNC connection | 
 |    aspect shown here is convenient and also enables having x11vnc run out | 
 |    of inetd. That way x11vnc is run on demand instead of being run all | 
 |    the time (the user does not have to remember to start it). The first | 
 |    connections to inetd download index.vnc and the Jar file (via https) | 
 |    and the the last connection to inetd establishes the SSL VNC | 
 |    connection. Since x11vnc is restarted for each connection, this will | 
 |    be a bit slower than the normal process. | 
 |  | 
 |    For example, the /etc/inetd.conf line could be: | 
 |   5915 stream tcp nowait root /usr/sbin/tcpd /usr/local/bin/x11vnc_ssl.sh | 
 |  | 
 |    where the script x11vnc_ssl.sh looks something like this: | 
 | #!/bin/sh | 
 |  | 
 | /usr/local/bin/x11vnc -inetd -oa /var/log/x11vnc-15.log \ | 
 |         -ssl SAVE -http -unixpw -localhost \ | 
 |         -display :0 -auth /home/THE_USER/.Xauthority | 
 |  | 
 |    where, as usual, the inetd launching needs to know which user is | 
 |    typically using the display on that machine. One could imagine giving | 
 |    different users different ports, 5915, 5916, etc. to distinguish (then | 
 |    the script would need to be passed the username). mod_rewrite could be | 
 |    used to automatically map username in the URL to his port number. | 
 |  | 
 |    A better way is to use the "-display WAIT:cmd=FINDDISPLAY" feature to | 
 |    autodetect the user and Xauthority data: | 
 | #!/bin/sh | 
 |  | 
 | /usr/local/bin/x11vnc -inetd -oa /var/log/x11vnc-15.log \ | 
 |         -ssl SAVE -http -unixpw -localhost -users unixpw= \ | 
 |         -find | 
 |  | 
 |    (we have used the alias -find for "-display WAIT:cmd=FINDDISPLAY".) | 
 |    This way the user must supply his Unix username and password and then | 
 |    his display and Xauthority data on that machine will be located and | 
 |    returned to x11vnc to allow it to attach. If he doesn't have a display | 
 |    running on that machine or he fails to log in correctly, the | 
 |    connection will be dropped. | 
 |  | 
 |    The variant "-display WAIT:cmd=FINDCREATEDISPLAY" (aliased by | 
 |    "-create") will actually create a (virtual or real) X server session | 
 |    for the user if one doesn't already exist. See here for details. | 
 |  | 
 |    To enable inetd operation for the non-HTTPS Java viewer download (port | 
 |    5815 in the above httpd.conf example) you will need to run x11vnc in | 
 |    HTTPONCE mode on port 5815: For example, the /etc/inetd.conf line | 
 |    could be: | 
 |   5815 stream tcp nowait root /usr/sbin/tcpd /usr/local/bin/x11vnc \ | 
 |        -inetd -prog /usr/local/bin/x11vnc -oa /var/log/x11vnc-15.log \ | 
 |        -http_ssl -display WAIT:cmd=HTTPONCE | 
 |  | 
 |    where the long inetd.conf line has been split. Note how the -http_ssl | 
 |    tries to automatically find the .../classes/ssl subdirectory. This | 
 |    requires the -prog option available in x11vnc 0.8.4 (a shell script | 
 |    wrapper, e.g. /usr/local/bin/x11vnc_http.sh can be used to work around | 
 |    this). | 
 |  | 
 |    Also note the use of "-ssl SAVE" above. This way a saved server.pem is | 
 |    used for each inetd invocation (rather generating a new one each time | 
 |    as happens for "-ssl TMP"). Note that it cannot have a protecting | 
 |    passphrase because inetd will not be able to supply it. | 
 |  | 
 |    Another option is: | 
 |   5815 stream tcp nowait root /usr/sbin/tcpd /usr/local/bin/x11vnc \ | 
 |        -inetd -httpdir /usr/local/share/x11vnc/classes/ssl \ | 
 |        -oa /var/log/x11vnc-15.log -display WAIT:cmd=HTTPONCE | 
 |  | 
 |    (this also requires a feature found in x11vnc 0.8.4). | 
 |      _________________________________________________________________ | 
 |  | 
 |    Other Ideas: | 
 |  | 
 |    - The above schemes work, but they are a bit complicated with all of | 
 |    the rigging. There should be more elegant ways to configure Apache to | 
 |    do these, but we have not found them (please let us know if you | 
 |    discover something nice). However, once this scheme has been set up | 
 |    and is working it is easy to maintain and add/delete workstations, | 
 |    etc. | 
 |  | 
 |    - In general Apache is not required, but it makes things convenient. | 
 |    The firewall itself could do the port redirection via its firewall | 
 |    rules. Evidently different Internet-facing ports would be required for | 
 |    each workstation. This could be set up using iptables rules for | 
 |    example. If there were just one or two machines this would be the | 
 |    easiest method. For example: | 
 |   iptables -t nat -A PREROUTING -p tcp -d 24.35.46.57 --dport 5901 -j DNAT --to | 
 | -destination 192.168.1.2:5915 | 
 |   iptables -t nat -A PREROUTING -p tcp -d 24.35.46.57 --dport 5902 -j DNAT --to | 
 | -destination 192.168.1.3:5915 | 
 |  | 
 |    Where 24.35.46.57 is the internet IP address of the gateway. In this | 
 |    example 24.35.46.57:5901 is redirected to the internal machine | 
 |    192.168.1.2:5915 and 24.35.46.57:5902 is redirected to another | 
 |    internal machine 192.168.1.3:5915, both running x11vnc -ssl ... in SSL | 
 |    mode. For this example, the user would point the web browser to, e.g.: | 
 |   https://24.35.46.57:5901/?PORT=5901 | 
 |  | 
 |    or using the stunnel wrapper script: | 
 |   ss_vncviewer 24.35.46.57:1 | 
 |  | 
 |    One can achieve similar things with dedicated firewall/routers (e.g. | 
 |    Linksys) using the device's web or other interface to configure the | 
 |    firewall. | 
 |  | 
 |    If the user may be coming out of a firewall using a proxy it may be | 
 |    better to redirect ports 443 and 563 (instead of 5901 and 5902) to the | 
 |    internal machines so that the user's proxy will allow CONNECTing to | 
 |    them. | 
 |  | 
 |    - The redirection could also be done at the application level using a | 
 |    TCP redirect program (e.g. ip_relay or fancier ones). Evidently more | 
 |    careful internal hostname checking, etc., could be performed by the | 
 |    special purpose application to add security. See connect_switch which | 
 |    is somewhat related. | 
 |  | 
 |    - One might imagine the ProxyPass could be done for the VNC traffic as | 
 |    well (for the ssl.conf case) to avoid the CONNECT proxying completely | 
 |    (which would be nice to avoid). Unfortunately we were not able to get | 
 |    this to work. Since HTTP is a request-response protocol (as opposed to | 
 |    a full bidirectional link required by VNC that CONNECT provides) this | 
 |    makes it difficult to do. It may be possible, but we haven't found out | 
 |    how yet. | 
 |  | 
 |    All of the x11vnc Java Viewer applet parameters are described in the | 
 |    file classes/ssl/README | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |    Tricks for Better Response and reliability: | 
 |  | 
 |    The "original scheme" using httpd.conf and ssl.conf rewrites without | 
 |    urlPrefix and trustAllVncCerts above should work OK, but may lead to | 
 |    slow and/or unreliable loading of the applet and final connection to | 
 |    x11vnc. The following are what I do now to get better response and | 
 |    reliability. YMMV. | 
 |  | 
 |    The problem with the "original scheme" is that there is a point where | 
 |    the VNC Viewer applet can try up to 3 times to retrieve the x11vnc | 
 |    certificate, since it needs to get it to show it to you and ask you if | 
 |    you accept it. This can add about 45 seconds to the whole process | 
 |    (which takes 1 to 1.5 minutes with all the dialogs) since a couple of | 
 |    those connections must time out. The "trust" items in the config add a | 
 |    parameter trustAllVncCerts=yes similar to the forceProxy=yes | 
 |    parameter. This can cut the total time to the VNC password prompt down | 
 |    to 15 seconds which is pretty good. (Note by ignoring the certificate | 
 |    this does not protect against man-in-the-middle attacks which are | 
 |    rare, but maybe the won't be so rare in the future... see | 
 |    dsniff/webmitm and cain) | 
 |  | 
 |    First make sure the x11vnc SSL certificate+key is the same as | 
 |    Apache's. (otherwise you may get one extra dialog and/or one extra | 
 |    connection that has to time out). | 
 |  | 
 |    The following RewriteRule's are the same now advocated in the | 
 |    instructions above. | 
 |  | 
 |    The httpsPort and urlPrefix= parameters give hints to the applet to | 
 |    improve connecting: This is what goes in httpd.conf: | 
 |    RewriteEngine On | 
 |    RewriteRule /vnc/([^/]+)$               /vnc/$1/index.vnc?CONNECT=$1+5915&PO | 
 | RT=563&urlPrefix=_2F_vnc_2F_$1 [R,NE] | 
 |    RewriteRule /vnc/trust/([^/]+)$         /vnc/$1/index.vnc?CONNECT=$1+5915&PO | 
 | RT=563&urlPrefix=_2F_vnc_2F_$1&trustAllVncCerts=yes [R,NE] | 
 |    RewriteRule /vnc/proxy/([^/]+)$         /vnc/$1/proxy.vnc?CONNECT=$1+5915&PO | 
 | RT=563&urlPrefix=_2F_vnc_2F_$1&forceProxy=yes [R,NE] | 
 |    RewriteRule /vnc/trust/proxy/([^/]+)$   /vnc/$1/proxy.vnc?CONNECT=$1+5915&PO | 
 | RT=563&urlPrefix=_2F_vnc_2F_$1&forceProxy=yes&trustAllVncCerts=yes [R,NE] | 
 |  | 
 |    The httpsPort and urlPrefix provide useful hints to the VNC Viewer | 
 |    applet when it connects to x11vnc to glean information about Proxies, | 
 |    certificates, etc. | 
 |  | 
 |    This is what goes into ssl.conf: | 
 |    RewriteEngine On | 
 |    RewriteRule /vnc/([^/]+)$                /vnc/$1/index.vnc?CONNECT=$1+5915&P | 
 | ORT=563&httpsPort=443&GET=1&urlPrefix=_2F_vnc_2F_$1 [R,NE] | 
 |    RewriteRule /vnc/proxy/([^/]+)$          /vnc/$1/proxy.vnc?CONNECT=$1+5915&P | 
 | ORT=563&httpsPort=443&GET=1&urlPrefix=_2F_vnc_2F_$1&forceProxy=yes [R,NE] | 
 |    RewriteRule /vncs/([^/]+)$              /vncs/$1/index.vnc?CONNECT=$1+5915&P | 
 | ORT=563&httpsPort=443&GET=1&urlPrefix=_2F_vncs_2F_$1 [R,NE] | 
 |    RewriteRule /vncs/proxy/([^/]+)$        /vncs/$1/proxy.vnc?CONNECT=$1+5915&P | 
 | ORT=563&httpsPort=443&GET=1&urlPrefix=_2F_vncs_2F_$1&forceProxy=yes [R,NE] | 
 |    RewriteRule /vncs/trust/([^/]+)$        /vncs/$1/index.vnc?CONNECT=$1+5915&P | 
 | ORT=563&httpsPort=443&GET=1&urlPrefix=_2F_vncs_2F_$1&trustAllVncCerts=yes [R,NE | 
 | ] | 
 |    RewriteRule /vncs/trust/proxy/([^/]+)$  /vncs/$1/proxy.vnc?CONNECT=$1+5915&P | 
 | ORT=563&httpsPort=443&GET=1&urlPrefix=_2F_vncs_2F_$1&forceProxy=yes&trustAllVnc | 
 | Certs=yes [R,NE] | 
 |  | 
 |    The rest is the same. | 
 |  | 
 |    The httpsPort and urlPrefix and GET provide useful hints to the VNC | 
 |    Viewer applet when it connects to x11vnc to glean information about | 
 |    Proxies, certificates, etc, and also for the ultimate VNC connection | 
 |    (GET speeds this up by sending a special HTTP GET to cause x11vnc to | 
 |    immediately switch to the VNC protocol). | 
 |  | 
 |    To turn these into URLs, as was done above, take the string in the | 
 |    RewriteRule, e.g. /vncs and turn it into | 
 |    https://gateway/vncs/machinename Similarly for non-https: | 
 |    http://gateway:563/vnc/machinename | 
 |  | 
 |    If you use the 'trust' ones, you are performing NO checks, visual or | 
 |    otherwise, on the VNC SSL certificate. It is trusted without question. | 
 |    This speeds things up because it avoids a dialog about certificates, | 
 |    but of course has some risk WRT Man in the Middle attacks. I don't | 
 |    recommend them. It is better to use /vnc or /vncs and the first time | 
 |    you connect carefully check the Certificate and then tell your Browser | 
 |    and Java Virtual Machine to trust the certificate 'Always'. Then if | 
 |    you later get an unexpected dialog, you know something is wrong. | 
 |    Nearly always it is just a changed or expired certificate, but better | 
 |    safe than sorry... | 
 | 	 | 
 | ======================================================================= | 
 | http://www.karlrunge.com/x11vnc/enhanced_tightvnc_viewer.html: | 
 |  | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 | Enhanced TightVNC Viewer   (SSVNC:   SSL/SSH VNC viewer) | 
 |  | 
 |    (To Downloads)  (To Quick Start) | 
 |  | 
 |    [ssvnc.gif] [ssvnc_windows.gif] [ssvnc_macosx.gif] . . | 
 |  | 
 |  | 
 |    The Enhanced TightVNC Viewer, SSVNC, adds encryption security to VNC | 
 |    connections. | 
 |  | 
 |    The package provides a GUI for Windows, Mac OS X, and Unix that | 
 |    automatically starts up an STUNNEL SSL tunnel for SSL or ssh/plink for | 
 |    SSH connections to any VNC server, such as x11vnc, and then launches | 
 |    the VNC Viewer to use the encrypted tunnel. | 
 |  | 
 |    The x11vnc server has built-in SSL support, however SSVNC can make SSL | 
 |    encrypted VNC connections to any VNC Server if they are running an SSL | 
 |    tunnel, such as STUNNEL or socat, at their end. SSVNC's SSH tunnel | 
 |    will work to any VNC Server host running sshd that you can log into. | 
 |  | 
 |    The Enhanced TightVNC Viewer package started as a project to add some | 
 |    patches to the long neglected Unix TightVNC Viewer. However, now the | 
 |    front-end GUI, encryption, and wrapper scripts features possibly | 
 |    outweigh the Unix TightVNC Viewer improvements (see the lists below to | 
 |    compare). | 
 |  | 
 |    The SSVNC Unix vncviewer can also be run without the SSVNC encryption | 
 |    GUI as an enhanced replacement for the xvncviewer, xtightvncviewer, | 
 |    etc., viewers. | 
 |  | 
 |    In addition to normal SSL, SSVNC also supports the VeNCrypt SSL/TLS | 
 |    and Vino/ANONTLS encryption extensions to VNC on Unix, Mac OS X, and | 
 |    Windows. Via the provided SSVNC VeNCrypt bridge, VeNCrypt and ANONTLS | 
 |    encryption also works with any third party VNC Viewer (e.g. RealVNC, | 
 |    TightVNC, UltraVNC, etc...) you select via 'Change VNC Viewer'. | 
 |  | 
 |    The short name for this project is "ssvnc" for SSL/SSH VNC Viewer. | 
 |    This is the name of the command to start it. | 
 |  | 
 |    There is a simplified SSH-Only mode (sshvnc). And an even more | 
 |    simplified Terminal-Services mode (tsvnc) for use with x11vnc on the | 
 |    remote side. | 
 |  | 
 |    The tool has many additional features; see the descriptions below. | 
 |  | 
 |    It is a self-contained bundle, you could carry it around on, say, a | 
 |    USB memory stick / flash drive for secure VNC viewing from almost any | 
 |    machine, Unix, Mac OS X, and Windows (and if you create a directory | 
 |    named "Home" in the toplevel ssvnc directory on the drive your VNC | 
 |    profiles and certs will be kept there as well). For Unix, there is | 
 |    also a conventional source tarball to build and install in the normal | 
 |    way and not use a pre-built bundle. | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |     Announcements: | 
 |  | 
 |    Important: If you created any SSL certificates with SSVNC (or anything | 
 |    else) on a Debian or Ubuntu system from Sept. 2006 through May 2008, | 
 |    then those keys are likely extremely weak and can be easily cracked. | 
 |    The certificate files should be deleted and recreated on a non-Debian | 
 |    system or an updated one. See | 
 |    http://www.debian.org/security/2008/dsa-1571 for details. The same | 
 |    applies to SSH keys. | 
 |  | 
 |    Please read this information on using SSVNC on workstations with | 
 |    Untrusted Local Users. | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |     Feature List: | 
 |  | 
 |    Wrapper scripts and a tcl/tk GUI were written to create these features | 
 |    for Unix, Mac OS X, and Windows: | 
 |      * SSL support for connections using the bundled stunnel program. | 
 |      * Automatic SSH connections from the GUI (system ssh is used on Unix | 
 |        and MacOS X; bundled plink is used on Windows) | 
 |      * Ability to Save and Load VNC profiles for different hosts. | 
 |      * You can also use your own VNC Viewer, e.g. UltraVNC or RealVNC, | 
 |        with the SSVNC encryption GUI front-end if you prefer. | 
 |      * Create or Import SSL Certificates and Private Keys. | 
 |      * Reverse (viewer listening) VNC connections via SSL and SSH. | 
 |      * VeNCrypt SSL/TLS VNC encryption support (used by VeNCrypt, QEMU, | 
 |        ggi, libvirt/virt-manager/xen, vinagre/gvncviewer/gtk-vnc) | 
 |      * ANONTLS SSL/TLS VNC encryption support (used by Vino) | 
 |      * VeNCrypt and ANONTLS are also enabled for any 3rd party VNC Viewer | 
 |        (e.g. RealVNC, TightVNC, UltraVNC ...) on Unix, MacOSX, and | 
 |        Windows via the provided SSVNC VeNCrypt Viewer Bridge tool (use | 
 |        'Change VNC Viewer' to select the one you want.) | 
 |      * Support for Web Proxies, SOCKS Proxies, and the UltraVNC repeater | 
 |        proxy (e.g. repeater://host:port+ID:1234). Multiple proxies may be | 
 |        chained together (3 max). | 
 |      * Support for SSH Gateway connections and non-standard SSH ports. | 
 |      * Automatic Service tunnelling via SSH for CUPS and SMB Printing, | 
 |        ESD/ARTSD Audio, and SMB (Windows/Samba) filesystem mounting. | 
 |      * Sets up any additional SSH port redirections that you want. | 
 |      * Zeroconf (aka Bonjour) is used on Unix and Mac OS X to find VNC | 
 |        servers on your local network if the avahi-browse or dns-sd | 
 |        program is available and in your PATH. | 
 |      * Port Knocking for "closed port" SSH/SSL connections. In addition | 
 |        to a simple fixed port sequence and one-time-pad implementation, a | 
 |        hook is also provided to run any port knocking client before | 
 |        connecting. | 
 |      * Support for native MacOS X usage with bundled Chicken of the VNC | 
 |        viewer (the Unix X11 viewer is also provided for MacOS X, and is | 
 |        better IMHO. It is now the default on MacOS X.) | 
 |      * Dynamic VNC Server Port determination and redirection (using ssh's | 
 |        builtin SOCKS proxy, ssh -D) for servers like x11vnc that print | 
 |        out PORT= at startup. | 
 |      * Unix Username and Password entry for use with "x11vnc -unixpw" | 
 |        type login dialogs. | 
 |      * Simplified mode launched by command "sshvnc" that is SSH Only. | 
 |      * Simplified mode launched by command "tsvnc" that provides a VNC | 
 |        "Terminal Services" mode (uses x11vnc on the remote side). | 
 |      * IPv6 support for all connection modes on Unix, MacOSX, and | 
 |        Windows. | 
 |  | 
 |    Patches to TightVNC 1.3.9 vnc_unixsrc tree were created for Unix | 
 |    TightVNC Viewer improvements (these only apply to the Unix VNC viewer, | 
 |    including MacOSX XQuartz): | 
 |      * rfbNewFBSize VNC support (dynamic screen resizing) | 
 |      * Client-side Scaling of the Desktop in the viewer. | 
 |      * ZRLE VNC encoding support (RealVNC's encoding) | 
 |      * Support for the ZYWRLE encoding, a wavelet based extension to ZRLE | 
 |        to improve compression of motion video and photo regions. | 
 |      * TurboVNC support (VirtualGL's modified TightVNC encoding; requires | 
 |        TurboJPEG library) | 
 |      * Pipelined Updates of the framebuffer as in TurboVNC (asks for the | 
 |        next update before the current one has finished downloading; this | 
 |        gives some speedup on high latency connections.) | 
 |      * Cursor alphablending with x11vnc at 32bpp (-alpha option) | 
 |      * Option "-unixpw ..." for use with "x11vnc -unixpw" type login | 
 |        dialogs. | 
 |      * Support for UltraVNC extensions: 1/n Server side scaling, Text | 
 |        Chat, Single Window, Disable Server-side Input. Both UltraVNC and | 
 |        x11vnc servers support these extensions. | 
 |      * UltraVNC File Transfer via an auxiliary Java helper program (java | 
 |        must be in $PATH). Note that the x11vnc server also supports | 
 |        UltraVNC file transfer. | 
 |      * Connection support for the UltraVNC repeater proxy (-repeater | 
 |        option). | 
 |      * Support for UltraVNC Single Click operation. (both unencrypted: SC | 
 |        I, and SSL encrypted: SC III) | 
 |      * Support for UltraVNC DSM Encryption Plugin symmetric encryption | 
 |        mode. (ARC4, AESV2, MSRC4, and SecureVNC) | 
 |      * Support for UltraVNC MS-Logon authentication (NOTE: the UltraVNC | 
 |        MS-Logon key exchange implementation is very weak; an eavesdropper | 
 |        on the network can recover your Windows password easily in a few | 
 |        seconds; you need to use an additional encrypted tunnel with | 
 |        MS-Logon.) | 
 |      * Support for symmetric encryption (including blowfish and 3des | 
 |        ciphers) to Non-UltraVNC Servers. Any server using the same | 
 |        encryption method will work, e.g.:  x11vnc -enc blowfish:./my.key | 
 |      * Instead of hostname:display one can also supply "exec=command | 
 |        args..." to connect the viewer to the stdio of an external command | 
 |        (e.g. stunnel or socat) rather than using a TCP/IP socket. Unix | 
 |        domain sockets, e.g. /path/to/unix/socket, and a previously opened | 
 |        file descriptor fd=0, work too. | 
 |      * Local Port Protections for STUNNEL and SSH: avoid having for long | 
 |        periods of time a listening port on the the local (VNC viewer) | 
 |        side that redirects to the remote side. | 
 |      * Reverse (viewer listening) VNC connections can show a Popup dialog | 
 |        asking whether to accept the connection or not (-acceptpopup.) The | 
 |        extra info provided by UltraVNC Single Click reverse connections | 
 |        is also supported (-acceptpopupsc) | 
 |      * Extremely low color modes: 64 and 8 colors in 8bpp | 
 |        (-use64/-bgr222, -use8/-bgr111) | 
 |      * Medium color mode: 16bpp mode on a 32bpp Viewer display | 
 |        (-16bpp/-bgr565) | 
 |      * For use with x11vnc's client-side caching -ncache method use the | 
 |        cropping option -ycrop n. This will "hide" the large pixel buffer | 
 |        cache below the actual display. Set to the actual height or use -1 | 
 |        for autodetection (also, tall screens, H > 2*W, are autodetected | 
 |        by default). | 
 |      * Escape Keys: specify a set of modifier keys so that when they are | 
 |        all pressed down you can invoke Popup menu actions via keystrokes. | 
 |        I.e., a set of 'Hot Keys'. One can also pan (move) the desktop | 
 |        inside the viewport via Arrow keys or a mouse drag. | 
 |      * Scrollbar width setting: -sbwidth n, the default is very thin, 2 | 
 |        pixels, for less distracting -ycrop usage. | 
 |      * Selection text sending and receiving can be fine-tuned with the | 
 |        -sendclipboard, -sendalways, and -recvtext options. | 
 |      * TightVNC compression and quality levels are automatically set | 
 |        based on observed network latency (n.b. not bandwidth.) | 
 |      * Improvements to the Popup menu, all of these can now be changed | 
 |        dynamically via the menu: ViewOnly, Toggle Bell, CursorShape | 
 |        updates, X11 Cursor, Cursor Alphablending, Toggle Tight/ZRLE, | 
 |        Toggle JPEG, FullColor/16bpp/8bpp (256/64/8 colors), Greyscale for | 
 |        low color modes, Scaling the Viewer resolution, Escape Keys, | 
 |        Pipeline Updates, and others, including UltraVNC extensions. | 
 |      * Maintains its own BackingStore if the X server does not. | 
 |      * The default for localhost:0 connections is not raw encoding since | 
 |        same-machine connections are pretty rare. Default assumes you are | 
 |        using a SSL or SSH tunnel. Use -rawlocal to revert. | 
 |      * XGrabServer support for fullscreen mode, for old window managers | 
 |        (-grab/-graball option). | 
 |      * Fix for Popup menu positioning for old window managers (-popupfix | 
 |        option). | 
 |      * The VNC Viewer ssvncviewer supports IPv6 natively (no helpers | 
 |        needed.) | 
 |  | 
 |    The list of 3rd party software bundled in the archive files: | 
 |      * TightVNC Viewer  (windows, unix, macosx) | 
 |      * Chicken of the VNC Viewer  (macosx) | 
 |      * Stunnel  (windows, unix, macosx) | 
 |      * Putty/Plink/Pageant  (windows) | 
 |      * OpenSSL  (windows) | 
 |      * esound  (windows) | 
 |  | 
 |    These are all self-contained in the bundle directory: they will not be | 
 |    installed on your system. Just un-zip or un-tar the file you | 
 |    downloaded and run the frontend ssvnc straight from its directory. | 
 |    Alternatively, on Unix you can use the conventional source tarball. | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |    Here is the Quick Start info from the README for how to setup and use | 
 |    SSVNC: | 
 | Quick Start: | 
 | ----------- | 
 |  | 
 | Unix and Mac OS X: | 
 |  | 
 |     Inside a Terminal do something like the following. | 
 |  | 
 |     Unpack the archive: | 
 |  | 
 |         % gzip -dc ssvnc-1.0.29.tar.gz | tar xvf - | 
 |  | 
 |     Run the GUI: | 
 |  | 
 |         % ./ssvnc/Unix/ssvnc               (for Unix) | 
 |  | 
 |         % ./ssvnc/MacOSX/ssvnc             (for Mac OS X) | 
 |  | 
 |     The smaller file "ssvnc_no_windows-1.0.29.tar.gz" | 
 |     could have been used as well. | 
 |  | 
 |     On MacOSX you could also click on the SSVNC app icon in the Finder. | 
 |  | 
 |     On MacOSX if you don't like the Chicken of the VNC (e.g. no local | 
 |     cursors, no screen size rescaling, and no password prompting), and you | 
 |     have the XDarwin X server installed, you can set DISPLAY before starting | 
 |     ssvnc (or type DISPLAY=... in Host:Disp and hit Return).  Then our | 
 |     enhanced TightVNC viewer will be used instead of COTVNC. | 
 |     Update: there is now a 'Use X11 vncviewer on MacOSX' under Options ... | 
 |  | 
 |  | 
 |     If you want a SSH-only tool (without the distractions of SSL) run | 
 |     the command: | 
 |  | 
 |                 sshvnc | 
 |  | 
 |     instead of "ssvnc".  Or click "SSH-Only Mode" under Options. | 
 |     Control-h will toggle between the two modes. | 
 |  | 
 |  | 
 |     If you want a simple VNC Terminal Services only mode (requires x11vnc | 
 |     on the remote server) run the command: | 
 |  | 
 |                 tsvnc | 
 |  | 
 |     instead of "ssvnc".  Or click "Terminal Services" under Options. | 
 |     Control-t will toggle between the two modes. | 
 |  | 
 |     "tsvnc profile-name" and "tsvnc user@hostname" work too. | 
 |  | 
 |  | 
 | Unix/MacOSX Install: | 
 |  | 
 |     There is no standard install for the bundles, but you can make | 
 |     symlinks like so: | 
 |  | 
 |         cd /a/directory/in/PATH | 
 |         ln -s /path/to/ssvnc/bin/{s,t}* . | 
 |  | 
 |     Or put /path/to/ssvnc/bin, /path/to/ssvnc/Unix, or /path/to/ssvnc/MacOSX | 
 |     in your PATH. | 
 |  | 
 |     For the conventional source tarball it will compile and install, e.g.: | 
 |  | 
 |        gzip -dc ssvnc-1.0.29.src.tar.gz | tar xvf - | 
 |        cd ssvnc-1.0.29 | 
 |        make config | 
 |        make all | 
 |        make PREFIX=/my/install/dir install | 
 |  | 
 |     then have /my/install/dir/bin in your PATH. | 
 |  | 
 |  | 
 |  | 
 | Windows: | 
 |  | 
 |     Unzip, using WinZip or a similar utility, the zip file: | 
 |  | 
 |         ssvnc-1.0.29.zip | 
 |  | 
 |     Run the GUI, e.g.: | 
 |  | 
 |         Start -> Run -> Browse | 
 |  | 
 |     and then navigate to | 
 |  | 
 |         .../ssvnc/Windows/ssvnc.exe | 
 |  | 
 |     select Open, and then OK to launch it. | 
 |  | 
 |     The smaller file "ssvnc_windows_only-1.0.29.zip" | 
 |     could have been used as well. | 
 |  | 
 |     You can make a Windows shortcut to this program if you want to. | 
 |  | 
 |     See the Windows/README.txt for more info. | 
 |  | 
 |  | 
 |     If you want a SSH-only tool (without the distractions of SSL) run | 
 |     the command: | 
 |  | 
 |                 sshvnc.bat | 
 |  | 
 |     Or click "SSH-Only Mode" under Options. | 
 |  | 
 |  | 
 |     If you want a simple VNC Terminal Services only mode (requires x11vnc | 
 |     on the remote server) run the command: | 
 |  | 
 |                 tsvnc.bat | 
 |  | 
 |     Or click "Terminal Services" under Options.  Control-t will toggle | 
 |     between the two modes.  "tsvnc profile-name" and "tsvnc user@hostname" | 
 |     work too. | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |    You can read all of the SSVNC GUI's Online Help Text here. | 
 |      _________________________________________________________________ | 
 |  | 
 |    The bundle unpacks a directory/folder named: ssvnc. It contains these | 
 |    programs to launch the GUI: | 
 |         Windows/ssvnc.exe        for Windows | 
 |         MacOSX/ssvnc             for Mac OS X | 
 |         Unix/ssvnc               for Unix | 
 |  | 
 |    (the Mac OS X and Unix launchers are simply links to the bin | 
 |    directory). See the README for more information. | 
 |  | 
 |    The SSH-Only mode launcher program has name sshvnc. The Terminal | 
 |    Services mode launcher program (assumes x11vnc 0.8.4 or later and Xvfb | 
 |    installed on the server machine) has name tsvnc. | 
 |  | 
 |    The Viewer SSL support is done via a wrapper script (bin/ssvnc_cmd | 
 |    that calls bin/util/ss_vncviewer) that starts up the STUNNEL tunnel | 
 |    first and then starts the TightVNC viewer pointed at that tunnel. The | 
 |    bin/ssvnc program is a GUI front-end to that script. See this FAQ for | 
 |    more details on SSL tunnelling. In SSH connection mode, the wrappers | 
 |    start up SSH appropriately. | 
 |  | 
 |  | 
 |    Memory Stick Usage: If you create a directory named "Home" in that | 
 |    toplevel ssvnc directory then that will be used as the base for | 
 |    storing VNC profiles and certificates. Also, for convenience, if you | 
 |    first run the command with "." as an argument (e.g. "ssvnc .") it will | 
 |    automatically create the "Home" directory for you. This is handy if | 
 |    you want to place SSVNC on a USB flash drive that you carry around for | 
 |    mobile use and you want the profiles you create to stay with the drive | 
 |    (otherwise you'd have to browse to the drive directory each time you | 
 |    load or save). | 
 |  | 
 |    One user on Windows created a BAT file to launch SSVNC and needed to | 
 |    do this to get the Home directory correct: | 
 | cd \ssvnc\Windows | 
 | start \ssvnc\Windows\ssvnc.exe | 
 |  | 
 |    (an optional profile name can be supplied to the ssvnc.exe line) | 
 |  | 
 |    WARNING: if you use ssvnc from an "Internet Cafe", i.e. some untrusted | 
 |    computer, please be aware that someone may have set up that machine to | 
 |    be capturing your keystrokes, etc. | 
 |  | 
 |  | 
 |    SSH-Only version: The command "sshvnc" can be run instead of "ssvnc" | 
 |    to get an SSH-only version of the tool: | 
 |  | 
 |    [sshvnc.gif] | 
 |  | 
 |    These also work: "sshvnc myprofile" and "sshvnc user@hostname". To | 
 |    switch from the regular SSVNC mode, click "SSH-Only Mode" under | 
 |    Options. This mode is less distracting if you never plan to use SSL, | 
 |    manage certificates, etc. | 
 |  | 
 |  | 
 |    Terminal Services Only: The command "tsvnc" can be run instead of | 
 |    "ssvnc" to get a "Terminal Services" only version of the tool: | 
 |  | 
 |    [tsvnc.gif] | 
 |  | 
 |    These also work: "tsvnc myprofile" and "tsvnc user@hostname". To | 
 |    switch from the regular SSVNC mode, click "Terminal Services" under | 
 |    Options. | 
 |  | 
 |    This mode requires x11vnc (0.9.3 or later) installed on the remote | 
 |    machine to find, create, and manage the user sessions. SSH is used to | 
 |    create the encrypted and authenticated tunnel. The Xvfb (virtual | 
 |    framebuffer X server) program must also be installed on the remote | 
 |    system. However tsvnc will also connect to a real X session (i.e. on | 
 |    the physical hardware) if you are already logged into the X session; | 
 |    this is a useful access mode and does not require Xvfb on the remote | 
 |    system. | 
 |  | 
 |    This mode should be very easy for beginner users to understand and | 
 |    use. On the remote end you only need to have x11vnc and Xvfb available | 
 |    in $PATH, and on the local end you just run something like: | 
 |    tsvnc [email protected] | 
 |  | 
 |    (or start up the tsvnc GUI first and then enter [email protected] and | 
 |    press "Connect"). | 
 |  | 
 |    Normally the Terminal Services sessions created are virtual (RAM-only) | 
 |    ones (e.g. Xvfb, Xdummy, or Xvnc), however a nice feature is if you | 
 |    have a regular X session (i.e displaying on the physical hardware) on | 
 |    the remote machine that you are ALREADY logged into, then the x11vnc | 
 |    run from tsvnc will find it for you as well. | 
 |  | 
 |    Also, there is setting "X Login" under Advanced Options that allows | 
 |    you to attach to a real X server with no one logged in yet (i.e. | 
 |    XDM/GDM/KDM Login Greeter screen) as long as you have sudo(1) | 
 |    permission on the remote machine. | 
 |  | 
 |    Nice features to soon to be added to the tsvnc mode are easy CUPS | 
 |    printing (working fairly well) and Sound redirection (needs much work) | 
 |    of the Terminal Services Desktop session. It is easier in tsvnc mode | 
 |    because the entire desktop session can be started with the correct | 
 |    environment. ssvnc tries to handle the general case of an already | 
 |    started desktop and that is more difficult. | 
 |  | 
 |  | 
 |    Proxies: Web proxies, SOCKS proxies, and the UltraVNC repeater proxy | 
 |    are supported to allow the SSVNC connection to go through the proxy to | 
 |    the otherwise unreachable VNC Server. SSH gateway machines can be used | 
 |    in the same way. Read more about SSVNC proxy support here. | 
 |  | 
 |  | 
 |    Dynamic VNC Server Port determination: If you are running SSVNC on | 
 |    Unix and are using SSH to start the remote VNC server and the VNC | 
 |    server prints out the line "PORT=NNNN" to indicate which dynamic port | 
 |    it is using (x11vnc does this), then if you prefix the SSH command | 
 |    with "PORT=" SSVNC will watch for the PORT=NNNN line and uses ssh's | 
 |    built in SOCKS proxy (ssh -D ...) to connect to the dynamic VNC server | 
 |    port through the SSH tunnel. For example: | 
 |         VNC Host:Display     [email protected] | 
 |         Remote SSH Command:  PORT= x11vnc -find | 
 |  | 
 |    or "PORT= x11vnc -display :0 -localhost", etc. Or use "P= x11vnc ..." | 
 |  | 
 |    There is also code to detect the display of the regular Unix | 
 |    vncserver(1). It extracts the display (and hence port) from the lines | 
 |    "New 'X' desktop is hostname:4" and also "VNC server is already | 
 |    running as :4". So you can use something like: | 
 |         PORT= vncserver; sleep 15 | 
 | or:     PORT= vncserver :4; sleep 15 | 
 |  | 
 |    the latter is preferred because when you reconnect with it will find | 
 |    the already running one. The former one will keep creating new X | 
 |    sessions if called repeatedly. | 
 |  | 
 |    If you use PORT= on Windows, a large random port is selected instead | 
 |    and the -rfbport option is passed to x11vnc (it does not work with | 
 |    vncserver). | 
 |  | 
 |  | 
 |  | 
 |    Patches for Unix Tightvnc viewer: | 
 |  | 
 |    The rfbNewFBSize support allows the enhanced TightVNC Unix viewer to | 
 |    resize when the server does (e.g. "x11vnc -R scale=3/4" remote control | 
 |    command). | 
 |  | 
 |    The cursor alphablending is described here. | 
 |  | 
 |    The RealVNC ZRLE encoding is supported, in addition to some low colors | 
 |    modes (16bpp and 8bpp at 256, 64, and even 8 colors, for use on very | 
 |    slow connections). Greyscales are also enabled for the low color | 
 |    modes. | 
 |  | 
 |    The Popup menu (F8) is enhanced with the ability to change many things | 
 |    on the fly. F9 is added as a shortcut to toggle FullScreen mode. | 
 |  | 
 |    Client Side Caching: The x11vnc client-side caching is handled nicely | 
 |    by this viewer. The very large pixel cache below the actual display in | 
 |    this caching method is distracting. Our Unix VNC viewer will | 
 |    automatically try to autodetect the actual display height if the | 
 |    framebuffer is very tall (more than twice as high as it is wide). One | 
 |    can also set the height to the known value via -ycrop n, or use -ycrop | 
 |    -1 to force autodection. In fullscreen mode one is not possible to | 
 |    scroll down to the pixel cache region. In non-fullscreen mode the | 
 |    window manager frame is "shrink-wrapped" around the actual screen | 
 |    display. You can still scroll down to the pixel cache region. The | 
 |    scrollbars are set to be very thin (2 pixels) to be less distracting. | 
 |    Use the -sbwidth n to make them wider. | 
 |  | 
 |    Probably nobody is interested in the grabserver patch for old window | 
 |    managers when the viewer is in fullscreen mode... This and some other | 
 |    unfixed bugs have been fixed in our patches (fullscreen toggle works | 
 |    with KDE, -x11cursor has been fixed, and the dot cursor has been made | 
 |    smaller). | 
 |  | 
 |    From the -help output: | 
 | SSVNC Viewer (based on TightVNC viewer version 1.3.9) | 
 |  | 
 | Usage: vncviewer [<OPTIONS>] [<HOST>][:<DISPLAY#>] | 
 |        vncviewer [<OPTIONS>] [<HOST>][::<PORT#>] | 
 |        vncviewer [<OPTIONS>] exec=[CMD ARGS...] | 
 |        vncviewer [<OPTIONS>] fd=n | 
 |        vncviewer [<OPTIONS>] /path/to/unix/socket | 
 |        vncviewer [<OPTIONS>] -listen [<DISPLAY#>] | 
 |        vncviewer -help | 
 |  | 
 | <OPTIONS> are standard Xt options, or: | 
 |         -via <GATEWAY> | 
 |         -shared (set by default) | 
 |         -noshared | 
 |         -viewonly | 
 |         -fullscreen | 
 |         -noraiseonbeep | 
 |         -passwd <PASSWD-FILENAME> (standard VNC authentication) | 
 |         -user <USERNAME> (Unix login authentication) | 
 |         -encodings <ENCODING-LIST> (e.g. "tight,copyrect") | 
 |         -bgr233 | 
 |         -owncmap | 
 |         -truecolour | 
 |         -depth <DEPTH> | 
 |         -compresslevel <COMPRESS-VALUE> (0..9: 0-fast, 9-best) | 
 |         -quality <JPEG-QUALITY-VALUE> (0..9: 0-low, 9-high) | 
 |         -nojpeg | 
 |         -nocursorshape | 
 |         -x11cursor | 
 |         -autopass | 
 |  | 
 | Option names may be abbreviated, e.g. -bgr instead of -bgr233. | 
 | See the manual page for more information. | 
 |  | 
 |  | 
 | Enhanced TightVNC viewer (SSVNC) options: | 
 |  | 
 |    URL http://www.karlrunge.com/x11vnc/ssvnc.html | 
 |  | 
 |    Note: ZRLE and ZYWRLE encodings are now supported. | 
 |  | 
 |    Note: F9 is shortcut to Toggle FullScreen mode. | 
 |  | 
 |    Note: In -listen mode set the env var. SSVNC_MULTIPLE_LISTEN=1 | 
 |          to allow more than one incoming VNC server at a time. | 
 |          This is the same as -multilisten described below.  Set | 
 |          SSVNC_MULTIPLE_LISTEN=MAX:n to allow no more than "n" | 
 |          simultaneous reverse connections. | 
 |  | 
 |    Note: If the host:port is specified as "exec=command args..." | 
 |          then instead of making a TCP/IP socket connection to the | 
 |          remote VNC server, "command args..." is executed and the | 
 |          viewer is attached to its stdio.  This enables tunnelling | 
 |          established via an external command, e.g. an stunnel(8) | 
 |          that does not involve a listening socket.  This mode does | 
 |          not work for -listen reverse connections. | 
 |  | 
 |          If the host:port is specified as "fd=n" then it is assumed | 
 |          n is an already opened file descriptor to the socket. (i.e | 
 |          the parent did fork+exec) | 
 |  | 
 |          If the host:port contains a '/' it is interpreted as a | 
 |          unix-domain socket (AF_LOCAL insead of AF_INET) | 
 |  | 
 |         -multilisten  As in -listen (reverse connection listening) except | 
 |                     allow more than one incoming VNC server to be connected | 
 |                     at a time.  The default for -listen of only one at a | 
 |                     time tries to play it safe by not allowing anyone on | 
 |                     the network to put (many) desktops on your screen over | 
 |                     a long window of time. Use -multilisten for no limit. | 
 |  | 
 |         -acceptpopup  In -listen (reverse connection listening) mode when | 
 |                     a reverse VNC connection comes in show a popup asking | 
 |                     whether to Accept or Reject the connection.  The IP | 
 |                     address of the connecting host is shown.  Same as | 
 |                     setting the env. var. SSVNC_ACCEPT_POPUP=1. | 
 |  | 
 |         -acceptpopupsc  As in -acceptpopup except assume UltraVNC Single | 
 |                     Click (SC) server.  Retrieve User and ComputerName | 
 |                     info from UltraVNC Server and display in the Popup. | 
 |  | 
 |         -use64      In -bgr233 mode, use 64 colors instead of 256. | 
 |         -bgr222     Same as -use64. | 
 |  | 
 |         -use8       In -bgr233 mode, use 8 colors instead of 256. | 
 |         -bgr111     Same as -use8. | 
 |  | 
 |         -16bpp      If the vnc viewer X display is depth 24 at 32bpp | 
 |                     request a 16bpp format from the VNC server to cut | 
 |                     network traffic by up to 2X, then tranlate the | 
 |                     pixels to 32bpp locally. | 
 |         -bgr565     Same as -16bpp. | 
 |  | 
 |         -grey       Use a grey scale for the 16- and 8-bpp modes. | 
 |  | 
 |         -alpha      Use alphablending transparency for local cursors | 
 |                     requires: x11vnc server, both client and server | 
 |                     must be 32bpp and same endianness. | 
 |  | 
 |         -scale str  Scale the desktop locally.  The string "str" can | 
 |                     a floating point ratio, e.g. "0.9", or a fraction, | 
 |                     e.g. "3/4", or WxH, e.g. 1280x1024.  Use "fit" | 
 |                     to fit in the current screen size.  Use "auto" to | 
 |                     fit in the window size.  "str" can also be set by | 
 |                     the env. var. SSVNC_SCALE. | 
 |  | 
 |                     If you observe mouse trail painting errors, enable | 
 |                     X11 Cursor mode (either via Popup or -x11cursor.) | 
 |  | 
 |                     Note that scaling is done in software and so can be | 
 |                     slow and requires more memory.  Some speedup Tips: | 
 |  | 
 |                         ZRLE is faster than Tight in this mode.  When | 
 |                         scaling is first detected, the encoding will | 
 |                         be automatically switched to ZRLE.  Use the | 
 |                         Popup menu if you want to go back to Tight. | 
 |                         Set SSVNC_PRESERVE_ENCODING=1 to disable this. | 
 |  | 
 |                         Use a solid background on the remote side. | 
 |                         (e.g. manually or via x11vnc -solid ...) | 
 |  | 
 |                         If the remote server is x11vnc, try client | 
 |                         side caching: x11vnc -ncache 10 ... | 
 |  | 
 |         -ycrop n    Only show the top n rows of the framebuffer.  For | 
 |                     use with x11vnc -ncache client caching option | 
 |                     to help "hide" the pixel cache region. | 
 |                     Use a negative value (e.g. -1) for autodetection. | 
 |                     Autodetection will always take place if the remote | 
 |                     fb height is more than 2 times the width. | 
 |  | 
 |         -sbwidth n  Scrollbar width for x11vnc -ncache mode (-ycrop), | 
 |                     default is very narrow: 2 pixels, it is narrow to | 
 |                     avoid distraction in -ycrop mode. | 
 |  | 
 |         -nobell     Disable bell. | 
 |  | 
 |         -rawlocal   Prefer raw encoding for localhost, default is | 
 |                     no, i.e. assumes you have a SSH tunnel instead. | 
 |  | 
 |         -notty      Try to avoid using the terminal for interactive | 
 |                     responses: use windows for messages and prompting | 
 |                     instead.  Messages will also be printed to terminal. | 
 |  | 
 |         -sendclipboard  Send the X CLIPBOARD selection (i.e. Ctrl+C, | 
 |                         Ctrl+V) instead of the X PRIMARY selection (mouse | 
 |                         select and middle button paste.) | 
 |  | 
 |         -sendalways     Whenever the mouse enters the VNC viewer main | 
 |                         window, send the selection to the VNC server even if | 
 |                         it has not changed.  This is like the Xt resource | 
 |                         translation SelectionToVNC(always) | 
 |  | 
 |         -recvtext str   When cut text is received from the VNC server, | 
 |                         ssvncviewer will set both the X PRIMARY and the | 
 |                         X CLIPBOARD local selections.  To control which | 
 |                         is set, specify 'str' as 'primary', 'clipboard', | 
 |                         or 'both' (the default.) | 
 |  | 
 |         -graball    Grab the entire X server when in fullscreen mode, | 
 |                     needed by some old window managers like fvwm2. | 
 |  | 
 |         -popupfix   Warp the popup back to the pointer position, | 
 |                     needed by some old window managers like fvwm2. | 
 |         -sendclipboard  Send the X CLIPBOARD selection (i.e. Ctrl+C, | 
 |                         Ctrl+V) instead of the X PRIMARY selection (mouse | 
 |                         select and middle button paste.) | 
 |  | 
 |         -sendalways     Whenever the mouse enters the VNC viewer main | 
 |                         window, send the selection to the VNC server even if | 
 |                         it has not changed.  This is like the Xt resource | 
 |                         translation SelectionToVNC(always) | 
 |  | 
 |         -recvtext str   When cut text is received from the VNC server, | 
 |                         ssvncviewer will set both the X PRIMARY and the | 
 |                         X CLIPBOARD local selections.  To control which | 
 |                         is set, specify 'str' as 'primary', 'clipboard', | 
 |                         or 'both' (the default.) | 
 |  | 
 |         -graball    Grab the entire X server when in fullscreen mode, | 
 |                     needed by some old window managers like fvwm2. | 
 |  | 
 |         -popupfix   Warp the popup back to the pointer position, | 
 |                     needed by some old window managers like fvwm2. | 
 |  | 
 |         -grabkbd    Grab the X keyboard when in fullscreen mode, | 
 |                     needed by some window managers. Same as -grabkeyboard. | 
 |                     -grabkbd is the default, use -nograbkbd to disable. | 
 |  | 
 |         -bs, -nobs  Whether or not to use X server Backingstore for the | 
 |                     main viewer window.  The default is to not, mainly | 
 |                     because most Linux, etc, systems X servers disable | 
 |                     *all* Backingstore by default.  To re-enable it put | 
 |  | 
 |                         Option "Backingstore" | 
 |  | 
 |                     in the Device section of /etc/X11/xorg.conf. | 
 |                     In -bs mode with no X server backingstore, whenever an | 
 |                     area of the screen is re-exposed it must go out to the | 
 |                     VNC server to retrieve the pixels. This is too slow. | 
 |  | 
 |                     In -nobs mode, memory is allocated by the viewer to | 
 |                     provide its own backing of the main viewer window. This | 
 |                     actually makes some activities faster (changes in large | 
 |                     regions) but can appear to "flash" too much. | 
 |  | 
 |         -noshm      Disable use of MIT shared memory extension (not recommended | 
 | ) | 
 |  | 
 |         -termchat   Do the UltraVNC chat in the terminal vncviewer is in | 
 |                     instead of in an independent window. | 
 |  | 
 |         -unixpw str Useful for logging into x11vnc in -unixpw mode. "str" is a | 
 |                     string that allows many ways to enter the Unix Username | 
 |                     and Unix Password.  These characters: username, newline, | 
 |                     password, newline are sent to the VNC server after any VNC | 
 |                     authentication has taken place.  Under x11vnc they are | 
 |                     used for the -unixpw login.  Other VNC servers could do | 
 |                     something similar. | 
 |  | 
 |                     You can also indicate "str" via the environment | 
 |                     variable SSVNC_UNIXPW. | 
 |  | 
 |                     Note that the Escape key is actually sent first to tell | 
 |                     x11vnc to not echo the Unix Username back to the VNC | 
 |                     viewer. Set SSVNC_UNIXPW_NOESC=1 to override this. | 
 |  | 
 |                     If str is ".", then you are prompted at the command line | 
 |                     for the username and password in the normal way.  If str is | 
 |                     "-" the stdin is read via getpass(3) for username@password. | 
 |                     Otherwise if str is a file, it is opened and the first line | 
 |                     read is taken as the Unix username and the 2nd as the | 
 |                     password. If str prefixed by "rm:" the file is removed | 
 |                     after reading. Otherwise, if str has a "@" character, | 
 |                     it is taken as username@password. Otherwise, the program | 
 |                     exits with an error. Got all that? | 
 |  | 
 |      -repeater str  This is for use with UltraVNC repeater proxy described | 
 |                     here: http://www.uvnc.com/addons/repeater.html.  The "str" | 
 |                     is the ID string to be sent to the repeater.  E.g. ID:1234 | 
 |                     It can also be the hostname and port or display of the VNC | 
 |                     server, e.g. 12.34.56.78:0 or snoopy.com:1.  Note that when | 
 |                     using -repeater, the host:dpy on the cmdline is the repeate | 
 | r | 
 |                     server, NOT the VNC server.  The repeater will connect you. | 
 |  | 
 |                     Example: vncviewer ... -repeater ID:3333 repeat.host:5900 | 
 |                     Example: vncviewer ... -repeater vhost:0 repeat.host:5900 | 
 |  | 
 |                     Use, e.g., '-repeater SCIII=ID:3210' if the repeater is a | 
 |                     Single Click III (SSL) repeater (repeater_SSL.exe) and you | 
 |                     are passing the SSL part of the connection through stunnel, | 
 |                     socat, etc. This way the magic UltraVNC string 'testB' | 
 |                     needed to work with the repeater is sent to it. | 
 |  | 
 |      -rfbversion str Set the advertised RFB version.  E.g.: -rfbversion 3.6 | 
 |                     For some servers, e.g. UltraVNC this needs to be done. | 
 |  | 
 |      -ultradsm      UltraVNC has symmetric private key encryption DSM plugins: | 
 |                     http://www.uvnc.com/features/encryption.html. It is assumed | 
 |                     you are using a unix program (e.g. our ultravnc_dsm_helper) | 
 |                     to encrypt and decrypt the UltraVNC DSM stream. IN ADDITION | 
 |                     TO THAT supply -ultradsm to tell THIS viewer to modify the | 
 |                     RFB data sent so as to work with the UltraVNC Server. For | 
 |                     some reason, each RFB msg type must be sent twice under DSM | 
 | . | 
 |  | 
 |      -mslogon user  Use Windows MS Logon to an UltraVNC server.  Supply the | 
 |                     username or "1" to be prompted.  The default is to | 
 |                     autodetect the UltraVNC MS Logon server and prompt for | 
 |                     the username and password. | 
 |  | 
 |                     IMPORTANT NOTE: The UltraVNC MS-Logon Diffie-Hellman | 
 |                     exchange is very weak and can be brute forced to recover | 
 |                     your username and password in a few seconds of CPU time. | 
 |                     To be safe, be sure to use an additional encrypted tunnel | 
 |                     (e.g. SSL or SSH) for the entire VNC session. | 
 |  | 
 |      -chatonly      Try to be a client that only does UltraVNC text chat. This | 
 |                     mode is used by x11vnc to present a chat window on the | 
 |                     physical X11 console (i.e. chat with the person at the | 
 |                     display). | 
 |  | 
 |      -env VAR=VALUE To save writing a shell script to set environment variables | 
 | , | 
 |                     specify as many as you need on the command line.  For | 
 |                     example, -env SSVNC_MULTIPLE_LISTEN=MAX:5 -env EDITOR=vi | 
 |  | 
 |      -noipv6        Disable all IPv6 sockets.  Same as VNCVIEWER_NO_IPV6=1. | 
 |  | 
 |      -noipv4        Disable all IPv4 sockets.  Same as VNCVIEWER_NO_IPV4=1. | 
 |  | 
 |      -printres      Print out the Ssvnc X resources (appdefaults) and then exit | 
 |                     You can save them to a file and customize them (e.g. the | 
 |                     keybindings and Popup menu)  Then point to the file via | 
 |                     XENVIRONMENT or XAPPLRESDIR. | 
 |  | 
 |      -pipeline      Like TurboVNC, request the next framebuffer update as soon | 
 |                     as possible instead of waiting until the end of the current | 
 |                     framebuffer update coming in.  Helps 'pipeline' the updates | 
 | . | 
 |                     This is currently the default, use -nopipeline to disable. | 
 |  | 
 |      -appshare      Enable features for use with x11vnc's -appshare mode where | 
 |                     instead of sharing the full desktop only the application's | 
 |                     windows are shared.  Viewer multilisten mode is used to | 
 |                     create the multiple windows: -multilisten is implied. | 
 |                     See 'x11vnc -appshare -help' more information on the mode. | 
 |  | 
 |                     Features enabled in the viewer under -appshare are: | 
 |                     Minimum extra text in the title, auto -ycrop is disabled, | 
 |                     x11vnc -remote_prefix X11VNC_APPSHARE_CMD: message channel, | 
 |                     x11vnc initial window position hints.  See also Escape Keys | 
 |                     below for additional key and mouse bindings. | 
 |  | 
 |      -escape str    This sets the 'Escape Keys' modifier sequence and enables | 
 |                     escape keys mode.  When the modifier keys escape sequence | 
 |                     is held down, the next keystroke is interpreted locally | 
 |                     to perform a special action instead of being sent to the | 
 |                     remote VNC server. | 
 |  | 
 |                     Use '-escape default' for the default modifier sequence. | 
 |                     (Unix: Alt_L,Super_L and MacOSX: Control_L,Meta_L) | 
 |  | 
 |     Here are the 'Escape Keys: Help+Set' instructions from the Popup Menu: | 
 |  | 
 |     Escape Keys:  Enter a comma separated list of modifier keys to be the | 
 |     'escape sequence'.  When these keys are held down, the next keystroke is | 
 |     interpreted locally to invoke a special action instead of being sent to | 
 |     the remote VNC server.  In other words, a set of 'Hot Keys'. | 
 |  | 
 |     To enable or disable this, click on 'Escape Keys: Toggle' in the Popup. | 
 |  | 
 |     Here is the list of hot-key mappings to special actions: | 
 |  | 
 |        r: refresh desktop  b: toggle bell   c: toggle full-color | 
 |        f: file transfer    x: x11cursor     z: toggle Tight/ZRLE | 
 |        l: full screen      g: graball       e: escape keys dialog | 
 |        s: scale dialog     +: scale up (=)  -: scale down (_) | 
 |        t: text chat                         a: alphablend cursor | 
 |        V: toggle viewonly  Q: quit viewer   1 2 3 4 5 6: UltraVNC scale 1/n | 
 |  | 
 |        Arrow keys:         pan the viewport about 10% for each keypress. | 
 |        PageUp / PageDown:  pan the viewport by a screenful vertically. | 
 |        Home   / End:       pan the viewport by a screenful horizontally. | 
 |        KeyPad Arrow keys:  pan the viewport by 1 pixel for each keypress. | 
 |        Dragging the Mouse with Button1 pressed also pans the viewport. | 
 |        Clicking Mouse Button3 brings up the Popup Menu. | 
 |  | 
 |     The above mappings are *always* active in ViewOnly mode, unless you set the | 
 |     Escape Keys value to 'never'. | 
 |  | 
 |     If the Escape Keys value below is set to 'default' then a default list of | 
 |     of modifier keys is used.  For Unix it is: Alt_L,Super_L and for MacOSX it | 
 |     is Control_L,Meta_L.  Note: the Super_L key usually has a Windows(TM) Flag | 
 |     on it.  Also note the _L and _R mean the key is on the LEFT or RIGHT side | 
 |     of the keyboard. | 
 |  | 
 |     On Unix   the default is Alt and Windows keys on Left side of keyboard. | 
 |     On MacOSX the default is Control and Command keys on Left side of keyboard. | 
 |  | 
 |     Example: Press and hold the Alt and Windows keys on the LEFT side of the | 
 |     keyboard and then press 'c' to toggle the full-color state.  Or press 't' | 
 |     to toggle the ultravnc Text Chat window, etc. | 
 |  | 
 |     To use something besides the default, supply a comma separated list (or a | 
 |     single one) from: Shift_L Shift_R Control_L Control_R Alt_L Alt_R Meta_L | 
 |     Meta_R Super_L Super_R Hyper_L Hyper_R or Mode_switch. | 
 |  | 
 |  | 
 |    New Popup actions: | 
 |  | 
 |         ViewOnly:                ~ -viewonly | 
 |         Disable Bell:            ~ -nobell | 
 |         Cursor Shape:            ~ -nocursorshape | 
 |         X11 Cursor:              ~ -x11cursor | 
 |         Cursor Alphablend:       ~ -alpha | 
 |         Toggle Tight/Hextile:    ~ -encodings hextile... | 
 |         Toggle Tight/ZRLE:       ~ -encodings zrle... | 
 |         Toggle ZRLE/ZYWRLE:      ~ -encodings zywrle... | 
 |         Quality Level            ~ -quality (both Tight and ZYWRLE) | 
 |         Compress Level           ~ -compresslevel | 
 |         Disable JPEG:            ~ -nojpeg  (Tight) | 
 |         Pipeline Updates         ~ -pipeline | 
 |  | 
 |         Full Color                 as many colors as local screen allows. | 
 |         Grey scale (16 & 8-bpp)  ~ -grey, for low colors 16/8bpp modes only. | 
 |         16 bit color (BGR565)    ~ -16bpp / -bgr565 | 
 |         8  bit color (BGR233)    ~ -bgr233 | 
 |         256 colors               ~ -bgr233 default # of colors. | 
 |          64 colors               ~ -bgr222 / -use64 | 
 |           8 colors               ~ -bgr111 / -use8 | 
 |         Scale Viewer             ~ -scale | 
 |         Escape Keys: Toggle      ~ -escape | 
 |         Escape Keys: Help+Set    ~ -escape | 
 |         Set Y Crop (y-max)       ~ -ycrop | 
 |         Set Scrollbar Width      ~ -sbwidth | 
 |         XGrabServer              ~ -graball | 
 |  | 
 |         UltraVNC Extensions: | 
 |  | 
 |           Set 1/n Server Scale     Ultravnc ext. Scale desktop by 1/n. | 
 |           Text Chat                Ultravnc ext. Do Text Chat. | 
 |           File Transfer            Ultravnc ext. File xfer via Java helper. | 
 |           Single Window            Ultravnc ext. Grab and view a single window. | 
 |                                    (select then click on the window you want). | 
 |           Disable Remote Input     Ultravnc ext. Try to prevent input and | 
 |                                    viewing of monitor at physical display. | 
 |  | 
 |         Note: the Ultravnc extensions only apply to servers that support | 
 |               them.  x11vnc/libvncserver supports some of them. | 
 |  | 
 |         Send Clipboard not Primary  ~ -sendclipboard | 
 |         Send Selection Every time   ~ -sendalways | 
 |  | 
 |    Nearly all of these can be changed dynamically in the Popup menu | 
 |    (press F8 for it): | 
 |  | 
 |    [viewer_menu.gif] [unixviewer.jpg] | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 |    Windows: | 
 |  | 
 |    For Windows, SSL Viewer support is provided by a GUI Windows/ssvnc.exe | 
 |    that prompts for the VNC display and then starts up STUNNEL followed | 
 |    by the Stock TightVNC Windows Viewer. Both are bundled in the package | 
 |    for your convenience. The GUI has other useful features. When the | 
 |    connection is finished, you will be asked if you want to terminate the | 
 |    STUNNEL program. For SSH connections from Windows the GUI will use | 
 |    PLINK instead of STUNNEL. | 
 |  | 
 |    Unix and Mac OS X: | 
 |  | 
 |    Run the GUI (ssvnc, see above) and let me know how it goes. | 
 |      _________________________________________________________________ | 
 |  | 
 |    Hopefully this tool will make it convenient for people to help test | 
 |    and use the built-in SSL support in x11vnc. Extra testing of this | 
 |    feature is much appreciated!! Thanks. | 
 |  | 
 |    Please Help Test the newly added features: | 
 |      * Automatic Service tunnelling via SSH for CUPS and SMB Printing | 
 |      * ESD/ARTSD Audio | 
 |      * SMB (Windows/Samba) filesystem mounting | 
 |  | 
 |    These allow you to print from the remote (VNC Server) machine to local | 
 |    printers, listen to sounds (with some limitations) from the remote VNC | 
 |    Server machine, and to mount your local Windows or Samba shares on the | 
 |    remote VNC Server machine. Basically these new features try to | 
 |    automate the tricks described here: | 
 |     http://www.karlrunge.com/x11vnc/faq.html#faq-smb-shares | 
 |     http://www.karlrunge.com/x11vnc/faq.html#faq-cups | 
 |     http://www.karlrunge.com/x11vnc/faq.html#faq-sound | 
 |      _________________________________________________________________ | 
 |  | 
 |    Downloading: Downloads for this project are hosted at Sourceforge.net. | 
 |  | 
 |    Choose the archive file bundle that best suits you (e.g. no source | 
 |    code, windows only, unix only, zip, tar etc). | 
 |  | 
 |    A quick guide: | 
 |  | 
 |       On some flavor of Unix, e.g. Linux or Solaris? Use | 
 |    "ssvnc_unix_only" (or "ssvnc_no_windows" to recompile). | 
 |       On Mac OS X? Use "ssvnc_no_windows". | 
 |       On Windows? Use "ssvnc_windows_only". | 
 |   ssvnc_windows_only-1.0.28.zip      Windows Binaries Only.  No source included | 
 |  (6.2MB) | 
 |   ssvnc_no_windows-1.0.28.tar.gz     Unix and Mac OS X Only. No Windows binarie | 
 | s.  Source included. (10.1MB) | 
 |   ssvnc_unix_only-1.0.28.tar.gz      Unix Binaries Only.     No source included | 
 | . (7.2MB) | 
 |   ssvnc_unix_minimal-1.0.28.tar.gz   Unix Minimal.  You must supply your own vn | 
 | cviewer and stunnel. (0.2MB) | 
 |  | 
 |   ssvnc-1.0.28.tar.gz                All Unix, Mac OS X, and Windows binaries a | 
 | nd source TGZ. (16.1MB) | 
 |   ssvnc-1.0.28.zip                   All Unix, Mac OS X, and Windows binaries a | 
 | nd source ZIP. (16.4MB) | 
 |   ssvnc_all-1.0.28.zip               All Unix, Mac OS X, and Windows binaries a | 
 | nd source AND full archives in the zip dir. (19.2MB) | 
 |  | 
 |  | 
 |    Here is a conventional source tarball: | 
 |   ssvnc-1.0.28.src.tar.gz            Conventional Source for SSVNC GUI and Unix | 
 |  VNCviewer  (0.5MB) | 
 |  | 
 |    it will be of use to those who do not want the SSVNC | 
 |    "one-size-fits-all" bundles. For example, package/distro maintainers | 
 |    will find this more familiar and useful to them (i.e. they run: "make | 
 |    config; make all; make install"). Note that it does not include the | 
 |    stunnel source, and so has a dependency that the system stunnel is | 
 |    installed. | 
 |  | 
 |    Read the README.src file for more information on using the | 
 |    conventional source tarball. | 
 |  | 
 |  | 
 |    Note: even with the Unix bundles, e.g. "ssvnc_no_windows" or | 
 |    "ssvnc_all", you may need to run the "./build.unix" script in the top | 
 |    directory to recompile for your operating system. | 
 |  | 
 |    Here are the corresponding 1.0.29 development bundles (Please help | 
 |    test them): | 
 |  | 
 |   ssvnc_windows_only-1.0.29.zip | 
 |   ssvnc_no_windows-1.0.29.tar.gz | 
 |   ssvnc_unix_only-1.0.29.tar.gz | 
 |   ssvnc_unix_minimal-1.0.29.tar.gz | 
 |  | 
 |   ssvnc-1.0.29.tar.gz | 
 |   ssvnc-1.0.29.zip | 
 |   ssvnc_all-1.0.29.zip | 
 |  | 
 |   ssvnc-1.0.29.src.tar.gz            Conventional Source for SSVNC GUI and Unix | 
 |  VNCviewer  (0.5MB) | 
 |  | 
 |  | 
 |    For any Unix system, a self-extracting and running file for the | 
 |    "ssvnc_unix_minimal" package is here: ssvnc. Save it as filename | 
 |    "ssvnc", type "chmod 755 ./ssvnc", and then launch the GUI via typing | 
 |    "./ssvnc". Note that this "ssvnc_unix_minimal" mode requires you | 
 |    install the "stunnel" and "vncviewer" programs externally (for | 
 |    example, install your distros' versions, e.g. on debian: "apt-get | 
 |    install stunnel4 xtightvncviewer".) It will work, but many of the | 
 |    SSVNC features will be missing. | 
 |  | 
 |    Previous releases: | 
 |       Release 1.0.18 at Sourceforge.net | 
 |       Release 1.0.19 at Sourceforge.net | 
 |       Release 1.0.20 at Sourceforge.net | 
 |       Release 1.0.21 at Sourceforge.net | 
 |       Release 1.0.22 at Sourceforge.net | 
 |       Release 1.0.23 at Sourceforge.net | 
 |       Release 1.0.24 at Sourceforge.net | 
 |       Release 1.0.25 at Sourceforge.net | 
 |       Release 1.0.26 at Sourceforge.net | 
 |       Release 1.0.27 at Sourceforge.net | 
 |       Release 1.0.28 at Sourceforge.net | 
 |  | 
 |  | 
 |    Please help test the UltraVNC File Transfer support in the native Unix | 
 |    VNC viewer! Let us know how it went. | 
 |  | 
 |    Current Unix binaries in the archives: | 
 |     Linux.i686 | 
 |     Linux.x86_64 | 
 |     Linux.ppc64    X (removed) | 
 |     Linux.alpha    X (removed) | 
 |     SunOS.sun4u | 
 |     SunOS.sun4m | 
 |     SunOS.i86pc | 
 |     Darwin.Power.Macintosh | 
 |     Darwin.i386 | 
 |     HP-UX.9000     X (removed) | 
 |     FreeBSD.i386   X (removed) | 
 |     NetBSD.i386    X (removed) | 
 |     OpenBSD.i386   X (removed) | 
 |  | 
 |    (some of these are out of date, marked with 'X' above, because I no | 
 |    longer have access to machines running those OS's. Use the | 
 |    "build.unix" script to recompile on your system). | 
 |  | 
 |    Note: some of the above binaries depend on libssl.so.0.9.7, whereas | 
 |    some recent distros only provide libssl.so.0.9.8 by default (for | 
 |    compatibility reasons they should install both by default but not all | 
 |    do). So you may need to instruct your distro to install the 0.9.7 | 
 |    library (it is fine to have both runtimes installed simultaneously | 
 |    since the libraries have different names). Update: I now try to | 
 |    statically link libssl.a for all of the binaries in the archive. | 
 |  | 
 |    You can also run the included build.unix script to try to | 
 |    automatically build the binaries if your OS is not in the above list | 
 |    or the included binary does not run properly on your system. Let me | 
 |    know how that goes. | 
 |      _________________________________________________________________ | 
 |  | 
 |    IMPORTANT: there may be restrictions for you to download, use, or | 
 |    redistribute the above because of cryptographic software they contain | 
 |    or for other reasons. Please check out your situation and information | 
 |    at the following and related sites: | 
 |         http://stunnel.mirt.net | 
 |         http://www.stunnel.org | 
 |         http://www.openssl.org | 
 |         http://www.chiark.greenend.org.uk/~sgtatham/putty/ | 
 |         http://www.tightvnc.com | 
 |         http://www.realvnc.com | 
 |         http://sourceforge.net/projects/cotvnc/ | 
 |      _________________________________________________________________ | 
 |  | 
 |    README: Here is the toplevel README from the bundle. | 
 | 	 | 
 | ======================================================================= | 
 | http://www.karlrunge.com/x11vnc/x11vnc_opts.html: | 
 |  | 
 |  | 
 |      _________________________________________________________________ | 
 |  | 
 | x11vnc: a VNC server for real X displays | 
 |  | 
 |    Here are all of x11vnc command line options: | 
 | % x11vnc -opts      (see below for -help long descriptions) | 
 |  | 
 | x11vnc: allow VNC connections to real X11 displays. 0.9.13 lastmod: 2010-12-27 | 
 |  | 
 | x11vnc options: | 
 |   -display disp            -auth file               -N                      | 
 |   -autoport n              -rfbport str             -6                      | 
 |   -no6                     -noipv6                  -noipv4                 | 
 |   -reopen                  -reflect host:N          -id windowid            | 
 |   -sid windowid            -appshare                -clip WxH+X+Y           | 
 |   -flashcmap               -shiftcmap n             -notruecolor            | 
 |   -advertise_truecolor     -visual n                -overlay                | 
 |   -overlay_nocursor        -8to24 [opts]            -24to32                 | 
 |   -scale fraction          -geometry WxH            -scale_cursor frac      | 
 |   -viewonly                -shared                  -once                   | 
 |   -forever                 -loop                    -timeout n              | 
 |   -sleepin n               -inetd                   -tightfilexfer          | 
 |   -ultrafilexfer           -http                    -http_ssl               | 
 |   -avahi                   -mdns                    -zeroconf               | 
 |   -connect string          -connect_or_exit str     -proxy string           | 
 |   -vncconnect              -novncconnect            -allow host1[,host2..]  | 
 |   -localhost               -unixsock str            -listen6 str            | 
 |   -nolookup                -input string            -grabkbd                | 
 |   -grabptr                 -ungrabboth              -grabalways             | 
 |   -viewpasswd string       -passwdfile filename     -showrfbauth filename   | 
 |   -unixpw [list]           -unixpw_nis [list]       -unixpw_cmd cmd         | 
 |   -find                    -finddpy                 -listdpy                | 
 |   -findauth [disp]         -create                  -xdummy                 | 
 |   -xvnc                    -xvnc_redirect           -xdummy_xvfb            | 
 |   -create_xsrv str         -svc                     -svc_xdummy             | 
 |   -svc_xvnc                -svc_xdummy_xvfb         -xdmsvc                 | 
 |   -sshxdmsvc               -unixpw_system_greeter   -redirect port          | 
 |   -display WAIT:...        -vencrypt mode           -anontls mode           | 
 |   -sslonly                 -dhparams file           -nossl                  | 
 |   -ssl [pem]               -ssltimeout n            -sslnofail              | 
 |   -ssldir dir              -sslverify path          -sslCRL path            | 
 |   -sslGenCA [dir]          -sslGenCert type name    -sslEncKey pem          | 
 |   -sslCertInfo pem         -sslDelCert pem          -sslScripts             | 
 |   -stunnel [pem]           -stunnel3  [pem]         -enc cipher:keyfile     | 
 |   -https [port]            -httpsredir [port]       -http_oneport           | 
 |   -ssh user@host:disp      -usepw                   -storepasswd pass file  | 
 |   -nopw                    -accept string           -afteraccept string     | 
 |   -gone string             -users list              -noshm                  | 
 |   -flipbyteorder           -onetile                 -solid [color]          | 
 |   -blackout string         -xinerama                -noxinerama             | 
 |   -xtrap                   -xrandr [mode]           -rotate string          | 
 |   -padgeom WxH             -o logfile               -flag file              | 
 |   -rmflag file             -rc filename             -norc                   | 
 |   -env VAR=VALUE           -prog /path/to/x11vnc    -h, -help               | 
 |   -?, -opts                -V, -version             -license                | 
 |   -dbg                     -q, -quiet               -v, -verbose            | 
 |   -bg                      -modtweak                -nomodtweak             | 
 |   -xkb                     -noxkb                   -capslock               | 
 |   -skip_lockkeys           -noskip_lockkeys         -skip_keycodes string   | 
 |   -sloppy_keys             -skip_dups               -noskip_dups            | 
 |   -add_keysyms             -noadd_keysyms           -clear_mods             | 
 |   -clear_keys              -clear_all               -remap string           | 
 |   -norepeat                -repeat                  -nofb                   | 
 |   -nobell                  -nosel                   -noprimary              | 
 |   -nosetprimary            -noclipboard             -nosetclipboard         | 
 |   -seldir string           -cursor [mode]           -nocursor               | 
 |   -cursor_drag             -arrow n                 -noxfixes               | 
 |   -alphacut n              -alphafrac fraction      -alpharemove            | 
 |   -noalphablend            -nocursorshape           -cursorpos              | 
 |   -nocursorpos             -xwarppointer            -noxwarppointer         | 
 |   -always_inject           -buttonmap string        -nodragging             | 
 |   -ncache n                -ncache_cr               -ncache_no_moveraise    | 
 |   -ncache_no_dtchange      -ncache_no_rootpixmap    -ncache_keep_anims      | 
 |   -ncache_old_wm           -ncache_pad n            -debug_ncache           | 
 |   -wireframe [str]         -nowireframe             -nowireframelocal       | 
 |   -wirecopyrect mode       -nowirecopyrect          -debug_wireframe        | 
 |   -scrollcopyrect mode     -noscrollcopyrect        -scr_area n             | 
 |   -scr_skip list           -scr_inc list            -scr_keys list          | 
 |   -scr_term list           -scr_keyrepeat lo-hi     -scr_parms string       | 
 |   -fixscreen string        -debug_scroll            -noxrecord              | 
 |   -grab_buster             -nograb_buster           -debug_grabs            | 
 |   -debug_sel               -pointer_mode n          -input_skip n           | 
 |   -allinput                -input_eagerly           -speeds rd,bw,lat       | 
 |   -wmdt string             -debug_pointer           -debug_keyboard         | 
 |   -defer time              -wait time               -extra_fbur n           | 
 |   -wait_ui factor          -setdefer n              -nowait_bog             | 
 |   -slow_fb time            -xrefresh time           -nap                    | 
 |   -nonap                   -sb time                 -readtimeout n          | 
 |   -ping n                  -nofbpm                  -fbpm                   | 
 |   -nodpms                  -dpms                    -forcedpms              | 
 |   -clientdpms              -noserverdpms            -noultraext             | 
 |   -chatwindow              -noxdamage               -xd_area A              | 
 |   -xd_mem f                -sigpipe string          -threads                | 
 |   -nothreads               -fs f                    -gaps n                 | 
 |   -grow n                  -fuzz n                  -debug_tiles            | 
 |   -snapfb                  -rawfb string            -freqtab file           | 
 |   -pipeinput cmd           -macnodim                -macnosleep             | 
 |   -macnosaver              -macnowait               -macwheel n             | 
 |   -macnoswap               -macnoresize             -maciconanim n          | 
 |   -macmenu                 -macuskbd                -macnoopengl            | 
 |   -macnorawfb              -gui [gui-opts]          -remote command         | 
 |   -query variable          -QD variable             -sync                   | 
 |   -query_retries str       -remote_prefix str       -noremote               | 
 |   -yesremote               -unsafe                  -safer                  | 
 |   -privremote              -nocmds                  -allowedcmds list       | 
 |   -deny_all               | 
 |  | 
 | LibVNCServer options: | 
 | -rfbport port          TCP port for RFB protocol | 
 | -rfbwait time          max time in ms to wait for RFB client | 
 | -rfbauth passwd-file   use authentication on RFB protocol | 
 |                        (use 'storepasswd' to create a password file) | 
 | -rfbversion 3.x        Set the version of the RFB we choose to advertise | 
 | -permitfiletransfer    permit file transfer support | 
 | -passwd plain-password use authentication  | 
 |                        (use plain-password as password, USE AT YOUR RISK) | 
 | -deferupdate time      time in ms to defer updates (default 40) | 
 | -deferptrupdate time   time in ms to defer pointer updates (default none) | 
 | -desktop name          VNC desktop name (default "LibVNCServer") | 
 | -alwaysshared          always treat new clients as shared | 
 | -nevershared           never treat new clients as shared | 
 | -dontdisconnect        don't disconnect existing clients when a new non-shared | 
 |                        connection comes in (refuse new connection instead) | 
 | -httpdir dir-path      enable http server using dir-path home | 
 | -httpport portnum      use portnum for http connection | 
 | -enablehttpproxy       enable http proxy support | 
 | -progressive height    enable progressive updating for slow links | 
 | -listen ipaddr         listen for connections only on network interface with | 
 |                        addr ipaddr. '-listen localhost' and hostname work too. | 
 |  | 
 | libvncserver-tight-extension options: | 
 | -disablefiletransfer   disable file transfer | 
 | -ftproot string        set ftp root | 
 |  | 
 |  | 
 |  | 
 |  | 
 | % x11vnc -help | 
 |  | 
 | x11vnc: allow VNC connections to real X11 displays. 0.9.13 lastmod: 2010-12-27 | 
 |  | 
 | (type "x11vnc -opts" to just list the options.) | 
 |  | 
 | Typical usage is: | 
 |  | 
 |    Run this command in a shell on the remote machine "far-host" | 
 |    with X session you wish to view: | 
 |  | 
 |        x11vnc -display :0 | 
 |  | 
 |    Then run this in another window on the machine you are sitting at: | 
 |  | 
 |        vncviewer far-host:0 | 
 |  | 
 | Once x11vnc establishes connections with the X11 server and starts listening | 
 | as a VNC server it will print out a string: PORT=XXXX where XXXX is typically | 
 | 5900 (the default VNC server port).  One would next run something like | 
 | this on the local machine: "vncviewer hostname:N" where "hostname" is | 
 | the name of the machine running x11vnc and N is XXXX - 5900, i.e. usually | 
 | "vncviewer hostname:0". | 
 |  | 
 | By default x11vnc will not allow the screen to be shared and it will exit | 
 | as soon as the client disconnects.  See -shared and -forever below to override | 
 | these protections.  See the FAQ for details how to tunnel the VNC connection | 
 | through an encrypted channel such as ssh(1).  In brief: | 
 |  | 
 |        ssh -t -L 5900:localhost:5900 far-host 'x11vnc -localhost -display :0' | 
 |  | 
 |        vncviewer -encodings 'copyrect tight zrle hextile' localhost:0 | 
 |  | 
 | Also, use of a VNC password (-rfbauth or -passwdfile) is strongly recommended. | 
 |  | 
 | For additional info see: http://www.karlrunge.com/x11vnc/ | 
 |                     and  http://www.karlrunge.com/x11vnc/faq.html | 
 |  | 
 |  | 
 | Config file support: if the file $HOME/.x11vncrc exists then each line in | 
 | it is treated as a single command line option.  Disable with -norc.  For | 
 | each option name, the leading character "-" is not required.  E.g. a line | 
 | that is either "forever" or "-forever" may be used and are equivalent. | 
 | Likewise "wait 100" or "-wait 100" are acceptable and equivalent lines. | 
 | The "#" character comments out to the end of the line in the usual way | 
 | (backslash it for a literal).  Leading and trailing whitespace is trimmed off. | 
 | Lines may be continued with a "\" as the last character of a line (it | 
 | becomes a space character). | 
 |  | 
 | Options: | 
 |  | 
 | -display disp          X11 server display to connect to, usually :0.  The X | 
 |                        server process must be running on same machine and | 
 |                        support MIT-SHM.  Equivalent to setting the DISPLAY | 
 |                        environment variable to "disp". | 
 |  | 
 |                        See the description below of the "-display WAIT:..." | 
 |                        extensions, where alias "-find" will find the user's | 
 |                        display automatically, and "-create" will create a | 
 |                        Xvfb session if no session is found. | 
 |  | 
 | -auth file             Set the X authority file to be "file", equivalent to | 
 |                        setting the XAUTHORITY environment variable to "file" | 
 |                        before startup.  Same as -xauth file.  See Xsecurity(7), | 
 |                        xauth(1) man pages for more info. | 
 |  | 
 |                        Use '-auth guess' to have x11vnc use its -findauth | 
 |                        mechanism (described below) to try to guess the | 
 |                        XAUTHORITY filename and use it. | 
 |  | 
 |                        XDM/GDM/KDM: if you are running x11vnc as root and want | 
 |                        to find the XAUTHORITY before anyone has logged into an | 
 |                        X session yet, use: x11vnc -env FD_XDM=1 -auth guess ... | 
 |                        (This will also find the XAUTHORITY if a user is already | 
 |                        logged into the X session.)  When running as root, | 
 |                        FD_XDM=1 will be tried if the initial -auth guess fails. | 
 |  | 
 | -N                     If the X display is :N, try to set the VNC display to | 
 |                        also be :N This just sets the -rfbport option to 5900+N | 
 |                        The program will exit immediately if that port is not | 
 |                        available. The -N option only works with normal -display | 
 |                        usage, e.g. :0 or :8, -N is ignored in the -display | 
 |                        WAIT:..., -create, -find, -svc, -redirect, etc modes. | 
 |  | 
 | -autoport n            Automatically probe for a free VNC port starting at n. | 
 |                        The default is to start probing at 5900.  Use this to | 
 |                        stay away from other VNC servers near 5900. | 
 |  | 
 | -rfbport str           The VNC port to listen on (a LibVNCServer option), e.g. | 
 |                        5900, 5901, etc.  If specified as "-rfbport PROMPT" | 
 |                        then the x11vnc -gui is used to prompt the user to | 
 |                        enter the port number. | 
 |  | 
 | -6                     IPv6 listening support.  In addition to IPv4, the | 
 |                        IPv6 address is listened on for incoming connections. | 
 |                        The same port number as IPv4 is used. | 
 |  | 
 |                        NOTE:  This x11vnc binary was compiled to have the | 
 |                        "-6" IPv6 listening mode ENABLED by default (CPPFLAGS | 
 |                        -DX11VNC_LISTEN6=1).  So to disable IPv6 listening mode | 
 |                        you MUST supply the "-no6" option (see below.) | 
 |  | 
 |                        The "-6" mode works for both normal connections and | 
 |                        -ssl encrypted ones.  Nearly everything is supported | 
 |                        for the IPv6 case, but there are a few exceptions. | 
 |                        See -stunnel for its IPv6 support. | 
 |  | 
 |                        Currently, for absolutely everything to work correctly | 
 |                        the machine may need to have some IPv4 support, at the | 
 |                        least for the loopback interface.  However, for nearly | 
 |                        all usage modes no IPv4 support is required. See -nopiv4 | 
 | . | 
 |  | 
 |                        If you have trouble compiling or running in IPv6 mode, | 
 |                        set -DX11VNC_IPV6=0 in CPPFLAGS when configuring to | 
 |                        disable IPv6 support. | 
 |  | 
 | -no6                   Disable IPv6 listening support (only useful if the | 
 |                        "-6" mode is compiled in to be the default; see the | 
 |                        X11VNC_LISTEN6 description above under "-6".) | 
 |  | 
 | -noipv6                Do not try to use IPv6 for any listening or connecting | 
 |                        sockets.  This includes both the listening service | 
 |                        port(s) and outgoing connections from -connect, | 
 |                        -connect_or_exit, or -proxy.  Use this if you are having | 
 |                        problems due to IPv6. | 
 |  | 
 | -noipv4                Do not try to use IPv4 for any listening or connecting | 
 |                        sockets.  This is mainly for exploring the behavior of | 
 |                        x11vnc on an IPv6-only system, but may have other uses. | 
 |  | 
 | -reopen                If the X server connection is disconnected, try to | 
 |                        reopen the X display (up to one time.)  This is of use | 
 |                        for display managers like GDM (KillInitClients option) | 
 |                        that kill x11vnc just after the user logs into the | 
 |                        X session.  Note: the reopened state may be unstable. | 
 |                        Set X11VNC_REOPEN_DISPLAY=n to reopen n times and | 
 |                        set X11VNC_REOPEN_SLEEP_MAX to the number of seconds, | 
 |                        default 10, to keep trying to reopen the display (once | 
 |                        per second.) | 
 |  | 
 |                        Update: as of 0.9.9, x11vnc tries to automatically avoid | 
 |                        being killed by the display manager by delaying creating | 
 |                        windows or using XFIXES.  So you shouldn't need to use | 
 |                        KillInitClients=false as long as you log in quickly | 
 |                        enough (within 45 seconds of connecting.)  You can | 
 |                        disable this by setting X11VNC_AVOID_WINDOWS=never. | 
 |                        You can also set it to the number of seconds to delay. | 
 |  | 
 | -reflect host:N        Instead of connecting to and polling an X display, | 
 |                        connect to the remote VNC server host:N and be a | 
 |                        reflector/repeater for it.  This is useful for trying | 
 |                        to manage the case of many simultaneous VNC viewers | 
 |                        (e.g. classroom broadcasting) where, e.g. you put | 
 |                        a repeater on each network switch, etc, to improve | 
 |                        performance by distributing the load and network | 
 |                        traffic.  Implies -shared (use -noshared as a later | 
 |                        option to disable). See the discussion below under | 
 |                        -rawfb vnc:host:N for more details. | 
 |  | 
 | -id windowid           Show the X window corresponding to "windowid" not | 
 |                        the entire display.  New windows like popup menus, | 
 |                        transient toplevels, etc, may not be seen or may be | 
 |                        clipped.  Disabling SaveUnders or BackingStore in the | 
 |                        X server may help show them.  x11vnc may crash if the | 
 |                        window is initially partially obscured, changes size, | 
 |                        is iconified, etc.  Some steps are taken to avoid this | 
 |                        and the -xrandr mechanism is used to track resizes.  Use | 
 |                        xwininfo(1) to get the window id, or use "-id pick" | 
 |                        to have x11vnc run xwininfo(1) for you and extract | 
 |                        the id.  The -id option is useful for exporting very | 
 |                        simple applications (e.g. the current view on a webcam). | 
 | -sid windowid          As -id, but instead of using the window directly it | 
 |                        shifts a root view to it: this shows SaveUnders menus, | 
 |                        etc, although they will be clipped if they extend beyond | 
 |                        the window. | 
 |  | 
 | -appshare              Simple application sharing based on the -id/-sid | 
 |                        mechanism.  Every new toplevel window that the | 
 |                        application creates induces a new viewer window via | 
 |                        a reverse connection.  The -id/-sid and -connect | 
 |                        options are required.  Run 'x11vnc -appshare -help' | 
 |                        for more info. | 
 |  | 
 | -clip WxH+X+Y          Only show the sub-region of the full display that | 
 |                        corresponds to the rectangle geometry with size WxH and | 
 |                        offset +X+Y.  The VNC display has size WxH (i.e. smaller | 
 |                        than the full display).  This also works for -id/-sid | 
 |                        mode where the offset is relative to the upper left | 
 |                        corner of the selected window.  An example use of this | 
 |                        option would be to split a large (e.g. Xinerama) display | 
 |                        into two parts to be accessed via separate viewers by | 
 |                        running a separate x11vnc on each part. | 
 |  | 
 |                        Use '-clip xinerama0' to clip to the first xinerama | 
 |                        sub-screen (if xinerama is active).  xinerama1 for the | 
 |                        2nd sub-screen, etc.  This way you don't need to figure | 
 |                        out the WxH+X+Y of the desired xinerama sub-screen. | 
 |                        screens are sorted in increasing distance from the | 
 |                        (0,0) origin (I.e. not the Xserver's order). | 
 |  | 
 | -flashcmap             In 8bpp indexed color, let the installed colormap flash | 
 |                        as the pointer moves from window to window (slow). | 
 |                        Also try the -8to24 option to avoid flash altogether. | 
 | -shiftcmap n           Rare problem, but some 8bpp displays use less than 256 | 
 |                        colorcells (e.g. 16-color grayscale, perhaps the other | 
 |                        bits are used for double buffering) *and* also need to | 
 |                        shift the pixels values away from 0, .., ncells.  "n" | 
 |                        indicates the shift to be applied to the pixel values. | 
 |                        To see the pixel values set DEBUG_CMAP=1 to print out | 
 |                        a colormap histogram.  Example: -shiftcmap 240 | 
 | -notruecolor           For 8bpp displays, force indexed color (i.e. a colormap) | 
 |                        even if it looks like 8bpp TrueColor (rare problem). | 
 | -advertise_truecolor   If the X11 display is indexed color, lie to clients | 
 |                        when they first connect by telling them it is truecolor. | 
 |                        To workaround RealVNC: inPF has colourMap but not 8bpp | 
 |                        Use '-advertise_truecolor reset' to reset client fb too. | 
 |  | 
 | -visual n              This option probably does not do what you think. | 
 |                        It simply *forces* the visual used for the framebuffer; | 
 |                        this may be a bad thing... (e.g. messes up colors or | 
 |                        cause a crash). It is useful for testing and for some | 
 |                        workarounds.  n may be a decimal number, or 0x hex. | 
 |                        Run xdpyinfo(1) for the values.  One may also use | 
 |                        "TrueColor", etc. see <X11/X.h> for a list.  If the | 
 |                        string ends in ":m" then for better or for worse | 
 |                        the visual depth is forced to be m.  You may want to | 
 |                        use -noshm when using this option (so XGetImage may | 
 |                        automatically translate the pixel data). | 
 |  | 
 | -overlay               Handle multiple depth visuals on one screen, e.g. 8+24 | 
 |                        and 24+8 overlay visuals (the 32 bits per pixel are | 
 |                        packed with 8 for PseudoColor and 24 for TrueColor). | 
 |  | 
 |                        Currently -overlay only works on Solaris via | 
 |                        XReadScreen(3X11) and IRIX using XReadDisplay(3). | 
 |                        On Solaris there is a problem with image "bleeding" | 
 |                        around transient popup menus (but not for the menu | 
 |                        itself): a workaround is to disable SaveUnders | 
 |                        by passing the "-su" argument to Xsun (in | 
 |                        /etc/dt/config/Xservers). | 
 |  | 
 |                        Use -overlay as a workaround for situations like these: | 
 |                        Some legacy applications require the default visual to | 
 |                        be 8bpp (8+24), or they will use 8bpp PseudoColor even | 
 |                        when the default visual is depth 24 TrueColor (24+8). | 
 |                        In these cases colors in some windows will be incorrect | 
 |                        in x11vnc unless -overlay is used.  Another use of | 
 |                        -overlay is to enable showing the exact mouse cursor | 
 |                        shape (details below). | 
 |  | 
 |                        Under -overlay, performance will be somewhat slower | 
 |                        due to the extra image transformations required. | 
 |                        For optimal performance do not use -overlay, but rather | 
 |                        configure the X server so that the default visual is | 
 |                        depth 24 TrueColor and try to have all apps use that | 
 |                        visual (e.g. some apps have -use24 or -visual options). | 
 | -overlay_nocursor      Sets -overlay, but does not try to draw the exact mouse | 
 |                        cursor shape using the overlay mechanism. | 
 |  | 
 | -8to24 [opts]          Try this option if -overlay is not supported on your | 
 |                        OS, and you have a legacy 8bpp app that you want to | 
 |                        view on a multi-depth display with default depth 24 | 
 |                        (and is 32 bpp) OR have a default depth 8 display with | 
 |                        depth 24 overlay windows for some apps.  This option | 
 |                        may not work on all X servers and hardware (tested | 
 |                        on XFree86/Xorg mga driver and Xsun).  The "opts" | 
 |                        string is not required and is described below. | 
 |  | 
 |                        This mode enables a hack where x11vnc monitors windows | 
 |                        within 3 levels from the root window.  If it finds | 
 |                        any that are 8bpp it extracts the indexed color | 
 |                        pixel values using XGetImage() and then applies a | 
 |                        transformation using the colormap(s) to create TrueColor | 
 |                        RGB values that it in turn inserts into bits 1-24 of | 
 |                        the framebuffer.  This creates a depth 24 "view" | 
 |                        of the display that is then exported via VNC. | 
 |  | 
 |                        Conversely, for default depth 8 displays, the depth | 
 |                        24 regions are read by XGetImage() and everything is | 
 |                        transformed and inserted into a depth 24 TrueColor | 
 |                        framebuffer. | 
 |  | 
 |                        Note that even if there are *no* depth 24 visuals or | 
 |                        windows (i.e. pure 8bpp), this mode is potentially | 
 |                        an improvement over -flashcmap because it avoids the | 
 |                        flashing and shows each window in the correct color. | 
 |  | 
 |                        This method works OK, but may still have bugs and it | 
 |                        does hog resources.  If there are multiple 8bpp windows | 
 |                        using different colormaps, one may have to iconify all | 
 |                        but one for the colors to be correct. | 
 |  | 
 |                        There may be painting errors for clipping and switching | 
 |                        between windows of depths 8 and 24.  Heuristics are | 
 |                        applied to try to minimize the painting errors.  One can | 
 |                        also press 3 Alt_L's in a row to refresh the screen | 
 |                        if the error does not repair itself.  Also the option | 
 |                        -fixscreen 8=3.0 or -fixscreen V=3.0 may be used to | 
 |                        periodically refresh the screen at the cost of bandwidth | 
 |                        (every 3 sec for this example). | 
 |  | 
 |                        The [opts] string can contain the following settings. | 
 |                        Multiple settings are separated by commas. | 
 |  | 
 |                        For for some X servers with default depth 24 a | 
 |                        speedup may be achieved via the option "nogetimage". | 
 |                        This enables a scheme were XGetImage() is not used | 
 |                        to retrieve the 8bpp data.  Instead, it assumes that | 
 |                        the 8bpp data is in bits 25-32 of the 32bit X pixels. | 
 |                        There is no requirement that the X server should put | 
 |                        the data there for our poll requests, but some do and | 
 |                        so the extra steps to retrieve it can be skipped. | 
 |                        Tested with mga driver with XFree86/Xorg.  For the | 
 |                        default depth 8 case this option is ignored. | 
 |  | 
 |                        To adjust how often XGetImage() is used to poll the | 
 |                        non-default visual regions for changes, use the option | 
 |                        "poll=t" where "t" is a floating point time. | 
 |                        (default: 0.05) | 
 |  | 
 |                        Setting the option "level2" will limit the search | 
 |                        for non-default visual windows to two levels from the | 
 |                        root window.  Do this on slow machines where you know | 
 |                        the window manager only imposes one extra window between | 
 |                        the app window and the root window. | 
 |  | 
 |                        Also for very slow machines use "cachewin=t" | 
 |                        where t is a floating point amount of time to cache | 
 |                        XGetWindowAttributes results.  E.g. cachewin=5.0. | 
 |                        This may lead to the windows being unnoticed for this | 
 |                        amount of time when deiconifying, painting errors, etc. | 
 |  | 
 |                        While testing on a very old SS20 these options gave | 
 |                        tolerable response: -8to24 poll=0.2,cachewin=5.0. For | 
 |                        this machine -overlay is supported and gives better | 
 |                        response. | 
 |  | 
 |                        Debugging for this mode can be enabled by setting | 
 |                        "dbg=1", "dbg=2", or "dbg=3". | 
 |  | 
 | -24to32                Very rare problem: if the framebuffer (X display | 
 |                        or -rawfb) is 24bpp instead of the usual 32bpp, then | 
 |                        dynamically transform the pixels to 32bpp.  This will be | 
 |                        slower, but can be used to work around problems where | 
 |                        VNC viewers cannot handle 24bpp (e.g. "main: setPF: | 
 |                        not 8, 16 or 32 bpp?").  See the FAQ for more info. | 
 |  | 
 |                        In the case of -rawfb mode, the pixels are directly | 
 |                        modified by inserting a 0 byte to pad them out to 32bpp. | 
 |                        For X displays, a kludge is done that is equivalent to | 
 |                        "-noshm -visual TrueColor:32".  (If better performance | 
 |                        is needed for the latter, feel free to ask). | 
 |  | 
 | -scale fraction        Scale the framebuffer by factor "fraction".  Values | 
 |                        less than 1 shrink the fb, larger ones expand it. Note: | 
 |                        the image may not be sharp and response may be slower. | 
 |                        If "fraction" contains a decimal point "." it | 
 |                        is taken as a floating point number, alternatively | 
 |                        the notation "m/n" may be used to denote fractions | 
 |                        exactly, e.g. -scale 2/3 | 
 |  | 
 |                        To scale asymmetrically in the horizontal and vertical | 
 |                        directions, specify a WxH geometry to stretch to: | 
 |                        e.g. '-scale 1024x768', or also '-scale 0.9x0.75' | 
 |  | 
 |                        Scaling Options: can be added after "fraction" via | 
 |                        ":", to supply multiple ":" options use commas. | 
 |                        If you just want a quick, rough scaling without | 
 |                        blending, append ":nb" to "fraction" (e.g. -scale | 
 |                        1/3:nb).  No blending is the default for 8bpp indexed | 
 |                        color, to force blending for this case use ":fb". | 
 |  | 
 |                        To disable -scrollcopyrect and -wirecopyrect under | 
 |                        -scale use ":nocr".  If you need to to enable them use | 
 |                        ":cr" or specify them explicitly on the command line. | 
 |                        If a slow link is detected, ":nocr" may be applied | 
 |                        automatically.  Default: :cr | 
 |  | 
 |                        More esoteric options: for compatibility with vncviewers | 
 |                        the scaled width is adjusted to be a multiple of 4: | 
 |                        to disable this use ":n4".  ":in" use interpolation | 
 |                        scheme even when shrinking, ":pad" pad scaled width | 
 |                        and height to be multiples of scaling denominator | 
 |                        (e.g. 3 for 2/3). | 
 |  | 
 | -geometry WxH          Same as -scale WxH | 
 |  | 
 | -scale_cursor frac     By default if -scale is supplied the cursor shape is | 
 |                        scaled by the same factor.  Depending on your usage, | 
 |                        you may want to scale the cursor independently of the | 
 |                        screen or not at all.  If you specify -scale_cursor | 
 |                        the cursor will be scaled by that factor.  When using | 
 |                        -scale mode to keep the cursor at its "natural" size | 
 |                        use "-scale_cursor 1".  Most of the ":" scaling | 
 |                        options apply here as well. | 
 |  | 
 | -viewonly              All VNC clients can only watch (default off). | 
 | -shared                VNC display is shared, i.e. more than one viewer can | 
 |                        connect at the same time (default off). | 
 | -once                  Exit after the first successfully connected viewer | 
 |                        disconnects, opposite of -forever. This is the Default. | 
 | -forever               Keep listening for more connections rather than exiting | 
 |                        as soon as the first client(s) disconnect. Same as -many | 
 |  | 
 |                        To get the standard non-shared VNC behavior where when | 
 |                        a new VNC client connects the existing VNC client is | 
 |                        dropped use:  -nevershared -forever   This method can | 
 |                        also be used to guard against hung TCP connections that | 
 |                        do not go away. | 
 |  | 
 | -loop                  Create an outer loop restarting the x11vnc process | 
 |                        whenever it terminates.  -bg and -inetd are ignored | 
 |                        in this mode (however see -loopbg below). | 
 |  | 
 |                        Useful for continuing even if the X server terminates | 
 |                        and restarts (at that moment the process will need | 
 |                        permission to reconnect to the new X server of course). | 
 |  | 
 |                        Use, e.g., -loop100 to sleep 100 millisecs between | 
 |                        restarts, etc.  Default is 2000ms (i.e. 2 secs) Use, | 
 |                        e.g. -loop300,5 to sleep 300 ms and only loop 5 times. | 
 |  | 
 |                        If -loopbg (plus any numbers) is specified instead, | 
 |                        the "-bg" option is implied and the mode approximates | 
 |                        inetd(8) usage to some degree.  In this case when | 
 |                        it goes into the background any listening sockets | 
 |                        (i.e. ports 5900, 5800) are closed, so the next one | 
 |                        in the loop can use them.  This mode will only be of | 
 |                        use if a VNC client (the only client for that process) | 
 |                        is already connected before the process goes into the | 
 |                        background, for example, usage of -display WAIT:.., | 
 |                        -svc, and -connect can make use of this "poor man's" | 
 |                        inetd mode.  The default wait time is 500ms in this | 
 |                        mode.  This usage could use useful:  -svc -bg -loopbg | 
 |  | 
 | -timeout n             Exit unless a client connects within the first n seconds | 
 |                        after startup. | 
 |  | 
 |                        If there have been no connection attempts after n | 
 |                        seconds x11vnc exits immediately.  If a client is | 
 |                        trying to connect but has not progressed to the normal | 
 |                        operating state, x11vnc gives it a few more seconds | 
 |                        to finish and exits if it does not make it to the | 
 |                        normal state. | 
 |  | 
 |                        For reverse connections via -connect or -connect_or_exit | 
 |                        a timeout of n seconds will be set for all reverse | 
 |                        connects.  If the connect timeout alarm goes off, | 
 |                        x11vnc will exit immediately. | 
 |  | 
 | -sleepin n             At startup sleep n seconds before proceeding (e.g. to | 
 |                        allow redirs and listening clients to start up) | 
 |  | 
 |                        If a range is given: '-sleepin min-max', a random value | 
 |                        between min and max is slept. E.g. '-sleepin 0-20' and | 
 |                        '-sleepin 10-30'.  Floats are allowed too. | 
 |  | 
 | -inetd                 Launched by inetd(8): stdio instead of listening socket. | 
 |                        Note: if you are not redirecting stderr to a log file | 
 |                        (via shell 2> or -o option) you MUST also specify the -q | 
 |                        option, otherwise the stderr goes to the viewer which | 
 |                        will cause it to abort.  Specifying both -inetd and -q | 
 |                        and no -o will automatically close the stderr. | 
 |  | 
 | -tightfilexfer         Enable the TightVNC file transfer extension. Note that | 
 |                        that when the -viewonly option is supplied all file | 
 |                        transfers are disabled.  Also clients that log in | 
 |                        viewonly cannot transfer files.  However, if the remote | 
 |                        control mechanism is used to change the global or | 
 |                        per-client viewonly state the filetransfer permissions | 
 |                        will NOT change. | 
 |  | 
 |                        IMPORTANT: please understand if -tightfilexfer is | 
 |                        specified and you run x11vnc as root for, say, inetd | 
 |                        or display manager (gdm, kdm, ...) access and you do | 
 |                        not have it switch users via the -users option, then | 
 |                        VNC Viewers that connect are able to do filetransfer | 
 |                        reads and writes as *root*. | 
 |  | 
 |                        Also, tightfilexfer is disabled in -unixpw mode. | 
 |  | 
 | -ultrafilexfer         Note: to enable UltraVNC filetransfer and to get it to | 
 |                        work you probably need to supply these LibVNCServer | 
 |                        options: "-rfbversion 3.6 -permitfiletransfer" | 
 |                        "-ultrafilexfer" is an alias for this combination. | 
 |  | 
 |                        IMPORTANT: please understand if -ultrafilexfer is | 
 |                        specified and you run x11vnc as root for, say, inetd | 
 |                        or display manager (gdm, kdm, ...) access and you do | 
 |                        not have it switch users via the -users option, then | 
 |                        VNC Viewers that connect are able to do filetransfer | 
 |                        reads and writes as *root*. | 
 |  | 
 |                        Note that sadly you cannot do both -tightfilexfer and | 
 |                        -ultrafilexfer at the same time because the latter | 
 |                        requires setting the version to 3.6 and tightvnc will | 
 |                        not do filetransfer when it sees that version number. | 
 |  | 
 | -http                  Instead of using -httpdir (see below) to specify | 
 |                        where the Java vncviewer applet is, have x11vnc try | 
 |                        to *guess* where the directory is by looking relative | 
 |                        to the program location and in standard locations | 
 |                        (/usr/local/share/x11vnc/classes, etc).  Under -ssl or | 
 |                        -stunnel the ssl classes subdirectory is sought. | 
 | -http_ssl              As -http, but force lookup for ssl classes subdir. | 
 |  | 
 |                        Note that for HTTPS, single-port Java applet delivery | 
 |                        you can set X11VNC_HTTPS_DOWNLOAD_WAIT_TIME to the | 
 |                        max number of seconds to wait for the applet download | 
 |                        to finish.  The default is 15. | 
 |  | 
 | -avahi                 Use the Avahi/mDNS ZeroConf protocol to advertise | 
 |                        this VNC server to the local network. (Related terms: | 
 |                        Rendezvous, Bonjour).  Depending on your setup, you | 
 |                        may need to start avahi-daemon and open udp port 5353 | 
 |                        in your firewall. | 
 |  | 
 |                        You can set X11VNC_AVAHI_NAME, X11VNC_AVAHI_HOST, | 
 |                        and/or X11VNC_AVAHI_PORT environment variables | 
 |                        to override the default values.  For example: | 
 |                        -env X11VNC_AVAHI_NAME=wally | 
 |  | 
 |                        If the avahi API cannot be found at build time, a helper | 
 |                        program like avahi-publish(1) or dns-sd(1) will be tried | 
 |  | 
 | -mdns                  Same as -avahi. | 
 | -zeroconf              Same as -avahi. | 
 |  | 
 | -connect string        For use with "vncviewer -listen" reverse connections. | 
 |                        If "string" has the form "host" or "host:port" | 
 |                        the connection is made once at startup. | 
 |  | 
 |                        Use commas for a list of host's and host:port's. | 
 |                        E.g. -connect host1,host2 or host1:0,host2:5678. | 
 |                        Note that to reverse connect to multiple hosts at the | 
 |                        same time you will likely need to also supply: -shared | 
 |  | 
 |                        Note that unlike most vnc servers, x11vnc will require a | 
 |                        password for reverse as well as for forward connections. | 
 |                        (provided password auth has been enabled, -rfbauth, etc) | 
 |                        If you do not want to require a password for reverse | 
 |                        connections set X11VNC_REVERSE_CONNECTION_NO_AUTH=1 in | 
 |                        your environment before starting x11vnc. | 
 |  | 
 |                        If "string" contains "/" it is instead interpreted | 
 |                        as a file to periodically check for new hosts. | 
 |                        The first line is read and then the file is truncated. | 
 |                        Be careful about the location of this file if x11vnc | 
 |                        is running as root (e.g. via gdm(1), etc). | 
 |  | 
 |  | 
 |                        Repeater mode: Some services provide an intermediate | 
 |                        "vnc repeater": http://www.uvnc.com/addons/repeater.html | 
 |                        (and also http://koti.mbnet.fi/jtko/ for linux port) | 
 |                        that acts as a proxy/gateway.  Modes like these require | 
 |                        an initial string to be sent for the reverse connection | 
 |                        before the VNC protocol is started.  Here are the ways | 
 |                        to do this: | 
 |  | 
 |                          -connect pre=some_string+host:port | 
 |                          -connect pre128=some_string+host:port | 
 |                          -connect repeater=ID:1234+host:port | 
 |                          -connect repeater=23.45.67.89::5501+host:port | 
 |  | 
 |                        SSVNC notation is also supported: | 
 |  | 
 |                          -connect repeater://host:port+ID:1234 | 
 |  | 
 |                        As with normal -connect usage, if the repeater port is | 
 |                        not supplied 5500 is assumed. | 
 |  | 
 |                        The basic idea is between the special tag, e.g. "pre=" | 
 |                        and "+" is the pre-string to be sent.  Note that in | 
 |                        this case host:port is the repeater server, NOT the | 
 |                        vnc viewer.  Somehow the pre-string tells the repeater | 
 |                        server how to find the vnc viewer and connect you to it. | 
 |  | 
 |                        In the case pre=some_string+host:port, "some_string" | 
 |                        is simply sent. In the case preNNN=some_string+host:port | 
 |                        "some_string" is sent in a null padded buffer of | 
 |                        length NNN.  repeater= is the same as pre250=, this is | 
 |                        the ultravnc repeater buffer size. | 
 |  | 
 |                        Strings like "\n" and "\r", etc. are expanded to | 
 |                        newline and carriage return.  "\c" is expanded to | 
 |                        "," since the connect string is comma separated. | 
 |  | 
 |                        See also the -proxy option below for additional ways | 
 |                        to plumb reverse connections. | 
 |  | 
 |                        Reverse SSL: using -connect in -ssl mode makes x11vnc | 
 |                        act as an SSL client (initiates SSL connection) rather | 
 |                        than an SSL server.  The idea is x11vnc might be | 
 |                        connecting to stunnel on the viewer side with the | 
 |                        viewer in listening mode.  If you do not want this | 
 |                        behavior, use -env X11VNC_DISABLE_SSL_CLIENT_MODE=1. | 
 |                        With this the viewer side can act as the SSL client | 
 |                        as it normally does for forward connections. | 
 |  | 
 |                        Reverse SSL Repeater mode:  This will work, but note | 
 |                        that if the VNC Client does any sort of a 'Fetch Cert' | 
 |                        action before connecting, then the Repeater will | 
 |                        likely drop the connection and both sides will need | 
 |                        to restart.  Consider the use of -connect_or_exit | 
 |                        and -loop300,2 to have x11vnc reconnect once to the | 
 |                        repeater after the fetch.  You will probably also want | 
 |                        to supply -sslonly to avoid x11vnc thinking the delay | 
 |                        in response means the connection is VeNCrypt.  The env | 
 |                        var X11VNC_DISABLE_SSL_CLIENT_MODE=1 discussed above | 
 |                        may also be useful (i.e. the viewer can do a forward | 
 |                        connection as it normally does.) | 
 |  | 
 |                        IPv6: as of x11vnc 0.9.10 the -connect option should | 
 |                        connect to IPv6 hosts properly.  If there are problems | 
 |                        you can disable IPv6 by setting -DX11VNC_IPV6=0 | 
 |                        in CPPFLAGS when configuring.  If there problems | 
 |                        connecting to IPv6 hosts consider a relay like the | 
 |                        included inet6to4 script or the -proxy option. | 
 |  | 
 | -connect_or_exit str   As with -connect, except if none of the reverse | 
 |                        connections succeed, then x11vnc shuts down immediately | 
 |  | 
 |                        An easier to type alias for this option is '-coe' | 
 |  | 
 |                        By the way, if you do not want x11vnc to listen on | 
 |                        ANY interface use -rfbport 0  which is handy for the | 
 |                        -connect_or_exit mode. | 
 |  | 
 | -proxy string          Use proxy in string (e.g. host:port) as a proxy for | 
 |                        making reverse connections (-connect or -connect_or_exit | 
 |                        options). | 
 |  | 
 |                        Web proxies are supported, but note by default most of | 
 |                        them only support destination connections to ports 443 | 
 |                        or 563, so this might not be very useful (the viewer | 
 |                        would need to listen on that port or the router would | 
 |                        have to do a port redirection). | 
 |  | 
 |                        A web proxy may be specified by either "host:port" | 
 |                        or "http://host:port" (the port is required even if | 
 |                        it is the common choices 80 or 8080) | 
 |  | 
 |                        SOCKS4, SOCKS4a, and SOCKS5 are also supported. | 
 |                        SOCKS proxies normally do not have restrictions on the | 
 |                        destination port number. | 
 |  | 
 |                        Use a format like this: socks://host:port or | 
 |                        socks5://host:port.  Note that ssh -D does not support | 
 |                        SOCKS4a, so use socks5://.  For socks:// SOCKS4 is used | 
 |                        on a numerical IP and "localhost", otherwise SOCKS4a | 
 |                        is used (and so the proxy tries to do the DNS lookup). | 
 |  | 
 |                        An experimental mode is "-proxy http://host:port/..." | 
 |                        Note the "/" after the port that distinguishes it from | 
 |                        a normal web proxy.  The port must be supplied even if | 
 |                        it is the default 80.  For this mode a GET is done to | 
 |                        the supplied URL with the string host=H&port=P appended. | 
 |                        H and P will be the -connect reverse connect host | 
 |                        and port.  Use the string "__END__" to disable the | 
 |                        appending.  The basic idea here is that maybe some cgi | 
 |                        script provides the actual viewer hookup and tunnelling. | 
 |                        How to actually achieve this within cgi, php, etc. is | 
 |                        not clear...  A custom web server or apache module | 
 |                        would be straight-forward. | 
 |  | 
 |                        Another experimental mode is "-proxy ssh://user@host" | 
 |                        in which case a SSH tunnel is used for the proxying. | 
 |                        "user@" is not needed unless your unix username is | 
 |                        different on "host".  For a non-standard SSH port | 
 |                        use ssh://user@host:port.  If proxies are chained (see | 
 |                        next paragraph) then the ssh one must be the first one. | 
 |                        If ssh-agent is not active, then the ssh password needs | 
 |                        to be entered in the terminal where x11vnc is running. | 
 |                        Examples: | 
 |  | 
 |                          -connect localhost:0 -proxy ssh://me@friends-pc:2222 | 
 |  | 
 |                          -connect snoopy:0 -proxy ssh://ssh.company.com | 
 |  | 
 |                        Multiple proxies may be chained together in case one | 
 |                        needs to ricochet off of a number of hosts to finally | 
 |                        reach the VNC viewer.  Up to 3 may be chained, separate | 
 |                        them by commas in the order they are to be connected to. | 
 |                        E.g.:  http://host1:port1,socks5://host2:port2 or three | 
 |                        like:  first,second,third | 
 |  | 
 |                        IPv6: as of x11vnc 0.9.10 the -proxy option should | 
 |                        connect to IPv6 hosts properly.  If there are problems | 
 |                        you can disable IPv6 by setting -DX11VNC_IPV6=0 | 
 |                        in CPPFLAGS when configuring.  If there problems | 
 |                        connecting to IPv6 hosts consider a relay like the | 
 |                        included inet6to4 script. | 
 |  | 
 | -vncconnect            Monitor the VNC_CONNECT X property set by the standard | 
 | -novncconnect          VNC program vncconnect(1).  When the property is | 
 |                        set to "host" or "host:port" establish a reverse | 
 |                        connection.  Using xprop(1) instead of vncconnect may | 
 |                        work (see the FAQ).  The -remote control mechanism uses | 
 |                        X11VNC_REMOTE channel, and this option disables/enables | 
 |                        it as well.  Default: -vncconnect | 
 |  | 
 |                        To use different names for these X11 properties (e.g. to | 
 |                        have separate communication channels for multiple | 
 |                        x11vnc's on the same display) set the VNC_CONNECT or | 
 |                        X11VNC_REMOTE env. vars. to the string you want, for | 
 |                        example: -env X11VNC_REMOTE=X11VNC_REMOTE_12345 | 
 |                        Both sides of the channel must use the same unique name. | 
 |                        The same can be done for the internal X11VNC_TICKER | 
 |                        property (heartbeat and timestamp) if desired. | 
 |  | 
 | -allow host1[,host2..] Only allow client connections from hosts matching | 
 |                        the comma separated list of hostnames or IP addresses. | 
 |                        Can also be a numerical IP prefix, e.g. "192.168.100." | 
 |                        to match a simple subnet, for more control build | 
 |                        LibVNCServer with libwrap support (See the FAQ).  If the | 
 |                        list contains a "/" it instead is a interpreted | 
 |                        as a file containing addresses or prefixes that is | 
 |                        re-read each time a new client connects.  Lines can be | 
 |                        commented out with the "#" character in the usual way. | 
 |  | 
 |                        -allow applies in -ssl mode, but not in -stunnel mode. | 
 |  | 
 |                        IPv6: as of x11vnc 0.9.10 a host can be specified | 
 |                        in IPv6 numerical format, e.g. 2001:4860:b009::93. | 
 |  | 
 | -localhost             Basically the same as "-allow 127.0.0.1". | 
 |  | 
 |                        Note: if you want to restrict which network interface | 
 |                        x11vnc listens on, see the -listen option below. | 
 |                        E.g. "-listen localhost" or "-listen 192.168.3.21". | 
 |                        As a special case, the option "-localhost" implies | 
 |                        "-listen localhost". | 
 |  | 
 |                        A rare case, but for non-localhost -listen usage, if | 
 |                        you use the remote control mechanism (-R) to change | 
 |                        the -listen interface you may need to manually adjust | 
 |                        the -allow list (and vice versa) to avoid situations | 
 |                        where no connections (or too many) are allowed. | 
 |  | 
 |                        If you do not want x11vnc to listen on ANY interface | 
 |                        (evidently you are using -connect or -connect_or_exit, | 
 |                        or plan to use remote control: -R connect:host), use | 
 |                        -rfbport 0 | 
 |  | 
 |                        IPv6: if IPv6 is supported, this option automatically | 
 |                        implies the IPv6 loopback address '::1' as well. | 
 |  | 
 | -unixsock str          Listen on the unix socket (AF_UNIX) 'str' | 
 |                        for connections.  This mode is for either local | 
 |                        connections or a tunnel endpoint where one wants the | 
 |                        file permission of the unix socket file to determine | 
 |                        what can connect to it.  (This currently requires an | 
 |                        edit to libvnserver/rfbserver.c: comment out lines 310 | 
 |                        and 311, 'close(sock)' and 'return NULL' in rfbserver.c | 
 |                        after the setsockopt() call.) Note that to disable all | 
 |                        tcp listening ports specify '-rfbport 0' and should be | 
 |                        useful with this mode.  Example: | 
 |                            mkdir ~/s; chmod 700 ~/s; | 
 |                            x11vnc -unixsock ~/s/mysock -rfbport 0 ... | 
 |                        The SSVNC unix vncviewer can connect to unix sockets. | 
 |  | 
 | -listen6 str           When in IPv6 listen mode "-6", listen only on the | 
 |                        network interface with address "str".  It also works | 
 |                        for link scope addresses (fe80::219:dbff:fee5:3f92%eth0) | 
 |                        and IPv6 hostname strings (e.g. ipv6.google.com.) | 
 |                        Use LibVNCServer -listen option for the IPv4 interface. | 
 |  | 
 | -nolookup              Do not use gethostbyname() or gethostbyaddr() to look up | 
 |                        host names or IP numbers.  Use this if name resolution | 
 |                        is incorrectly set up and leads to long pauses as name | 
 |                        lookups time out, etc. | 
 |  | 
 | -input string          Fine tuning of allowed user input.  If "string" does | 
 |                        not contain a comma "," the tuning applies only to | 
 |                        normal clients.  Otherwise the part before "," is | 
 |                        for normal clients and the part after for view-only | 
 |                        clients.  "K" is for Keystroke input, "M" for | 
 |                        Mouse-motion input, "B" for Button-click input, "C" | 
 |                        is for Clipboard input, and "F" is for File transfer | 
 |                        (ultravnc only).  Their presence in the string enables | 
 |                        that type of input.  E.g. "-input M" means normal | 
 |                        users can only move the mouse and  "-input KMBCF,M" | 
 |                        lets normal users do anything and enables view-only | 
 |                        users to move the mouse.  This option is ignored when | 
 |                        a global -viewonly is in effect (all input is discarded | 
 |                        in that case). | 
 |  | 
 | -grabkbd               When VNC viewers are connected, attempt to the grab | 
 |                        the keyboard so a (non-malicious) user sitting at the | 
 |                        physical display is not able to enter keystrokes. | 
 |                        This method uses XGrabKeyboard(3X11) and so it is | 
 |                        not secure and does not rule out the person at the | 
 |                        physical display injecting keystrokes by flooding the | 
 |                        server with them, grabbing the keyboard himself, etc. | 
 |                        Some degree of cooperation from the person at the | 
 |                        display is assumed.  This is intended for remote | 
 |                        help-desk or educational usage modes. | 
 |  | 
 |                        Note: on some recent (12/2010) X servers and/or | 
 |                        desktops, -grabkbd no longer works: it prevents the | 
 |                        window manager from resizing windows and similar things. | 
 |                        Try -ungrabboth below (might not work.) | 
 |  | 
 | -grabptr               As -grabkbd, but for the mouse pointer using | 
 |                        XGrabPointer(3X11).  Unfortunately due to the way the X | 
 |                        server works, the mouse can still be moved around by the | 
 |                        user at the physical display, but he will not be able to | 
 |                        change window focus with it.  Also some window managers | 
 |                        that call XGrabServer(3X11) for resizes, etc, will | 
 |                        act on the local user's input.  Again, some degree of | 
 |                        cooperation from the person at the display is assumed. | 
 |  | 
 | -ungrabboth            Whenever there is any input (either keyboard or | 
 |                        pointer), ungrab *both* the keyboard and the pointer | 
 |                        while injecting the synthetic input.  This is to allow | 
 |                        window managers, etc. a chance to grab. | 
 |  | 
 | -grabalways            Apply both -grabkbd and -grabptr even when no VNC | 
 |                        viewers are connected.  If you only want one of them, | 
 |                        use the -R remote control to turn the other back on, | 
 |                        e.g. -R nograbptr. | 
 |  | 
 | -viewpasswd string     Supply a 2nd password for view-only logins.  The -passwd | 
 |                        (full-access) password must also be supplied. | 
 |  | 
 | -passwdfile filename   Specify the LibVNCServer password via the first line | 
 |                        of the file "filename" (instead of via -passwd on | 
 |                        the command line where others might see it via ps(1)). | 
 |  | 
 |                        See the descriptions below for how to supply multiple | 
 |                        passwords, view-only passwords, to specify external | 
 |                        programs for the authentication, and other features. | 
 |  | 
 |                        If the filename is prefixed with "rm:" it will be | 
 |                        removed after being read.  Perhaps this is useful in | 
 |                        limiting the readability of the file.  In general, the | 
 |                        password file should not be readable by untrusted users | 
 |                        (BTW: neither should the VNC -rfbauth file: it is NOT | 
 |                        encrypted, only obscured with a fixed key). | 
 |  | 
 |                        If the filename is prefixed with "read:" it will | 
 |                        periodically be checked for changes and reread.  It is | 
 |                        guaranteed to be reread just when a new client connects | 
 |                        so that the latest passwords will be used. | 
 |  | 
 |                        If "filename" is prefixed with "cmd:" then the | 
 |                        string after the ":" is run as an external command: | 
 |                        the output of the command will be interpreted as if it | 
 |                        were read from a password file (see below).  If the | 
 |                        command does not exit with 0, then x11vnc terminates | 
 |                        immediately.  To specify more than 1000 passwords this | 
 |                        way set X11VNC_MAX_PASSWDS before starting x11vnc. | 
 |                        The environment variables are set as in -accept. | 
 |  | 
 |                        Note that due to the VNC protocol only the first 8 | 
 |                        characters of a password are used (DES key). | 
 |  | 
 |                        If "filename" is prefixed with "custom:" then a | 
 |                        custom password checker is supplied as an external | 
 |                        command following the ":". The command will be run | 
 |                        when a client authenticates.  If the command exits with | 
 |                        0 the client is accepted, otherwise it is rejected. | 
 |                        The environment variables are set as in -accept. | 
 |  | 
 |                        The standard input to the custom command will be a | 
 |                        decimal digit "len" followed by a newline. "len" | 
 |                        specifies the challenge size and is usually 16 (the | 
 |                        VNC spec).  Then follows len bytes which is the random | 
 |                        challenge string that was sent to the client. This is | 
 |                        then followed by len more bytes holding the client's | 
 |                        response (i.e. the challenge string encrypted via DES | 
 |                        with the user password in the standard situation). | 
 |  | 
 |                        The "custom:" scheme can be useful to implement | 
 |                        dynamic passwords or to implement methods where longer | 
 |                        passwords and/or different encryption algorithms | 
 |                        are used.  The latter will require customizing the VNC | 
 |                        client as well.  One could create an MD5SUM based scheme | 
 |                        for example. | 
 |  | 
 |                        File format for -passwdfile: | 
 |  | 
 |                        If multiple non-blank lines exist in the file they are | 
 |                        all taken as valid passwords.  Blank lines are ignored. | 
 |                        Password lines may be "commented out" (ignored) if | 
 |                        they begin with the character "#" or the line contains | 
 |                        the string "__SKIP__".  Lines may be annotated by use | 
 |                        of the "__COMM__" string: from it to the end of the | 
 |                        line is ignored.  An empty password may be specified | 
 |                        via the "__EMPTY__" string on a line by itself (note | 
 |                        your viewer might not accept empty passwords). | 
 |  | 
 |                        If the string "__BEGIN_VIEWONLY__" appears on a | 
 |                        line by itself, the remaining passwords are used for | 
 |                        viewonly access.  For compatibility, as a special case | 
 |                        if the file contains only two password lines the 2nd | 
 |                        one is automatically taken as the viewonly password. | 
 |                        Otherwise the "__BEGIN_VIEWONLY__" token must be | 
 |                        used to have viewonly passwords.  (tip: make the 3rd | 
 |                        and last line be "__BEGIN_VIEWONLY__" to have 2 | 
 |                        full-access passwords) | 
 |  | 
 | -showrfbauth filename  Print to the screen the obscured VNC password kept in | 
 |                        the rfbauth file "filename" and then exit. | 
 |  | 
 | -unixpw [list]         Use Unix username and password authentication.  x11vnc | 
 |                        will use the su(1) program to verify the user's | 
 |                        password.  [list] is an optional comma separated list | 
 |                        of allowed Unix usernames.  If the [list] string begins | 
 |                        with the character "!" then the entire list is taken | 
 |                        as an exclude list.  See below for per-user options | 
 |                        that can be applied. | 
 |  | 
 |                        A familiar "login:" and "Password:" dialog is | 
 |                        presented to the user on a black screen inside the | 
 |                        vncviewer.  The connection is dropped if the user fails | 
 |                        to supply the correct password in 3 tries or does not | 
 |                        send one before a 45 second timeout.  Existing clients | 
 |                        are view-only during this period. | 
 |  | 
 |                        If the first character received is "Escape" then the | 
 |                        unix username will not be displayed after "login:" | 
 |                        as it is typed.  This could be of use for VNC viewers | 
 |                        that automatically type the username and password. | 
 |  | 
 |                        Since the detailed behavior of su(1) can vary from | 
 |                        OS to OS and for local configurations, test the mode | 
 |                        before deployment to make sure it is working properly. | 
 |                        x11vnc will attempt to be conservative and reject a | 
 |                        login if anything abnormal occurs. | 
 |  | 
 |                        One case to note: FreeBSD and the other BSD's by | 
 |                        default it is impossible for the user running x11vnc to | 
 |                        validate his *own* password via su(1) (commenting out | 
 |                        the pam_self.so entry in /etc/pam.d/su eliminates this | 
 |                        behavior).  So the x11vnc login will always *FAIL* for | 
 |                        this case (even when the correct password is supplied). | 
 |  | 
 |                        A possible workaround for this on *BSD would be to | 
 |                        start x11vnc as root with the "-users +nobody" option | 
 |                        to immediately switch to user nobody where the su'ing | 
 |                        will proceed normally. | 
 |  | 
 |                        Another source of potential problems are PAM modules | 
 |                        that prompt for extra info, e.g. password aging modules. | 
 |                        These logins will fail as well even when the correct | 
 |                        password is supplied. | 
 |  | 
 |                        **IMPORTANT**: to prevent the Unix password being sent | 
 |                        in *clear text* over the network, one of two schemes | 
 |                        will be enforced: 1) the -ssl builtin SSL mode, or 2) | 
 |                        require both -localhost and -stunnel be enabled. | 
 |  | 
 |                        Method 1) ensures the traffic is encrypted between | 
 |                        viewer and server.  A PEM file will be required, see the | 
 |                        discussion under -ssl below (under some circumstances | 
 |                        a temporary one can be automatically generated). | 
 |  | 
 |                        Method 2) requires the viewer connection to appear | 
 |                        to come from the same machine x11vnc is running on | 
 |                        (e.g. from a ssh -L port redirection).  And that the | 
 |                        -stunnel SSL mode be used for encryption over the | 
 |                        network. (see the description of -stunnel below). | 
 |  | 
 |                        Note: as a convenience, if you ssh(1) in and start | 
 |                        x11vnc it will check if the environment variable | 
 |                        SSH_CONNECTION is set and appears reasonable.  If it | 
 |                        does, then the -ssl or -stunnel requirement will be | 
 |                        dropped since it is assumed you are using ssh for the | 
 |                        encrypted tunnelling.  -localhost is still enforced. | 
 |                        Use -ssl or -stunnel to force SSL usage even if | 
 |                        SSH_CONNECTION is set. | 
 |  | 
 |                        To override the above restrictions you can set | 
 |                        environment variables before starting x11vnc: | 
 |  | 
 |                        Set UNIXPW_DISABLE_SSL=1 to disable requiring either | 
 |                        -ssl or -stunnel (as under SSH_CONNECTION.)  Evidently | 
 |                        you will be using a different method to encrypt the | 
 |                        data between the vncviewer and x11vnc: perhaps ssh(1) | 
 |                        or an IPSEC VPN. -localhost is still enforced (however, | 
 |                        see the next paragraph.) | 
 |  | 
 |                        Set UNIXPW_DISABLE_LOCALHOST=1 to disable the -localhost | 
 |                        requirement in -unixpw modes.  One should never do this | 
 |                        (i.e. allow the Unix passwords to be sniffed on the | 
 |                        network.)  This also disables the localhost requirement | 
 |                        for reverse connections (see below.) | 
 |  | 
 |                        Note that use of -localhost with ssh(1) (and no -unixpw) | 
 |                        is roughly the same as requiring a Unix user login | 
 |                        (since a Unix password or the user's public key | 
 |                        authentication is used by sshd on the machine where | 
 |                        x11vnc runs and only local connections from that machine | 
 |                        are accepted). | 
 |  | 
 |                        Regarding reverse connections (e.g. -R connect:host | 
 |                        and -connect host), when the -localhost constraint is | 
 |                        in effect then reverse connections can only be used | 
 |                        to connect to the same machine x11vnc is running on | 
 |                        (default port 5500).  Please use a ssh or stunnel port | 
 |                        redirection to the viewer machine to tunnel the reverse | 
 |                        connection over an encrypted channel. | 
 |  | 
 |                        In -inetd mode the Method 1) will be enforced (not | 
 |                        Method 2).  With -ssl in effect reverse connections | 
 |                        are disabled.  If you override this via env. var, be | 
 |                        sure to also use encryption from the viewer to inetd. | 
 |                        Tip: you can also have your own stunnel spawn x11vnc | 
 |                        in -inetd mode (thereby bypassing inetd).  See the FAQ | 
 |                        for details. | 
 |  | 
 |                        The user names in the comma separated [list] may have | 
 |                        per-user options after a ":", e.g. "fred:opts" | 
 |                        where "opts" is a "+" separated list of | 
 |                        "viewonly", "fullaccess", "input=XXXX", or | 
 |                        "deny", e.g. "karl,wally:viewonly,boss:input=M". | 
 |                        For "input=" it is the K,M,B,C described under -input. | 
 |  | 
 |                        If an item in the list is "*" that means those | 
 |                        options apply to all users.  It ALSO implies all users | 
 |                        are allowed to log in after supplying a valid password. | 
 |                        Use "deny" to explicitly deny some users if you use | 
 |                        "*" to set a global option.  If [list] begins with the | 
 |                        "!" character then "*" is ignored for checking if | 
 |                        the user is allowed, but the option values associated | 
 |                        with it do apply as normal. | 
 |  | 
 |                        There are also some utilities for checking passwords | 
 |                        if [list] starts with the "%" character.  See the | 
 |                        quick_pw() function for more details.  Description: | 
 |                        "%-" or "%stdin" means read one line from stdin. | 
 |                        "%env" means it is in $UNIXPW env var.  A leading | 
 |                        "%/" or "%." means read the first line from the | 
 |                        filename that follows after the % character. % by | 
 |                        itself means prompt for the username and password. | 
 |                        Otherwise: %user:pass   E.g. -unixpw %fred:swordfish | 
 |                        For the other cases user:pass is read from the indicated | 
 |                        source.  If the password is correct 'Y user' is printed | 
 |                        and the program exit code is 0.  If the password is | 
 |                        incorrect it prints 'N user' and the exit code is 1. | 
 |                        If there is some other error the exit code is 2. | 
 |                        This feature enables x11vnc to be a general unix user | 
 |                        password checking tool; it could be used from scripts | 
 |                        or other programs.  These % password checks also apply | 
 |                        to the -unixpw_nis and -unixpw_cmd options. | 
 |  | 
 |                        For the % password check, if the env. var. UNIXPW_CMD | 
 |                        is set to a command then it is run as the user (assuming | 
 |                        the password is correct.)  The output of the command is | 
 |                        not printed, the program or script must manage that by | 
 |                        some other means.  The exit code of x11vnc will depend | 
 |                        on the exit code of the command that is run. | 
 |  | 
 |                        Use -nounixpw to disable unixpw mode if it was enabled | 
 |                        earlier in the cmd line (e.g. -svc mode) | 
 |  | 
 | -unixpw_nis [list]     As -unixpw above, however do not use su(1) but rather | 
 |                        use the traditional getpwnam(3) + crypt(3) method to | 
 |                        verify passwords. All of the above -unixpw options and | 
 |                        constraints apply. | 
 |  | 
 |                        This mode requires that the encrypted passwords be | 
 |                        readable.  Encrypted passwords stored in /etc/shadow | 
 |                        will be inaccessible unless x11vnc is run as root. | 
 |  | 
 |                        This is called "NIS" mode simply because in most | 
 |                        NIS setups user encrypted passwords are accessible | 
 |                        (e.g. "ypcat passwd") by an ordinary user and so that | 
 |                        user can authenticate ANY user. | 
 |  | 
 |                        NIS is not required for this mode to work (only that | 
 |                        getpwnam(3) return the encrypted password is required), | 
 |                        but it is unlikely it will work (as an ordinary user) | 
 |                        for most modern environments unless NIS is available. | 
 |                        On the other hand, when x11vnc is run as root it will | 
 |                        be able to to access /etc/shadow even if NIS is not | 
 |                        available (note running as root is often done when | 
 |                        running x11vnc from inetd and xdm/gdm/kdm). | 
 |  | 
 |                        Looked at another way, if you do not want to use the | 
 |                        su(1) method provided by -unixpw (i.e. su_verify()), you | 
 |                        can run x11vnc as root and use -unixpw_nis.  Any users | 
 |                        with passwords in /etc/shadow can then be authenticated. | 
 |  | 
 |                        In -unixpw_nis mode, under no circumstances is x11vnc's | 
 |                        user password verifying function based on su called | 
 |                        (i.e. the function su_verify() that runs /bin/su | 
 |                        in a pseudoterminal to verify passwords.)  However, | 
 |                        if -unixpw_nis is used in conjunction with the -find | 
 |                        and -create -display WAIT:... modes then, if x11vnc is | 
 |                        running as root, /bin/su may be called externally to | 
 |                        run the find or create commands. | 
 |  | 
 | -unixpw_cmd cmd        As -unixpw above, however do not use su(1) but rather | 
 |                        run the externally supplied command "cmd".  The first | 
 |                        line of its stdin will be the username and the second | 
 |                        line the received password.  If the command exits | 
 |                        with status 0 (success) the VNC user will be accepted. | 
 |                        It will be rejected for any other return status. | 
 |  | 
 |                        Dynamic passwords and non-unix passwords, e.g. LDAP, | 
 |                        can be implemented this way by providing your own custom | 
 |                        helper program.  Note that the remote viewer is given 3 | 
 |                        tries to enter the correct password, and so the program | 
 |                        may be called in a row that many (or more) times. | 
 |  | 
 |                        If a list of allowed users is needed to limit who can | 
 |                        log in, use -unixpw [list] in addition to this option. | 
 |  | 
 |                        In FINDDISPLAY and FINDCREATEDISPLAY modes the "cmd" | 
 |                        will also be run with the RFB_UNIXPW_CMD_RUN env. var. | 
 |                        non-empty and set to the corresponding display | 
 |                        find/create command.  The first two lines of input are | 
 |                        the username and passwd as in the normal case described | 
 |                        above.  To support FINDDISPLAY and FINDCREATEDISPLAY, | 
 |                        "cmd" should run the requested command as the user | 
 |                        (and most likely refusing to run it if the password is | 
 |                        not correct.)  Here is an example script (note it has | 
 |                        a hardwired bogus password "abc"!) | 
 |  | 
 |                          #!/bin/sh | 
 |                          # Example x11vnc -unixpw_cmd script. | 
 |                          # Read the first two lines of stdin (user and passwd) | 
 |                          read user | 
 |                          read pass | 
 |  | 
 |                          debug=0 | 
 |                          if [ $debug = 1 ]; then | 
 |                                 echo "user: $user" 1>&2 | 
 |                                 echo "pass: $pass" 1>&2 | 
 |                                 env | egrep -i 'rfb|vnc' 1>&2 | 
 |                          fi | 
 |  | 
 |                          # Check if the password is valid. | 
 |                          # (A real example would use ldap lookup, etc!) | 
 |                          if [ "X$pass" != "Xabc" ]; then | 
 |                                 exit 1  # incorrect password | 
 |                          fi | 
 |  | 
 |                          if [ "X$RFB_UNIXPW_CMD_RUN" = "X" ]; then | 
 |                                 exit 0  # correct password | 
 |                          else | 
 |                                 # Run the requested command (finddisplay) | 
 |                                 if [ $debug = 1 ]; then | 
 |                                         echo "run: $RFB_UNIXPW_CMD_RUN" 1>&2 | 
 |                                 fi | 
 |                                 exec /bin/su - "$user" -c "$RFB_UNIXPW_CMD_RUN" | 
 |                          fi | 
 |  | 
 |                        In -unixpw_cmd mode, under no circumstances is x11vnc's | 
 |                        user password verifying function based on su called | 
 |                        (i.e. the function su_verify() that runs /bin/su in a | 
 |                        pseudoterminal to verify passwords.)  It is up to the | 
 |                        supplied unixpw_cmd to do user switching if desired | 
 |                        and if it has the permissions to do so. | 
 |  | 
 | -find                  Find the user's display using FINDDISPLAY. This | 
 |                        is an alias for "-display WAIT:cmd=FINDDISPLAY". | 
 |  | 
 |                        Note: if a -display occurs later on the command line | 
 |                        it will override the -find setting. | 
 |  | 
 |                        For this and the next few options see -display WAIT:... | 
 |                        below for all of the details. | 
 |  | 
 | -finddpy               Run the FINDDISPLAY program, print out the found | 
 |                        display (if any) and exit.  Output is like: DISPLAY=:0.0 | 
 |                        DISPLAY=:0.0,XPID=12345 or DISPLAY=:0.0,VT=7.  XPID is | 
 |                        the process ID of the found X server.  VT is the Linux | 
 |                        virtual terminal of the X server. | 
 | -listdpy               Have the FINDDISPLAY program list all of your displays | 
 |                        (i.e. all the X displays on the local machine that you | 
 |                        have access rights to).  x11vnc then exits. | 
 |  | 
 | -findauth [disp]       Apply the -find/-finddpy heuristics to try to guess | 
 |                        the XAUTHORITY file for DISPLAY 'disp'.  If 'disp' | 
 |                        is not supplied, then the value in the -display on | 
 |                        the cmdline is used; failing that $DISPLAY is used; | 
 |                        and failing that ":0" is used.  x11vnc then exits. | 
 |  | 
 |                        If nothing is printed out, that means no XAUTHORITY was | 
 |                        found for 'disp'; i.e. failure.  If "XAUTHORITY=" | 
 |                        is printed out, that means use the default (i.e. do | 
 |                        not set XAUTHORITY).  If "XAUTHORITY=/path/to/file" | 
 |                        is printed out, then use that file. | 
 |  | 
 |                        XDM/GDM/KDM: if you are running x11vnc as root and want | 
 |                        to find the XAUTHORITY before anyone has logged into an | 
 |                        X session yet, use: x11vnc -env FD_XDM=1 -findauth ... | 
 |                        (This will also find the XAUTHORITY if a user is already | 
 |                        logged into the X session.)  When running as root, | 
 |                        FD_XDM=1 will be tried if the initial -findauth fails. | 
 |  | 
 | -create                First try to find the user's display using FINDDISPLAY, | 
 |                        if that doesn't succeed create an X session via the | 
 |                        FINDCREATEDISPLAY method.  This is an alias for | 
 |                        "-display WAIT:cmd=FINDCREATEDISPLAY-Xvfb". | 
 |  | 
 |                        Note: if a -display occurs later on the command line | 
 |                        it will override the -create setting. | 
 |  | 
 |                        SSH NOTE: for both -find and -create you can (should!) | 
 |                        add the "-localhost" option to force SSH tunnel access. | 
 |  | 
 | -xdummy                As in -create, except Xdummy instead of Xvfb. | 
 | -xvnc                  As in -create, except Xvnc instead of Xvfb. | 
 | -xvnc_redirect         As in -create, except Xvnc.redirect instead of Xvfb. | 
 | -xdummy_xvfb           Sets WAIT:cmd=FINDCREATEDISPLAY-Xdummy,Xvfb | 
 |  | 
 | -create_xsrv str       Sets WAIT:cmd=FINDCREATEDISPLAY-<str>  Can be on cmdline | 
 |                        after anything that sets WAIT:.. and other things | 
 |                        (e.g. -svc, -xdmsvc) to adjust the X server list. | 
 |                        Example: -svc ... -create_xsrv Xdummy,X | 
 |  | 
 | -svc                   Terminal services mode based on SSL access.  Alias for | 
 |                        -display WAIT:cmd=FINDCREATEDISPLAY-Xvfb -unixpw -users | 
 |                        unixpw= -ssl SAVE   Also "-service". | 
 |  | 
 |                        Note: if a -display, -unixpw, -users, or -ssl occurs | 
 |                        later on the command line it will override the -svc | 
 |                        setting. | 
 |  | 
 | -svc_xdummy            As -svc except Xdummy instead of Xvfb. | 
 | -svc_xvnc              As -svc except Xvnc instead of Xvfb. | 
 | -svc_xdummy_xvfb       As -svc with Xdummy,Xvfb. | 
 |  | 
 | -xdmsvc                Display manager Terminal services mode based on SSL. | 
 |                        Alias for -display WAIT:cmd=FINDCREATEDISPLAY-Xvfb.xdmcp | 
 |                        -unixpw -users unixpw= -ssl SAVE  Also "-xdm_service". | 
 |  | 
 |                        Note: if a -display, -unixpw, -users, or -ssl occurs | 
 |                        later on the command line it will override the -xdmsvc | 
 |                        setting. | 
 |  | 
 |                        To create a session a user will have to first log in | 
 |                        to the -unixpw dialog and then log in again to the | 
 |                        XDM/GDM/KDM prompt.  Subsequent re-connections will | 
 |                        only require the -unixpw password.  See the discussion | 
 |                        under -display WAIT:... for more details about XDM, | 
 |                        etc configuration. | 
 |  | 
 |                        Remember to enable XDMCP in the xdm-config, gdm.conf, | 
 |                        or kdmrc configuration file.  See -display WAIT: for | 
 |                        more info. | 
 |  | 
 | -sshxdmsvc             Display manager Terminal services mode based on SSH. | 
 |                        Alias for -display WAIT:cmd=FINDCREATEDISPLAY-Xvfb.xdmcp | 
 |                        -localhost. | 
 |  | 
 |                        The -localhost option constrains connections to come | 
 |                        in via a SSH tunnel (which will require a login). | 
 |                        To create a session a user will also have to log into | 
 |                        the XDM GDM KDM prompt. Subsequent re-connections will | 
 |                        only only require the SSH login.  See the discussion | 
 |                        under -display WAIT:... for more details about XDM, | 
 |                        etc configuration. | 
 |  | 
 |                        Remember to enable XDMCP in the xdm-config, gdm.conf, | 
 |                        or kdmrc configuration file.  See -display WAIT: for | 
 |                        more info. | 
 |  | 
 | -unixpw_system_greeter Present a "Press 'Escape' for System Greeter" option | 
 |                        to the connecting VNC client in combined -unixpw | 
 |                        and xdmcp FINDCREATEDISPLAY modes (e.g. -xdmsvc). | 
 |  | 
 |                        Normally in a -unixpw mode the VNC client must | 
 |                        supply a valid username and password to gain access. | 
 |                        However, if -unixpw_system_greeter is supplied AND | 
 |                        the FINDCREATEDISPLAY command matches 'xdmcp', then | 
 |                        the user has the option to press Escape and then get a | 
 |                        XDM/GDM/KDM login/greeter panel instead. They will then | 
 |                        supply a username and password directly to the greeter. | 
 |  | 
 |                        Otherwise, in xdmcp FINDCREATEDISPLAY mode the user | 
 |                        must supply his username and password TWICE.  First to | 
 |                        the initial unixpw login dialog, and second to the | 
 |                        subsequent XDM/GDM/KDM greeter.  Note that if the user | 
 |                        re-connects and supplies his username and password in | 
 |                        the unixpw dialog the xdmcp greeter is skipped and | 
 |                        he is connected directly to his existing X session. | 
 |                        So the -unixpw_system_greeter option avoids the extra | 
 |                        password at X session creation time. | 
 |  | 
 |                        Example:  x11vnc -xdmsvc -unixpw_system_greeter | 
 |                        See -unixpw and -display WAIT:... for more info. | 
 |  | 
 |                        The special options after a colon at the end of the | 
 |                        username (e.g. user:solid) described under -display | 
 |                        WAIT: are also applied in this mode if they are typed | 
 |                        in before the user hits Escape.  The username is ignored | 
 |                        but the colon options are not. | 
 |  | 
 |                        The default message is 2 lines in a small font, set | 
 |                        the env. var. X11VNC_SYSTEM_GREETER1=true for a 1 line | 
 |                        message in a larger font. | 
 |  | 
 |                        If the user pressed Escape the FINDCREATEDISPLAY command | 
 |                        will be run with the env. var. X11VNC_XDM_ONLY=1. | 
 |  | 
 |                        Remember to enable XDMCP in the xdm-config, gdm.conf, | 
 |                        or kdmrc configuration file.  See -display WAIT: for | 
 |                        more info. | 
 |  | 
 | -redirect port         As in FINDCREATEDISPLAY-Xvnc.redirect mode except | 
 |                        redirect immediately (i.e. without X session finding | 
 |                        or creation) to a VNC server listening on port. You | 
 |                        can also supply host:port to redirect to a different | 
 |                        machine. | 
 |  | 
 |                        If 0 <= port < 200 it is taken as a VNC display (5900 is | 
 |                        added to get the actual port), if port < 0 then -port | 
 |                        is used. | 
 |  | 
 |                        Probably the only reason to use the -redirect option | 
 |                        is in conjunction with SSL support, e.g. -ssl SAVE. | 
 |                        This provides an easy way to add SSL encryption to a VNC | 
 |                        server that does not support SSL (e.g. Xvnc or vnc.so) | 
 |                        In fact, the protocol does not even need to be VNC, | 
 |                        and so "-rfbport port1 -ssl SAVE -redirect host:port2" | 
 |                        can act as a replacement for stunnel(1). | 
 |  | 
 |                        This mode only allows one redirected connection. | 
 |                        The -forever option does not apply.  Use -inetd or | 
 |                        -loop for persistent service. | 
 |  | 
 | -display_WAIT :...      A special usage mode for the normal -display option. | 
 |                        Useful with -unixpw, but can be used independently | 
 |                        of it.  If the display string begins with WAIT: then | 
 |                        x11vnc waits until a VNC client connects before opening | 
 |                        the X display (or -rawfb device). | 
 |  | 
 |                        This could be useful for delaying opening the display | 
 |                        for certain usage modes (say if x11vnc is started at | 
 |                        boot time and no X server is running or users logged | 
 |                        in yet). | 
 |  | 
 |                        If the string is, e.g. WAIT:0.0 or WAIT:1, i.e. "WAIT" | 
 |                        in front of a normal X display, then that indicated | 
 |                        display is used. | 
 |  | 
 |                        One can also insert a geometry between colons, e.g. | 
 |                        WAIT:1280x1024:... to set the size of the display the | 
 |                        VNC client first attaches to since some VNC viewers | 
 |                        will not automatically adjust to a new framebuffer size. | 
 |  | 
 |                        A more interesting case is like this: | 
 |  | 
 |                             WAIT:cmd=/usr/local/bin/find_display | 
 |  | 
 |                        in which case the command after "cmd=" is run to | 
 |                        dynamically work out the DISPLAY and optionally the | 
 |                        XAUTHORITY data.  The first line of the command output | 
 |                        must be of the form DISPLAY=<xdisplay>.  On Linux | 
 |                        if the virtual terminal is known append ",VT=n" to | 
 |                        this string and the chvt(1) program will also be run. | 
 |                        Any remaining output is taken as XAUTHORITY data. | 
 |                        It can be either of the form XAUTHORITY=<file> or raw | 
 |                        xauthority data for the display. For example; | 
 |  | 
 |                             xauth extract - $DISPLAY" | 
 |  | 
 |                        NOTE: As specified in the previous paragraph, you can | 
 |                        supply your own WAIT:cmd=... program or script, BUT | 
 |                        there are two very useful *BUILT-IN* ones: FINDDISPLAY | 
 |                        (alias -find above) and FINDCREATEDISPLAY (alias -create | 
 |                        above.)  Most people use these instead of creating | 
 |                        their own script.  Read the following (especially the | 
 |                        BUILT-IN modes sections) to see how to configure these | 
 |                        two useful builtin -display WAIT: modes. | 
 |  | 
 |                        In the case of -unixpw (and -unixpw_nis only if x11vnc | 
 |                        is running as root), then the cmd= command is run | 
 |                        as the user who just authenticated via the login and | 
 |                        password prompt. | 
 |  | 
 |                        In the case of -unixpw_cmd, the commands will also be | 
 |                        run as the logged-in user, as long as the user-supplied | 
 |                        helper program supports RFB_UNIXPW_CMD_RUN (see the | 
 |                        -unixpw_cmd option.) | 
 |  | 
 |                        Also in the case of -unixpw, the user logging in can | 
 |                        place a colon at the end of her username and supply | 
 |                        a few options: scale=, scale_cursor= (or sc=), solid | 
 |                        (or so), id=, clear_mods (or cm), clear_keys (or | 
 |                        ck), clear_all (or ca), repeat, speeds= (or sp=), | 
 |                        readtimeout= (or rd=), viewonly (or vo), nodisplay= | 
 |                        (or nd=), rotate= (or ro=), or noncache (or nc), | 
 |                        all separated by commas if there is more than one. | 
 |                        After the user logs in successfully, these options will | 
 |                        be applied to the VNC screen.  For example, | 
 |  | 
 |                           login: fred:scale=3/4,sc=1,repeat | 
 |                           Password: ... | 
 |  | 
 |                           login: runge:sp=modem,rd=120,solid | 
 |  | 
 |                        for convenience m/n implies scale= e.g. fred:3/4  If you | 
 |                        type and enter your password incorrectly, to retrieve | 
 |                        your long "login:" line press the Up arrow once | 
 |                        (before typing anything else). | 
 |  | 
 |                        Most of these colon options only apply to the builtin | 
 |                        FINDDISPLAY and FINDCREATEDISPLAY modes, but note | 
 |                        that they are passed to the extrenal command in the | 
 |                        environment as well and so could be used. | 
 |  | 
 |                        In the login panel, press F1 to get a list of the | 
 |                        available options that you can add after the username. | 
 |  | 
 |                        Another option is "geom=WxH" or "geom=WxHxD" (or | 
 |                        ge=). This only has an effect in FINDCREATEDISPLAY | 
 |                        mode when a virtual X server such as Xvfb is going | 
 |                        to be created.  It sets the width and height of | 
 |                        the new display, and optionally the color depth as | 
 |                        well. | 
 |  | 
 |                        You can also supply "gnome", "kde", "twm", | 
 |                        "fvwm", "mwm", "dtwm", "wmaker", "xfce", | 
 |                        "lxde", "enlightenment", "Xsession", or | 
 |                        "failsafe" (same as "xterm") to have the created | 
 |                        display use that mode for the user session. | 
 |  | 
 |                        Specify "tag=..." to set the unique FD_TAG desktop | 
 |                        session tag described below.  Note: this option will | 
 |                        be ignored if the FD_TAG env. var. is already set or | 
 |                        if the viewer-side supplied value is not completely | 
 |                        composed of alphanumeric or '_' or '-' characters. | 
 |  | 
 |                        User preferences file: Instead of having the user type | 
 |                        in geom=WxH,... etc. every time he logs in to find | 
 |                        or create his X session, if you set FD_USERPREFS to | 
 |                        a string that does not contain the "/" character, | 
 |                        then the user's home directory is prepended to that | 
 |                        string and if the file exists its first line is read | 
 |                        and appended to any options he supplied at the login: | 
 |                        prompt.  For example -env FD_USERPREFS=.x11vnc_create | 
 |                        and the user put "geom=1600x1200" in his | 
 |                        ~/.x11vnc_create file. | 
 |  | 
 |                        To disable the option setting set the environment | 
 |                        variable X11VNC_NO_UNIXPW_OPTS=1 before starting x11vnc. | 
 |                        To set any other options, the user can use the gui | 
 |                        (x11vnc -gui connect) or the remote control method | 
 |                        (x11vnc -R opt:val) during his VNC session. | 
 |  | 
 |                        So we see the combination of -display WAIT:cmd=... and | 
 |                        -unixpw allows automatic pairing of an unix | 
 |                        authenticated VNC user with his desktop.  This could | 
 |                        be very useful on SunRays and also any system where | 
 |                        multiple users share a given machine.  The user does | 
 |                        not need to remember special ports or passwords set up | 
 |                        for his desktop and VNC. | 
 |  | 
 |                        A nice way to use WAIT:cmd=... is out of inetd(8) | 
 |                        (it automatically forks a new x11vnc for each user). | 
 |                        You can have the x11vnc inetd spawned process run as, | 
 |                        say, root or nobody.  When run as root (for either inetd | 
 |                        or display manager), you can also supply the option | 
 |                        "-users unixpw=" to have the x11vnc process switch to | 
 |                        the user as well.  Note: there will be a 2nd SSL helper | 
 |                        process that will not switch, but it is only encoding | 
 |                        and decoding the encrypted stream at that point. | 
 |  | 
 |                        BUILT-IN modes: | 
 |  | 
 |                        -- Automatic Finding of User X Sessions -- | 
 |  | 
 |                        As a special case, WAIT:cmd=FINDDISPLAY will run a | 
 |                        script that works on most Unixes to determine a user's | 
 |                        DISPLAY variable and xauthority data (see who(1)). | 
 |  | 
 |                        NOTE: The option "-find" is an alias for this mode. | 
 |  | 
 |                        To have this default script printed to stdout (e.g. for | 
 |                        customization) run with WAIT:cmd=FINDDISPLAY-print To | 
 |                        have the script run to print what display it would find | 
 |                        use "-finddpy" or WAIT:cmd=FINDDISPLAY-run | 
 |  | 
 |                        The standard script runs xdpyinfo(1) run on potential | 
 |                        displays.  If your X server(s) have a login greeter | 
 |                        that exclusively grabs the Xserver, then xdpyinfo | 
 |                        blocks forever and this mode will not work.  See | 
 |                        www.karlrunge.com/x11vnc/faq.html#faq-display-manager | 
 |                        for how to disable this for dtgreet on Solaris and | 
 |                        possibly for other greeters. | 
 |  | 
 |                        In -find/cmd=FINDDISPLAY mode, if you set FD_XDM=1, | 
 |                        e.g. 'x11vnc -env FD_XDM=1 -find ...' and x11vnc is | 
 |                        running as root (e.g. inetd) then it will try to find | 
 |                        the XAUTHORITY file of a running XDM/GDM/KDM login | 
 |                        greeter (i.e. no user has logged into an X session yet.) | 
 |  | 
 |                        As another special case, WAIT:cmd=HTTPONCE will allow | 
 |                        x11vnc to service one http request and then exit. | 
 |                        This is usually done in -inetd mode to run on, say, | 
 |                        port 5800 and allow the Java vncviewer to be downloaded | 
 |                        by client web browsers.  For example: | 
 |  | 
 |                         5815 stream tcp nowait root /usr/sbin/tcpd /.../x11vnc | 
 | \ | 
 |                           -inetd -q -http_ssl -prog /.../x11vnc \ | 
 |                           -display WAIT:cmd=HTTPONCE | 
 |  | 
 |                        Where /.../x11vnc is the full path to x11vnc. | 
 |                        It is used in the Apache SSL-portal example (see FAQ). | 
 |  | 
 |                        In this mode you can set X11VNC_SKIP_DISPLAY to a | 
 |                        comma separated list of displays (e.g. ":0,:1") to | 
 |                        ignore in the finding process.  The ":" is optional. | 
 |                        Ranges n-m e.g. 0-20 can also be supplied. This string | 
 |                        can also be set by the connecting user via "nd=" | 
 |                        using "+" instead of ","  If "nd=all" or you set | 
 |                        X11VNC_SKIP_DISPLAY=all then all display finding fails | 
 |                        as if you set X11VNC_FINDDISPLAY_ALWAYS_FAILS=1 (below.) | 
 |  | 
 |                        On some systems lsof(1) can be very slow.  Set the | 
 |                        env. var. FIND_DISPLAY_NO_LSOF=1 to skip using lsof to | 
 |                        try to find the Linux VT the X server is running on. | 
 |                        set FIND_DISPLAY_NO_VT_FIND=1 to avoid looking at all. | 
 |  | 
 |                        -- Automatic Creation of User X Sessions -- | 
 |  | 
 |                        An interesting option is WAIT:cmd=FINDCREATEDISPLAY | 
 |                        that is like FINDDISPLAY in that is uses the same method | 
 |                        to find an existing display.  However, if it does not | 
 |                        find one it will try to *start* up an X server session | 
 |                        for the user.  This is the only time x11vnc tries to | 
 |                        actually start up an X server. | 
 |  | 
 |                        NOTE: The option "-create" is an alias for this mode. | 
 |  | 
 |                        It will start looking for an open display number at :20 | 
 |                        Override via X11VNC_CREATE_STARTING_DISPLAY_NUMBER=n | 
 |                        By default 80 X displays are allowed (i.e. going to :99) | 
 |                        Override via X11VNC_CREATE_MAX_DISPLAYS=n | 
 |  | 
 |                        For its heuristics, the create display script sets | 
 |                        LC_ALL=C so that command output is uniform.  By default | 
 |                        it will try to restore LC_ALL right before starting the | 
 |                        user session.  However, if you don't mind it keeping | 
 |                        LC_ALL=C set the env. var.: X11VNC_CREATE_LC_ALL_C_OK=1 | 
 |  | 
 |                        By default FINDCREATEDISPLAY will try Xvfb and then | 
 |                        Xdummy: | 
 |  | 
 |                        The Xdummy wrapper is part of the x11vnc source code | 
 |                        (x11vnc/misc/Xdummy)  It should be available in PATH | 
 |                        and have run "Xdummy -install" once to create the | 
 |                        shared library.  Xdummy only works on Linux.  As of | 
 |                        12/2009 it no longer needs to be run as root, and the | 
 |                        default is to not run as root.  In some circumstances | 
 |                        permissions may require running it as root, in these | 
 |                        cases specify FD_XDUMMY_RUN_AS_ROOT=1, this is the same | 
 |                        as supplying -root to the Xdummy cmdline. | 
 |  | 
 |                        Xvfb is available on most platforms and does not | 
 |                        require root. | 
 |  | 
 |                        An advantage of Xdummy over Xvfb is that Xdummy supports | 
 |                        RANDR dynamic screen resizing. | 
 |  | 
 |                        When x11vnc exits (i.e. user disconnects) the X | 
 |                        server session stays running in the background. | 
 |                        The FINDDISPLAY will find it directly next time. | 
 |                        The user must exit the X session in the usual way for | 
 |                        it to terminate (or kill the X server process if all | 
 |                        else fails). | 
 |  | 
 |                        To troubleshoot the FINDCREATEDISPLAY mechanism, | 
 |                        set the following env. var. to an output log file, | 
 |                        e.g -env CREATE_DISPLAY_OUTPUT=/tmp/mydebug.txt | 
 |  | 
 |                        So this is a somewhat odd mode for x11vnc in that it | 
 |                        will start up and poll virtual X servers!  This can | 
 |                        be used from, say, inetd(8) to provide a means of | 
 |                        definitely getting a desktop (either real or virtual) | 
 |                        on the machine.  E.g. a desktop service: | 
 |  | 
 |                          5900 stream tcp nowait root /usr/sbin/tcpd /.../x11vnc | 
 |                           -inetd -q -http -ssl SAVE -unixpw -users unixpw=\ | 
 |                           -passwd secret -prog /.../x11vnc \ | 
 |                           -display WAIT:cmd=FINDCREATEDISPLAY | 
 |  | 
 |                        Where /.../x11vnc is the full path to x11vnc. | 
 |  | 
 |                        See the -svc/-service option alias above. | 
 |  | 
 |                        If for some reason you do not want x11vnc to ever | 
 |                        try to find an existing display set the env. var | 
 |                        X11VNC_FINDDISPLAY_ALWAYS_FAILS=1 (also -env ...) | 
 |                        This is the same as setting X11VNC_SKIP_DISPLAY=all or | 
 |                        supplying "nd=all" after "username:" | 
 |  | 
 |                        Use WAIT:cmd=FINDCREATEDISPLAY-print to print out the | 
 |                        script that is used for this. | 
 |  | 
 |                        You can specify the preferred X server order via e.g., | 
 |                        WAIT:cmd=FINDCREATEDISPLAY-Xdummy,Xvfb,X  and/or leave | 
 |                        out ones you do not want.  The the case "X" means try | 
 |                        to start up a real, hardware X server using xinit(1) | 
 |                        or startx(1).  If there is already an X server running | 
 |                        the X case may only work on Linux (see startx(1)). | 
 |  | 
 |                        "Xvnc" will start up a VNC X server (real- | 
 |                        or tight-vnc, e.g. use if Xvfb is not available). | 
 |                        "Xsrv" will start up the server program in the | 
 |                        variable "FD_XSRV" if it is non-empty. You can make | 
 |                        this be a wrapper script if you like (it must handle :N, | 
 |                        -geometry, and -depth and other X server options). | 
 |  | 
 |                        You can set the environment variable FD_GEOM (or | 
 |                        X11VNC_CREATE_GEOM) to WxH or WxHxD to set the width | 
 |                        and height and optionally the color depth of the | 
 |                        created display.  You can also set FD_SESS to be the | 
 |                        session (short name of the windowmanager: kde, gnome, | 
 |                        twm, failsafe, etc.). FD_OPTS contains extra options | 
 |                        to pass to the X server. You can also set FD_PROG to | 
 |                        be the full path to the session/windowmanager program. | 
 |  | 
 |                        More FD tricks:  FD_CUPS=port or FD_CUPS=host:port | 
 |                        will set the cups printing environment.  Similarly for | 
 |                        FD_ESD=port or FD_ESD=host:port for esddsp sound | 
 |                        redirection.  Set FD_EXTRA to a command to be run a | 
 |                        few seconds after the X server starts up.  Set FD_TAG | 
 |                        to be a unique name for the session, it is set as an | 
 |                        X property, that makes FINDDISPLAY only find sessions | 
 |                        with that tag value. | 
 |  | 
 |                        Set FD_XDMCP_IF to the network interface that the | 
 |                        display manager is running on; default is 'localhost' | 
 |                        but you may need to set it to '::1' on some IPv6 only | 
 |                        systems or misconfigured display managers. | 
 |  | 
 |                        If you want the FINDCREATEDISPLAY session to contact an | 
 |                        XDMCP login manager (xdm/gdm/kdm) on the same machine, | 
 |                        then use "Xvfb.xdmcp" instead of "Xvfb", etc. | 
 |                        The user will have to supply his username and password | 
 |                        one more time (but he gets to select his desktop type | 
 |                        so that can be useful).  For this to work, you will | 
 |                        need to enable localhost XDMCP (udp port 177) for the | 
 |                        display manager.  This seems to be: | 
 |  | 
 |                         for gdm in gdm.conf:   Enable=true in section [xdmcp] | 
 |                         for kdm in kdmrc:      Enable=true in section [Xdmcp] | 
 |                         for xdm in xdm-config: DisplayManager.requestPort: 177 | 
 |  | 
 |                        See the shorthand options above "-svc", "-xdmsvc" | 
 |                        and "-sshxdmsvc" that specify the above options for | 
 |                        some useful cases. | 
 |  | 
 |                        If you set the env. var WAITBG=1 x11vnc will go into | 
 |                        the background once listening in wait mode. | 
 |  | 
 |                        Another special mode is FINDCREATEDISPLAY-Xvnc.redirect, | 
 |                        (or FINDDISPLAY-Xvnc.redirect).  In this case it will | 
 |                        start up Xvnc as above if needed, but instead of | 
 |                        polling it in its normal way, it simply does a socket | 
 |                        redirection of the connected VNC viewer to the Xvnc. | 
 |  | 
 |                        So in Xvnc.redirect x11vnc does no VNC but merely | 
 |                        transfers the data back and forth.  This should be | 
 |                        faster then x11vnc's polling method, but not as fast | 
 |                        as connecting directly to the Xvnc with the VNC Viewer. | 
 |                        The idea here is to take advantage of x11vnc's display | 
 |                        finding/creating scheme, SSL, and perhaps a few others. | 
 |                        Most of x11vnc's options do not apply in this mode. | 
 |  | 
 |                        Xvnc.redirect should also work for the vnc.so X server | 
 |                        module for the h/w display however it will work only | 
 |                        for finding the display and the user must already be | 
 |                        logged into the X console. | 
 |  | 
 | -vencrypt mode         The VeNCrypt extension to the VNC protocol allows | 
 |                        encrypted SSL/TLS connections.  If the -ssl mode is | 
 |                        enabled, then VeNCrypt is enabled as well BY DEFAULT | 
 |                        (they both use a SSL/TLS tunnel, only the protocol | 
 |                        handshake is a little different.) | 
 |  | 
 |                        To control when and how VeNCrypt is used, specify the | 
 |                        mode string.  If mode is "never", then VeNCrypt is | 
 |                        not used.  If mode is "support" (the default) then | 
 |                        VeNCrypt is supported.  If mode is "only", then the | 
 |                        similar and older ANONTLS protocol is not simultaneously | 
 |                        supported.  x11vnc's normal SSL mode (vncs://) will be | 
 |                        supported under -ssl unless you set mode to "force". | 
 |  | 
 |                        If mode is prefixed with "nodh:", then Diffie Hellman | 
 |                        anonymous key exchange is disabled.  If mode is prefixed | 
 |                        with "nox509:", then X509 key exchange is disabled. | 
 |  | 
 |                        To disable all Anonymous Diffie-Hellman access | 
 |                        (susceptible to Man-In-The-Middle attack) you will need | 
 |                        to supply "-vencrypt nodh:support -anontls never" | 
 |                        or "-vencrypt nodh:only" | 
 |  | 
 |                        If mode is prefixed with "newdh:", then new Diffie | 
 |                        Hellman parameters are generated for each connection | 
 |                        (this can be time consuming: 1-60 secs; see -dhparams | 
 |                        below for a faster way) rather than using the | 
 |                        fixed values in the program.  Using fixed, publicly | 
 |                        known values is not known to be a security problem. | 
 |                        This setting applies to ANONTLS as well. | 
 |  | 
 |                        Long example: -vencrypt newdh:nox509:support | 
 |  | 
 |                        Also, if mode is prefixed with "plain:", then | 
 |                        if -unixpw mode is active the VeNCrypt "*Plain" | 
 |                        username+passwd method is enabled for Unix logins. | 
 |                        Otherwise in -unixpw mode the normal login panel is | 
 |                        provided. | 
 |  | 
 |                        You *MUST* supply the -ssl option for VeNCrypt to | 
 |                        be active.  The -vencrypt option only fine-tunes its | 
 |                        operation. | 
 |  | 
 | -anontls mode          The ANONTLS extension to the VNC protocol allows | 
 |                        encrypted SSL/TLS connections.  If the -ssl mode is | 
 |                        enabled, then ANONTLS is enabled as well BY DEFAULT | 
 |                        (they both use a SSL/TLS tunnel, only the protocol | 
 |                        handshake is a little different.) | 
 |  | 
 |                        ANONTLS is an older SSL/TLS mode introduced by vino. | 
 |  | 
 |                        It is referred to as 'TLS' for its registered VNC | 
 |                        security-type name, but we use the more descriptive | 
 |                        'ANONTLS' here because it provides only Anonymous | 
 |                        Diffie-Hellman encrypted connections, and hence no | 
 |                        possibility for certificate authentication. | 
 |  | 
 |                        To control when and how ANONTLS is used, specify the | 
 |                        mode string.  If mode is "never", then ANONTLS is not | 
 |                        used.  If mode is "support" (the default) then ANONTLS | 
 |                        is supported.  If mode is "only", then the similar | 
 |                        VeNCrypt protocol is not simultaneously supported. | 
 |                        x11vnc's normal SSL mode (vncs://) will be supported | 
 |                        under -ssl unless you set mode to "force". | 
 |  | 
 |                        If mode is prefixed with "newdh:", then new Diffie | 
 |                        Hellman parameters are generated for each connection | 
 |                        (this can be time consuming: 1-60 secs; see -dhparams | 
 |                        below for a faster way) rather than using the | 
 |                        fixed values in the program.  Using fixed, publicly | 
 |                        known values is not known to be a security problem. | 
 |                        This setting applies to VeNCrypt as well.  See the | 
 |                        description of "plain:" under -vencrypt. | 
 |  | 
 |                        Long example: -anontls newdh:plain:support | 
 |  | 
 |                        You *MUST* supply the -ssl option for ANONTLS to | 
 |                        be active.  The -anontls option only fine-tunes its | 
 |                        operation. | 
 |  | 
 | -sslonly               Same as: "-vencrypt never -anontls never"  i.e. it | 
 |                        disables the VeNCrypt and ANONTLS encryption methods | 
 |                        and only allows standard SSL tunneling.  You must also | 
 |                        supply the -ssl ... option (see below.) | 
 |  | 
 |  | 
 | -dhparams file         For some operations a set of Diffie Hellman parameters | 
 |                        (prime and generator) is needed.  If so, use the | 
 |                        parameters in "file". In particular, the VeNCrypt and | 
 |                        ANONTLS anonymous DH mode need them.  By default a | 
 |                        fixed set is used. If you do not want to do that you | 
 |                        can specify "newdh:" to the -vencrypt and -anontls | 
 |                        options to generate a new set each session.  If that | 
 |                        is too slow for you, use -dhparams file to a set you | 
 |                        created manually via "openssl dhparam -out file 1024" | 
 |  | 
 | -nossl                 Disable the -ssl option (see below). Since -ssl is off | 
 |                        by default -nossl would only be used on the commandline | 
 |                        to unset any *earlier* -ssl option (or -svc...) | 
 |  | 
 | -ssl [pem]             Use the openssl library (www.openssl.org) to provide a | 
 |                        built-in encrypted SSL/TLS tunnel between VNC viewers | 
 |                        and x11vnc.  This requires libssl support to be | 
 |                        compiled into x11vnc at build time.  If x11vnc is not | 
 |                        built with libssl support it will exit immediately when | 
 |                        -ssl is prescribed.  See the -stunnel option below for | 
 |                        an alternative. | 
 |  | 
 |                        The VNC Viewer-side needs to support SSL/TLS as well. | 
 |                        See this URL and also the discussion below for | 
 |                        ideas on how to enable SSL support for the viewer: | 
 |                        http://www.karlrunge.com/x11vnc/faq.html#faq-ssl-tun | 
 |                        nel-viewers .  x11vnc provides an SSL enabled Java | 
 |                        viewer applet in the classes/ssl directory (-http or | 
 |                        -httpdir options.)  The SSVNC viewer package supports | 
 |                        SSL tunnels too. | 
 |  | 
 |                        If the VNC Viewer supports VeNCrypt or ANONTLS (vino's | 
 |                        encryption mode) they are also supported by the -ssl | 
 |                        mode (see the -vencrypt and -anontls options for more | 
 |                        info; use -sslonly to disable both of them.) | 
 |  | 
 |                        Use "-ssl /path/to/mycert.pem" to specify an SSL | 
 |                        certificate file in PEM format to use to identify and | 
 |                        provide a key for this server.  See openssl(1) for more | 
 |                        info about PEMs and the -sslGenCert and "-ssl SAVE" | 
 |                        options below for how to create them. | 
 |  | 
 |                        The connecting VNC viewer SSL tunnel can (at its option) | 
 |                        authenticate this server if it has the public key part | 
 |                        of the certificate (or a common certificate authority, | 
 |                        CA, is a more sophisticated way to verify this server's | 
 |                        cert, see -sslGenCA below).  This authentication is | 
 |                        done to prevent Man-In-The-Middle attacks.  Otherwise, | 
 |                        if the VNC viewer simply accepts this server's key | 
 |                        WITHOUT verification, the traffic is protected from | 
 |                        passive sniffing on the network, but *NOT* from | 
 |                        Man-In-The-Middle attacks. There are hacker tools | 
 |                        like dsniff/webmitm and cain that implement SSL | 
 |                        Man-In-The-Middle attacks. | 
 |  | 
 |                        If [pem] is empty or the string "SAVE" then the | 
 |                        openssl(1) command must be available to generate the | 
 |                        certificate the first time.  A self-signed certificate | 
 |                        is generated (see -sslGenCA and -sslGenCert for use | 
 |                        of a Certificate Authority.)  It will be saved to the | 
 |                        file ~/.vnc/certs/server.pem.  On subsequent calls if | 
 |                        that file already exists it will be used directly. | 
 |  | 
 |                        Use "SAVE_NOPROMPT" to avoid being prompted to | 
 |                        protect the generated key with a passphrase.  However in | 
 |                        -inetd and -bg modes there will be no prompting for a | 
 |                        passphrase in either case. | 
 |  | 
 |                        If [pem] is "SAVE_PROMPT" the server.pem certificate | 
 |                        will be created based on your answers to its prompts for | 
 |                        all info such as OrganizationalName, CommonName, etc. | 
 |  | 
 |                        Use "SAVE-<string>" and "SAVE_PROMPT-<string>" | 
 |                        to refer to the file ~/.vnc/certs/server-<string>.pem | 
 |                        instead (it will be generated if it does not already | 
 |                        exist).  E.g. "SAVE-charlie" will store to the file | 
 |                        ~/.vnc/certs/server-charlie.pem | 
 |  | 
 |                        Examples: x11vnc -ssl SAVE -display :0 ... | 
 |                                  x11vnc -ssl SAVE-someother -display :0 ... | 
 |  | 
 |                        If [pem] is "TMP" and the openssl(1) utility | 
 |                        command exists in PATH, then a temporary, self-signed | 
 |                        certificate will be generated for this session.  If | 
 |                        openssl(1) cannot be used to generate a temporary | 
 |                        certificate x11vnc exits immediately.  The temporary | 
 |                        cert will be discarded when x11vnc exits. | 
 |  | 
 |                        If successful in using openssl(1) to generate a | 
 |                        temporary certificate in "SAVE" or "TMP" creation | 
 |                        modes, the public part of it will be displayed to stderr | 
 |                        (e.g. one could copy it to the client-side to provide | 
 |                        authentication of the server to VNC viewers.) | 
 |  | 
 |                        NOTE: In "TMP" mode, unless you safely copy the | 
 |                        public part of the temporary Cert to the viewer for | 
 |                        authenticate *every time* (unlikely...), then only | 
 |                        passive sniffing attacks are prevented and you are | 
 |                        still open to Man-In-The-Middle attacks.  This is | 
 |                        why the default "SAVE" mode is preferred (and more | 
 |                        sophisticated CA mode too).  Only with saved keys AND | 
 |                        the VNC viewer authenticating them (via the public | 
 |                        certificate), are Man-In-The-Middle attacks prevented. | 
 |  | 
 |                        If [pem] is "ANON" then the Diffie-Hellman anonymous | 
 |                        key exchange method is used.  In this mode there | 
 |                        are *no* SSL certificates and so it is not possible | 
 |                        to authenticate either the VNC server or VNC client. | 
 |                        Thus only passive network sniffing attacks are avoided: | 
 |                        the "ANON" method is susceptible to Man-In-The-Middle | 
 |                        attacks.  "ANON" is not recommended; instead use | 
 |                        a SSL PEM you created or the default "SAVE" method. | 
 |  | 
 |                        See -ssldir below to use a directory besides the | 
 |                        default ~/.vnc/certs | 
 |  | 
 |                        If your x11vnc binary was not compiled with OpenSSL | 
 |                        library support, use of the -ssl option will induce an | 
 |                        immediate failure and exit.  For such binaries, consider | 
 |                        using the -stunnel option for SSL encrypted connections. | 
 |  | 
 |                        Misc Info: In temporary cert creation mode "TMP", set | 
 |                        the env. var. X11VNC_SHOW_TMP_PEM=1 to have x11vnc print | 
 |                        out the entire certificate, including the PRIVATE KEY | 
 |                        part, to stderr.  There are better ways to get/save this | 
 |                        info.  See "SAVE" above and "-sslGenCert" below. | 
 |  | 
 | -ssltimeout n          Set SSL read timeout to n seconds.  In some situations | 
 |                        (i.e. an iconified viewer in Windows) the viewer stops | 
 |                        talking and the connection is dropped after the default | 
 |                        timeout (25s for about the first minute, 43200s later). | 
 |                        Set to zero to poll forever.  Set to a negative value | 
 |                        to use the builtin setting. | 
 |  | 
 |                        Note that this value does NOT apply to the *initial* ssl | 
 |                        init connection.  The default timeout for that is 20sec. | 
 |                        Use -env SSL_INIT_TIMEOUT=n to modify it. | 
 |  | 
 | -sslnofail             Exit at the first SSL connection failure. Useful when | 
 |                        scripting SSL connections (e.g. x11vnc is started via | 
 |                        ssh) and you do not want x11vnc waiting around for more | 
 |                        connections, tying up ports, etc. | 
 |  | 
 | -ssldir dir            Use "dir" as an alternate ssl certificate and key | 
 |                        management toplevel directory.  The default is | 
 |                        ~/.vnc/certs | 
 |  | 
 |                        This directory is used to store server and other | 
 |                        certificates and keys and also other materials.  E.g. in | 
 |                        the simplest case, "-ssl SAVE" will store the x11vnc | 
 |                        server cert in dir/server.pem | 
 |  | 
 |                        Use of alternate directories via -ssldir allows you to | 
 |                        manage multiple VNC Certificate Authority (CA) keys. | 
 |                        Another use is if ~/.vnc/cert is on an NFS share you | 
 |                        might want your certificates and keys to be on a local | 
 |                        filesystem to prevent network snooping (for example | 
 |                        -ssldir /var/lib/x11vnc-certs). | 
 |  | 
 |                        -ssldir affects nearly all of the other -ssl* options, | 
 |                        e.g. -ssl SAVE, -sslGenCert, etc.. | 
 |  | 
 | -sslverify path        For either of the -ssl or -stunnel modes, use "path" | 
 |                        to provide certificates to authenticate incoming VNC | 
 |                        *Client* connections (normally only the server is | 
 |                        authenticated in SSL.)  This can be used as a method | 
 |                        to replace standard password authentication of clients. | 
 |  | 
 |                        If "path" is a directory it contains the client (or CA) | 
 |                        certificates in separate files.  If path is a file, | 
 |                        it contains one or more certificates. See special tokens | 
 |                        below.  These correspond to the "CApath = dir" and | 
 |                        "CAfile = file" stunnel options.  See the stunnel(8) | 
 |                        manpage for details. | 
 |  | 
 |                        Examples: | 
 |                               x11vnc -ssl -sslverify ~/my.crt | 
 |                               x11vnc -ssl -sslverify ~/my_pem_dir/ | 
 |  | 
 |                        Note that if path is a directory, it must contain | 
 |                        the certs in separate files named like <HASH>.0, where | 
 |                        the value of <HASH> is found by running the command | 
 |                        "openssl x509 -hash -noout -in file.crt". Evidently | 
 |                        one uses <HASH>.1 if there is a collision... | 
 |  | 
 |                        The the key-management utility "-sslCertInfo HASHON" | 
 |                        and "-sslCertInfo HASHOFF" will create/delete these | 
 |                        hashes for you automatically (via symlink) in the HASH | 
 |                        subdirs it manages.  Then you can point -sslverify to | 
 |                        the HASH subdir. | 
 |  | 
 |                        Special tokens: in -ssl mode, if "path" is not a file or | 
 |                        a directory, it is taken as a comma separated list of | 
 |                        tokens that are interpreted as follows: | 
 |  | 
 |                        If a token is "CA" that means load the CA/cacert.pem | 
 |                        file from the ssl directory.  If a token is "clients" | 
 |                        then all the files clients/*.crt in the ssl directory | 
 |                        are loaded.  Otherwise the file clients/token.crt | 
 |                        is attempted to be loaded.  As a kludge, use a token | 
 |                        like ../server-foo to load a server cert if you find | 
 |                        that necessary. | 
 |  | 
 |                        Use -ssldir to use a directory different from the | 
 |                        ~/.vnc/certs default. | 
 |  | 
 |                        Note that if the "CA" cert is loaded you do not need | 
 |                        to load any of the certs that have been signed by it. | 
 |                        You will need to load any additional self-signed certs | 
 |                        however. | 
 |  | 
 |                        Examples: | 
 |                               x11vnc -ssl -sslverify CA | 
 |                               x11vnc -ssl -sslverify self:fred,self:jim | 
 |                               x11vnc -ssl -sslverify CA,clients | 
 |  | 
 |                        Usually "-sslverify CA" is the most effective. | 
 |                        See the -sslGenCA and -sslGenCert options below for | 
 |                        how to set up and manage the CA framework. | 
 |  | 
 |  | 
 |  | 
 |                        NOTE: the following utilities, -sslGenCA, -sslGenCert, | 
 |                        -sslEncKey, -sslCertInfo, and -sslCRL are provided for | 
 |                        completeness, but for casual usage they are overkill. | 
 |  | 
 |                        They provide VNC Certificate Authority (CA) key creation | 
 |                        and server / client key generation and signing.  So they | 
 |                        provide a basic Public Key management framework for | 
 |                        VNC-ing with x11vnc. (note that they require openssl(1) | 
 |                        be installed on the system) | 
 |  | 
 |                        However, the simplest usage mode, "-ssl TMP" (where | 
 |                        x11vnc automatically generates its own, self-signed, | 
 |                        temporary key and the VNC viewers always accept it, | 
 |                        e.g. accepting via a dialog box) is probably safe enough | 
 |                        for most scenarios.  CA management is not needed. | 
 |  | 
 |                        To protect against Man-In-The-Middle attacks the "TMP" | 
 |                        mode can be improved by using "-ssl SAVE" (same as | 
 |                        "-ssl", i.e. the default) to have x11vnc create a | 
 |                        longer term self-signed certificate, and then (safely) | 
 |                        copy the corresponding public key cert to the desired | 
 |                        client machines (care must be taken the private key part | 
 |                        is not stolen; you will be prompted for a passphrase). | 
 |  | 
 |                        So keep in mind no CA key creation or management | 
 |                        (-sslGenCA and -sslGenCert) is needed for either of | 
 |                        the above two common usage modes. | 
 |  | 
 |                        One might want to use -sslGenCA and -sslGenCert | 
 |                        if you had a large number of VNC client and server | 
 |                        workstations.  That way the administrator could generate | 
 |                        a single CA key with -sslGenCA and distribute its | 
 |                        certificate part to all of the workstations. | 
 |  | 
 |                        Next, he could create signed VNC server keys | 
 |                        (-sslGenCert server ...) for each workstation or user | 
 |                        that then x11vnc would use to authenticate itself to | 
 |                        any VNC client that has the CA cert. | 
 |  | 
 |                        Optionally, the admin could also make it so the | 
 |                        VNC clients themselves are authenticated to x11vnc | 
 |                        (-sslGenCert client ...)  For this -sslverify would be | 
 |                        pointed to the CA cert (and/or self-signed certs). | 
 |  | 
 |                        x11vnc will be able to use all of these cert and | 
 |                        key files.  On the VNC client side, they will need to | 
 |                        be "imported" somehow.  Web browsers have "Manage | 
 |                        Certificates" actions as does the Java applet plugin | 
 |                        Control Panel.  stunnel can also use these files (see | 
 |                        the ss_vncviewer example script in the FAQ and SSVNC.) | 
 |  | 
 | -sslCRL path           Set the Certificate Revocation Lists (CRL) to "path". | 
 |                        This setting applies for both -ssl and -stunnel modes. | 
 |  | 
 |                        If path is a file, the file contains one or more CRLs | 
 |                        in PEM format.  If path is a directory, it contains | 
 |                        hash named files of CRLs in the usual OpenSSL manner. | 
 |                        See the OpenSSL and stunnel(8) documentation for | 
 |                        more info. | 
 |  | 
 |                        This option only applies if -sslverify has been | 
 |                        supplied: it checks for revocation along the | 
 |                        certificate chain used to verify the VNC client. | 
 |                        The -sslCRL setting will be ignored when -sslverify is | 
 |                        not specified. | 
 |  | 
 |                        Note that if a CRL's expiration date has passed, all | 
 |                        SSL connections will fail regardless of if they are | 
 |                        related to the subject of the CRL or not. | 
 |  | 
 |                        Only rarely will one's x11vnc -ssl infrastructure be so | 
 |                        large that this option would be useful (since normally | 
 |                        maintaining the contents of the -sslverify file or | 
 |                        directory should be enough.)  However, when using | 
 |                        x11vnc with a Certificate Authority (see -sslGenCA) | 
 |                        to authenticate Clients via SSL/TLS, the -sslCRL option | 
 |                        can be useful to revoke users' certs whose private SSL | 
 |                        keys were lost or stolen (e.g. laptop.)  This way a new | 
 |                        CA cert+key does not need to be created and new signed | 
 |                        client keys generated and distributed to all users. | 
 |  | 
 |                        To create a CRL file with revoked certificates the | 
 |                        commands 'openssl ca -revoke ...' and 'openssl ca | 
 |                        -gencrl ...' are useful.  (Run them in ~/.vnc/certs) | 
 |  | 
 | -sslGenCA [dir]        Generate your own Certificate Authority private key, | 
 |                        certificate, and other files in directory [dir]. | 
 |                        x11vnc then exits. | 
 |  | 
 |                        If [dir] is not supplied, a -ssldir setting is used, | 
 |                        or otherwise ~/.vnc/certs is used. | 
 |  | 
 |                        This command also creates directories where server and | 
 |                        client certs and keys will be stored.  The openssl(1) | 
 |                        program must be installed on the system and available | 
 |                        in PATH. | 
 |  | 
 |                        After the CA files and directories are created the | 
 |                        x11vnc command exits; the VNC server is not run. | 
 |  | 
 |                        You will be prompted for information to put into the CA | 
 |                        certificate.  The info does not have to be accurate just | 
 |                        as long as clients accept the cert for VNC connections. | 
 |                        You will also need to supply a passphrase of at least | 
 |                        4 characters for the CA private key. | 
 |  | 
 |                        Once you have generated the CA you can distribute | 
 |                        its certificate part, [dir]/CA/cacert.pem, to other | 
 |                        workstations where VNC viewers will be run.  One will | 
 |                        need to "import" this certificate in the applications, | 
 |                        e.g. Web browser, Java applet plugin, stunnel, etc. | 
 |                        Next, you can create and sign keys using the CA with | 
 |                        the -sslGenCert option below. | 
 |  | 
 |                        Examples: | 
 |                                 x11vnc -sslGenCA | 
 |                                 x11vnc -sslGenCA  ~/myCAdir | 
 |                                 x11vnc -ssldir ~/myCAdir -sslGenCA | 
 |  | 
 |                        (the last two lines are equivalent) | 
 |  | 
 | -sslGenCert type name  Generate a VNC server or client certificate and private | 
 |                        key pair signed by the CA created previously with | 
 |                        -sslGenCA.  The openssl(1) program must be installed | 
 |                        on the system and available in PATH. | 
 |  | 
 |                        After the Certificate is generated x11vnc exits; the | 
 |                        VNC server is not run. | 
 |  | 
 |                        The type of key to be generated is the string "type". | 
 |                        It is either "server" (i.e. for use by x11vnc) or | 
 |                        "client" (for a VNC viewer).  Note that typically | 
 |                        only "server" is used: the VNC clients authenticate | 
 |                        themselves by a non-public-key method (e.g. VNC or | 
 |                        unix password).  "type" is required. | 
 |  | 
 |                        An arbitrary default name you want to associate with | 
 |                        the key is supplied by the "name" string.  You can | 
 |                        change it at the various prompts when creating the key. | 
 |                        "name" is optional. | 
 |  | 
 |                        If name is left blank for clients keys then "nobody" | 
 |                        is used.  If left blank for server keys, then the | 
 |                        primary server key: "server.pem" is created (this | 
 |                        is the saved one referenced by "-ssl SAVE" when the | 
 |                        server is started) | 
 |  | 
 |                        If "name" begins with the string "self:" then | 
 |                        a self-signed certificate is created instead of one | 
 |                        signed by your CA key. | 
 |  | 
 |                        If "name" begins with the string "req:" then only a | 
 |                        key (.key) and a certificate signing *request* (.req) | 
 |                        are generated.  You can then send the .req file to | 
 |                        an external CA (even a professional one, e.g. Thawte) | 
 |                        and then combine the .key and the received cert into | 
 |                        the .pem file with the same basename. | 
 |  | 
 |                        The distinction between "server" and "client" is | 
 |                        simply the choice of output filenames and sub-directory. | 
 |                        This makes it so the -ssl SAVE-name option can easily | 
 |                        pick up the x11vnc PEM file this option generates. | 
 |                        And similarly makes it easy for the -sslverify option | 
 |                        to pick up your client certs. | 
 |  | 
 |                        There is nothing special about the filename or directory | 
 |                        location of either the "server" and "client" certs. | 
 |                        You can rename the files or move them to wherever | 
 |                        you like. | 
 |  | 
 |                        Precede this option with -ssldir [dir] to use a | 
 |                        directory other than the default ~/.vnc/certs You will | 
 |                        need to run -sslGenCA on that directory first before | 
 |                        doing any -sslGenCert key creation. | 
 |  | 
 |                        Note you cannot recreate a cert with exactly the same | 
 |                        distiguished name (DN) as an existing one.  To do so, | 
 |                        you will need to edit the [dir]/CA/index.txt file to | 
 |                        delete the line. | 
 |  | 
 |                        Similar to -sslGenCA, you will be prompted to fill | 
 |                        in some information that will be recorded in the | 
 |                        certificate when it is created. | 
 |  | 
 |                        Tip: if you know the fully-qualified hostname other | 
 |                        people will be connecting to, you can use that as the | 
 |                        CommonName "CN" to avoid some applications (e.g. web | 
 |                        browsers and java plugin) complaining that it does not | 
 |                        match the hostname. | 
 |  | 
 |                        You will also need to supply the CA private key | 
 |                        passphrase to unlock the private key created from | 
 |                        -sslGenCA.  This private key is used to sign the server | 
 |                        or client certificate. | 
 |  | 
 |                        The "server" certs can be used by x11vnc directly by | 
 |                        pointing to them via the -ssl [pem] option.  The default | 
 |                        file will be ~/.vnc/certs/server.pem.  This one would | 
 |                        be used by simply typing -ssl SAVE.  The pem file | 
 |                        contains both the certificate and the private key. | 
 |                        server.crt file contains the cert only. | 
 |  | 
 |                        The "client" cert + private key file will need | 
 |                        to be copied and imported into the VNC viewer | 
 |                        side applications (Web browser, Java plugin, | 
 |                        stunnel, etc.)  Once that is done you can delete the | 
 |                        "client" private key file on this machine since | 
 |                        it is only needed on the VNC viewer side.  The, | 
 |                        e.g. ~/.vnc/certs/clients/<name>.pem contains both | 
 |                        the cert and private key.  The <name>.crt contains the | 
 |                        certificate only. | 
 |  | 
 |                        NOTE: It is very important to know one should | 
 |                        generate new keys with a passphrase.  Otherwise if an | 
 |                        untrusted user steals the key file he could use it to | 
 |                        masquerade as the x11vnc server (or VNC viewer client). | 
 |                        You will be prompted whether to encrypt the key with | 
 |                        a passphrase or not.  It is recommended that you do. | 
 |                        One inconvenience to a passphrase is that it must | 
 |                        be typed in EVERY time x11vnc or the client app is | 
 |                        started up. | 
 |  | 
 |                        Examples: | 
 |  | 
 |                                x11vnc -sslGenCert server | 
 |                                x11vnc -ssl SAVE -display :0 ... | 
 |  | 
 |                        and then on viewer using ss_vncviewer stunnel wrapper | 
 |                        (see the FAQ): | 
 |                                ss_vncviewer -verify ./cacert.crt hostname:0 | 
 |  | 
 |                        (this assumes the cacert.crt cert from -sslGenCA | 
 |                        was safely copied to the VNC viewer machine where | 
 |                        ss_vncviewer is run) | 
 |  | 
 |                        Example using a name: | 
 |  | 
 |                                x11vnc -sslGenCert server charlie | 
 |                                x11vnc -ssl SAVE-charlie -display :0 ... | 
 |  | 
 |                        Example for a client certificate (rarely used): | 
 |  | 
 |                                x11vnc -sslGenCert client roger | 
 |                                scp ~/.vnc/certs/clients/roger.pem somehost:. | 
 |                                rm  ~/.vnc/certs/clients/roger.pem | 
 |  | 
 |                        x11vnc is then started with the option -sslverify | 
 |                        ~/.vnc/certs/clients/roger.crt (or simply -sslverify | 
 |                        roger), and on the viewer user on somehost could do | 
 |                        for example: | 
 |  | 
 |                                ss_vncviewer -mycert ./roger.pem hostname:0 | 
 |  | 
 |                        If you set the env. var REQ_ARGS='...' it will be | 
 |                        passed to openssl req(1).  A common use would be | 
 |                        REQ_ARGS='-days 1095' to bump up the expiration date | 
 |                        (3 years in this case). | 
 |  | 
 | -sslEncKey pem         Utility to encrypt an existing PEM file with a | 
 |                        passphrase you supply when prompted.  For that key to be | 
 |                        used (e.g. by x11vnc) the passphrase must be supplied | 
 |                        each time. | 
 |  | 
 |                        The "SAVE" notation described under -ssl applies as | 
 |                        well. (precede this option with -ssldir [dir] to refer | 
 |                        a directory besides the default ~/.vnc/certs) | 
 |  | 
 |                        The openssl(1) program must be installed on the system | 
 |                        and available in PATH.  After the Key file is encrypted | 
 |                        the x11vnc command exits; the VNC server is not run. | 
 |  | 
 |                        Examples: | 
 |                                x11vnc -sslEncKey /path/to/foo.pem | 
 |                                x11vnc -sslEncKey SAVE | 
 |                                x11vnc -sslEncKey SAVE-charlie | 
 |  | 
 | -sslCertInfo pem       Prints out information about an existing PEM file. | 
 |                        In addition the public certificate is also printed. | 
 |                        The openssl(1) program must be in PATH. Basically the | 
 |                        command "openssl x509 -text" is run on the pem. | 
 |  | 
 |                        After the info is printed the x11vnc command exits; | 
 |                        the VNC server is not run. | 
 |  | 
 |                        The "SAVE" notation described under -ssl applies | 
 |                        as well. | 
 |  | 
 |                        Using  "LIST" will give a list of all certs being | 
 |                        managed (in the ~/.vnc/certs dir, use -ssldir to refer | 
 |                        to another dir).  "ALL" will print out the info for | 
 |                        every managed key (this can be very long).  Giving a | 
 |                        client or server cert shortname will also try a lookup | 
 |                        (e.g. -sslCertInfo charlie).  Use "LISTL" or "LL" | 
 |                        for a long (ls -l style) listing. | 
 |  | 
 |                        Using "HASHON" will create subdirs [dir]/HASH and | 
 |                        [dir]/HASH with OpenSSL hash filenames (e.g. 0d5fbbf1.0) | 
 |                        symlinks pointing up to the corresponding *.crt file. | 
 |                        ([dir] is ~/.vnc/certs or one given by -ssldir.) | 
 |                        This is a useful way for other OpenSSL applications | 
 |                        (e.g. stunnel) to access all of the certs without | 
 |                        having to concatenate them.  x11vnc will not use them | 
 |                        unless you specifically reference them.  "HASHOFF" | 
 |                        removes these HASH subdirs. | 
 |  | 
 |                        The LIST, LISTL, LL, ALL, HASHON, HASHOFF words can | 
 |                        also be lowercase, e.g. "list". | 
 |  | 
 | -sslDelCert pem        Prompts you to delete all .crt .pem .key .req files | 
 |                        associated with [pem].  x11vnc then exits. "SAVE" | 
 |                        and lookups as in -sslCertInfo apply as well. | 
 |  | 
 | -sslScripts            Prints out both the 'genCA' and 'genCert' x11vnc | 
 |                        openssl wrapper scripts for you to examine, modify, etc. | 
 |                        The scripts are printed to stdout and then the x11vnc | 
 |                        program exits. | 
 |  | 
 |  | 
 | -stunnel [pem]         Use the stunnel(8) (stunnel.mirt.net) to provide an | 
 |                        encrypted SSL tunnel between viewers and x11vnc. | 
 |  | 
 |                        This external tunnel method was implemented prior to the | 
 |                        integrated -ssl encryption described above.  It still | 
 |                        works well and avoids the requirement of linking with | 
 |                        the OpenSSL libraries.  This mode requires stunnel | 
 |                        to be installed on the system and available via PATH | 
 |                        (n.b. stunnel is often installed in sbin directories). | 
 |                        Version 4.x of stunnel is assumed (but see -stunnel3 | 
 |                        below.) | 
 |  | 
 |                        [pem] is optional, use "-stunnel /path/to/stunnel.pem" | 
 |                        to specify a PEM certificate file to pass to stunnel. | 
 |                        See the -ssl option for more info on certificate files. | 
 |  | 
 |                        Whether or not your stunnel has its own certificate | 
 |                        depends on your stunnel configuration; stunnel often | 
 |                        generates one at install time.  See your stunnel | 
 |                        documentation for details.  In any event, if you want to | 
 |                        use this certificate you must supply the full path to it | 
 |                        as [pem].  Note: the file may only be readable by root. | 
 |  | 
 |                        [pem] may also be the special strings "TMP", "SAVE", | 
 |                        and "SAVE..." as described in the -ssl option. | 
 |                        If [pem] is not supplied, "SAVE" is assumed. | 
 |  | 
 |                        Note that the VeNCrypt, ANONTLS, and "ANON" modes | 
 |                        are not supported in -stunnel mode. | 
 |  | 
 |                        stunnel is started up as a child process of x11vnc and | 
 |                        any SSL connections stunnel receives are decrypted and | 
 |                        sent to x11vnc over a local socket.  The strings | 
 |                        "The SSL VNC desktop is ..." and "SSLPORT=..." | 
 |                        are printed out at startup to indicate this. | 
 |  | 
 |                        The -localhost option is enforced by default to avoid | 
 |                        people routing around the SSL channel.  Use -env | 
 |                        STUNNEL_DISABLE_LOCALHOST=1 to disable this security | 
 |                        requirement. | 
 |  | 
 |                        Set -env STUNNEL_DEBUG=1 for more debugging printout. | 
 |  | 
 |                        Set -env STUNNEL_PROG=xxx to the full path of stunnel | 
 |                        program you want to be used (e.g. /usr/bin/stunnel4). | 
 |  | 
 |                        Set -env STUNNEL_LISTEN=xxx to the address of the | 
 |                        network interface to listen on (the default is to listen | 
 |                        on all interfaces), e.g. STUNNEL_LISTEN=192.168.1.100. | 
 |  | 
 |                        A simple way to add IPv6 support is STUNNEL_LISTEN=:: | 
 |  | 
 |                        Your VNC viewer will also need to be able to connect | 
 |                        via SSL.  Unfortunately not too many do this.  See the | 
 |                        information about SSL viewers under the -ssl option. | 
 |                        The x11vnc project's SSVNC is an option. | 
 |  | 
 |                        Also, in the x11vnc distribution, patched TightVNC | 
 |                        and UltraVNC Java applet jar files are provided in | 
 |                        the classes/ssl directory that do SSL connections. | 
 |                        Enable serving them with the -http, -http_ssl, or | 
 |                        -httpdir (see the option descriptions for more info.) | 
 |  | 
 |                        Note that for the Java viewer applet usage the | 
 |                        "?PORT=xxxx" in the various URLs printed at startup | 
 |                        will need to be supplied to the web browser to connect | 
 |                        properly. | 
 |  | 
 |                        Currently the automatic "single port" HTTPS mode of | 
 |                        -ssl is not fully supported in -stunnel mode.  However, | 
 |                        it can be emulated via: | 
 |  | 
 |                          % x11vnc -stunnel -http_ssl -http_oneport ... | 
 |  | 
 |                        In general, it is also not too difficult to set up | 
 |                        an stunnel or other SSL tunnel on the viewer side. | 
 |                        A simple example on Unix using stunnel 3.x is: | 
 |  | 
 |                          % stunnel -c -d localhost:5901 -r remotehost:5900 | 
 |                          % vncviewer localhost:1 | 
 |  | 
 |                        For Windows, stunnel has been ported to it and there | 
 |                        are probably other such tools available.  See the FAQ | 
 |                        and SSVNC for more examples. | 
 |  | 
 | -stunnel3  [pem]       Use version 3.x stunnel command line syntax instead of | 
 |                        version 4.x.  The -http/-httpdir Java applet serving | 
 |                        is currently not available in this mode. | 
 |  | 
 | -enc cipher:keyfile    Use symmetric encryption with cipher "cipher" | 
 |                        and secret key data in "keyfile".  If keyfile is | 
 |                        pw=<string> then "string" is used as the key data. | 
 |  | 
 |                        NOTE: It is recommended that you use SSL via the -ssl | 
 |                        option instead of this option because SSL is well | 
 |                        understood and takes great care to establish unique | 
 |                        session keys and is more compatible with other software. | 
 |                        Use this option if you do not want to deal with SSL | 
 |                        certificates for authentication and do not want to | 
 |                        use SSH but want some encryption for your VNC session. | 
 |                        Or if you must interface with a symmetric key tunnel | 
 |                        that you do not have control over. | 
 |  | 
 |                        Note that this mode will NOT work with the UltraVNC DSM | 
 |                        plugins because they alter the RFB protocol in addition | 
 |                        to tunnelling with the symmetric cipher (an unfortunate | 
 |                        choice of implementation...) | 
 |  | 
 |                        cipher can be one of:  arc4, aesv2, aes-cfb, blowfish, | 
 |                        aes256, or 3des.  See the OpenSSL documentation for | 
 |                        more info.  The keysize is 128 bits (except for aes256). | 
 |                        Here is one way to make a keyfile with that many bits: | 
 |  | 
 |                             dd if=/dev/random of=./my.key bs=16 count=1 | 
 |  | 
 |                        you will need to securely share this key with the other | 
 |                        side of the VNC connection (See SSVNC for examples). | 
 |  | 
 |                        Example:  -enc blowfish:./my.key | 
 |                        Example:  -enc blowfish:pw=swordfish | 
 |  | 
 |                        By default 16 bytes of random salt followed by 16 bytes | 
 |                        of random initialization vector are sent at the very | 
 |                        beginning of the stream.  The other side must read these | 
 |                        and initialize their cipher with them.  These values | 
 |                        make the session key unique (without them the security | 
 |                        is minimal).  Similarly, the other side must send us | 
 |                        its random salt and IV with those same lengths. | 
 |  | 
 |                        The salt and key data are combined to create a session | 
 |                        key using an md5 hash as described in EVP_BytesToKey(3). | 
 |  | 
 |                        The exact call is: EVP_BytesToKey(Cipher, EVP_md5(), | 
 |                        salt, keydata, len, 1, keystr, NULL);  where salt is | 
 |                        the random data as described above, and keydata is the | 
 |                        shared secret key data.  keystr is the resulting session | 
 |                        key.  The cipher is then seeded with keystr and uses | 
 |                        the random initialization vector as its first block. | 
 |  | 
 |                        To modify the amount of random salt and initialization | 
 |                        vector use cipher@n,m where n is the salt length and | 
 |                        m the initialization vector length.  E.g. | 
 |  | 
 |                                  -enc aes-cfb@8,16:./my.key | 
 |  | 
 |                        It is not a good idea to set either one to zero, | 
 |                        although you may be forced to if the other side of the | 
 |                        tunnel is not under your control. | 
 |  | 
 |                        To skip the salt and EVP_BytesToKey MD5 entirely (no | 
 |                        hashing is done: the keydata is directly inserted into | 
 |                        the cipher) specify "-1" for the salt, e.g. | 
 |  | 
 |                                  -enc blowfish@-1,16:./my.key | 
 |  | 
 |                        The message digest can also be changed to something | 
 |                        besides the default MD5.  Use cipher@md+n,m where "md" | 
 |                        can be one of sha, sha1, md5, or ripe.  For example: | 
 |  | 
 |                                  -enc arc4@sha+8,16:./my.key | 
 |  | 
 |                        The SSVNC vnc viewer project supplies a symmetric | 
 |                        encryption tool named "ultravnc_dsm_helper" that can | 
 |                        be used on the viewer side.  For example: | 
 |  | 
 |                        ssvncviewer exec='ultravnc_dsm_helper arc4 my.key 0 h:p' | 
 |  | 
 |                        where h:p is the hostname and port of the x11vnc server. | 
 |                        ultravnc_dsm_helper may also be used standalone to | 
 |                        provide a symmetric encryption tunnel for any viewer | 
 |                        or server (VNC or otherwise.) The cipher (1st arg) | 
 |                        is basically the same syntax as we use above. | 
 |  | 
 |                        Also see the 'Non-Ultra DSM' SSVNC option for the | 
 |                        'UltraVNC DSM Encryption Plugin' advanced option. | 
 |  | 
 |                        For both ways of using the viewer, you can specify the | 
 |                        salt,ivec sizes (in GUI or, e.g. arc4@8,16). | 
 |  | 
 | -https [port]          Use a special, separate HTTPS port (-ssl and | 
 |                        -stunnel modes only) for HTTPS Java viewer applet | 
 |                        downloading. I.e. not 5900 and not 5800 (the defaults.) | 
 |  | 
 |                        BACKGROUND: In -ssl mode, it turns out you can use the | 
 |                        single VNC port (e.g. 5900) for both VNC and HTTPS | 
 |                        connections. (HTTPS is used to retrieve a SSL-aware | 
 |                        VncViewer.jar applet that is provided with x11vnc). | 
 |                        Since both use SSL the implementation was extended to | 
 |                        detect if HTTP traffic (i.e. GET) is taking place and | 
 |                        handle it accordingly.  The URL would be, e.g.: | 
 |  | 
 |                        https://mymachine.org:5900/ | 
 |  | 
 |                        This is convenient for firewalls, etc, because only one | 
 |                        port needs to be allowed in.  However, this heuristic | 
 |                        adds a few seconds delay to each connection and can be | 
 |                        unreliable (especially if the user takes much time to | 
 |                        ponder the Certificate dialogs in his browser, Java VM, | 
 |                        or VNC Viewer applet.  That's right 3 separate "Are | 
 |                        you sure you want to connect?" dialogs!) | 
 |  | 
 |                        END OF BACKGROUND. | 
 |  | 
 |                        USAGE: So use the -https option to provide a separate, | 
 |                        more reliable HTTPS port that x11vnc will listen on.  If | 
 |                        [port] is not provided (or is 0), one is autoselected. | 
 |                        The URL to use is printed out at startup. | 
 |  | 
 |                        The SSL Java applet directory is specified via the | 
 |                        -httpdir option.  If not supplied, -https will try | 
 |                        to guess the directory as though the -http option | 
 |                        was supplied. | 
 |  | 
 | -httpsredir [port]     In -ssl mode with the Java applet retrieved via HTTPS, | 
 |                        when the HTML file containing applet parameters | 
 |                        ('index.vnc' or 'proxy.vnc') is sent do NOT set the | 
 |                        applet PORT parameter to the actual VNC port but set it | 
 |                        to "port" instead.  If "port" is not supplied, then | 
 |                        the port number is guessed from the Host: HTTP header. | 
 |  | 
 |                        This is useful when an incoming TCP connection | 
 |                        redirection is performed by a router/gateway/firewall | 
 |                        from one port to an internal machine where x11vnc is | 
 |                        listening on a different port. The Java applet needs to | 
 |                        connect to the firewall/router port, not the VNC port | 
 |                        on the internal workstation. For example, one could | 
 |                        redir from mygateway.com:443 to workstation:5900. | 
 |  | 
 |                        This spares the user from having to type in | 
 |                        https://mygateway.com/?PORT=443 into their web | 
 |                        browser. Note that port 443 is the default https port; | 
 |                        other ports must be explicitly indicated, for example: | 
 |                        https://mygateway.com:8000/?PORT=8000.  To avoid having | 
 |                        to include the PORT= in the browser URL, simply supply | 
 |                        "-httpsredir" to x11vnc. | 
 |  | 
 |                        This option does not work in -stunnel mode. | 
 |  | 
 |                        More tricks: set the env var X11VNC_EXTRA_HTTPS_PARAMS | 
 |                        to be extra URL parameters to use.  This way you do | 
 |                        not need to specify extra PARAMS in the index.vnc file. | 
 |                        E.g. x11vnc -env X11VNC_EXTRA_HTTPS_PARAMS='?GET=1' ... | 
 |  | 
 |                        If you do not want to expose the non-SSL HTTP port to | 
 |                        the network (i.e. you just want the single VNC/HTTPS | 
 |                        port, e.g. 5900, open for connections) then specify the | 
 |                        option -env X11VNC_HTTP_LISTEN_LOCALHOST=1  This way | 
 |                        the connection to the LibVNCServer httpd server will | 
 |                        only be available on localhost (note that in -ssl mode, | 
 |                        HTTPS requests are redirected from SSL to the non-SSL | 
 |                        LibVNCServer HTTP server.) | 
 |  | 
 | -http_oneport          For UN-encrypted connections mode (i.e. no -ssl, | 
 |                        -stunnel, or -enc options), allow the Java VNC Viewer | 
 |                        applet to be downloaded thru the VNC port via HTTP. | 
 |  | 
 |                        That is to say, you can use a single port for Java | 
 |                        applet viewer connections by using a URL in your web | 
 |                        browser like this, for example: | 
 |  | 
 |                        http://hostname:5900 | 
 |  | 
 |                        The regular, two-port mode, URL http://hostname:5800 | 
 |                        will continue to work as well. | 
 |  | 
 |                        As mentioned above, this mode will NOT work with | 
 |                        the -ssl, -stunnel, or -enc encryption options. | 
 |                        Note that is it equivalent to '-enc none' (i.e. it | 
 |                        uses the same detection mechanism as for HTTPS, but | 
 |                        with no encryption.) | 
 |  | 
 |                        HTTPS single-port is on by default in -ssl encrypted | 
 |                        mode (and -enc too), so you only need -http_oneport | 
 |                        when doing non-SSL encrypted connections. | 
 |  | 
 |                        This mode could also be useful for SSH tunnels since | 
 |                        it means only one port needs to be redirected. | 
 |  | 
 |                        The -httpsredir option may also be useful for this | 
 |                        mode when using an SSH tunnel as well as for router | 
 |                        port redirections. | 
 |  | 
 |                        Note that the -env X11VNC_HTTP_LISTEN_LOCALHOST=1 | 
 |                        option described above under -httpsredir applies for | 
 |                        the LibVNCServer httpd server in all cases (ssl or not.) | 
 |  | 
 | -ssh user@host:disp    Create a remote listening port on machine "host" | 
 |                        via a SSH tunnel using the -R rport:localhost:lport | 
 |                        method. lport will be the local x11vnc listening port, | 
 |                        so a connection to rport (5900+disp) on "host" | 
 |                        will reach x11vnc.  E.g. [email protected]:0 | 
 |  | 
 |                        This could be useful if a firewall/router prevents | 
 |                        incoming connections to the x11vnc machine, but | 
 |                        the ssh machine "host" can be reached by the VNC | 
 |                        viewer. "user@" is not needed unless the remote unix | 
 |                        username differs from the current one. | 
 |  | 
 |                        By default the remote sshd is usually configured to | 
 |                        listen only on localhost for rport, so the viewer may | 
 |                        need to ssh -L redir to "host" as well (See SSVNC to | 
 |                        automate this).  The sshd setting GatewayPorts enables | 
 |                        listening on all interfaces for rport; viewers can | 
 |                        reach it more easily. | 
 |  | 
 |                        "disp" is the VNC display for the remote SSH side, | 
 |                        e.g. 0 corresponds to port 5900, etc.  If disp is | 
 |                        greater than 200 the value is used as the port.  Use a | 
 |                        negative value to force a low port, e.g. host:-80 will | 
 |                        use port 80. | 
 |  | 
 |                        If ssh-agent is not active, then the ssh password needs | 
 |                        to be entered in the terminal where x11vnc is running. | 
 |  | 
 |                        By default the remote ssh will issue a 'sleep 300' to | 
 |                        wait for the incoming connection for 5 mins.  To modify | 
 |                        this use user@host:disp+secs. | 
 |  | 
 |                        If the remote SSH server is on a non-standard port | 
 |                        (i.e. not 22) use user@host:port:disp+secs. | 
 |  | 
 |                        Note that the ssh process MAY NOT be killed when | 
 |                        x11vnc exits.  It tries by looking at ps(1) output. | 
 |  | 
 | -usepw                 If no other password method was supplied on the command | 
 |                        line, first look for ~/.vnc/passwd and if found use it | 
 |                        with -rfbauth; next, look for ~/.vnc/passwdfile and | 
 |                        use it with -passwdfile; otherwise, prompt the user | 
 |                        for a password to create ~/.vnc/passwd and use it with | 
 |                        the -rfbauth option.  If none of these succeed x11vnc | 
 |                        exits immediately. | 
 |  | 
 | -storepasswd pass file Store password "pass" as the VNC password in the | 
 |                        file "file".  Once the password is stored the | 
 |                        program exits.  Use the password via "-rfbauth file" | 
 |  | 
 |                        If called with no arguments, "x11vnc -storepasswd", | 
 |                        the user is prompted for a password and it is stored | 
 |                        in the file ~/.vnc/passwd.  Called with one argument, | 
 |                        that will be the file to store the prompted password in. | 
 |  | 
 | -nopw                  Disable the big warning message when you use x11vnc | 
 |                        without some sort of password. | 
 |  | 
 | -accept string         Run a command (possibly to prompt the user at the | 
 |                        X11 display) to decide whether an incoming client | 
 |                        should be allowed to connect or not.  "string" is | 
 |                        an external command run via system(3) or some special | 
 |                        cases described below.  Be sure to quote "string" | 
 |                        if it contains spaces, shell characters, etc.  If the | 
 |                        external command returns 0 the client is accepted, | 
 |                        otherwise the client is rejected.  See below for an | 
 |                        extension to accept a client view-only. | 
 |  | 
 |                        If x11vnc is running as root (say from inetd(8) or from | 
 |                        display managers xdm(1), gdm(1), etc), think about the | 
 |                        security implications carefully before supplying this | 
 |                        option (likewise for the -gone option). | 
 |  | 
 |                        Environment: The RFB_CLIENT_IP environment variable will | 
 |                        be set to the incoming client IP number and the port | 
 |                        in RFB_CLIENT_PORT (or -1 if unavailable).  Similarly, | 
 |                        RFB_SERVER_IP and RFB_SERVER_PORT (the x11vnc side | 
 |                        of the connection), are set to allow identification | 
 |                        of the tcp virtual circuit.  The x11vnc process | 
 |                        id will be in RFB_X11VNC_PID, a client id number in | 
 |                        RFB_CLIENT_ID, and the number of other connected clients | 
 |                        in RFB_CLIENT_COUNT.  RFB_MODE will be "accept". | 
 |                        RFB_STATE will be PROTOCOL_VERSION, SECURITY_TYPE, | 
 |                        AUTHENTICATION, INITIALISATION, NORMAL, or UNKNOWN | 
 |                        indicating up to which state the client has achieved. | 
 |                        RFB_LOGIN_VIEWONLY will be 0, 1, or -1 (unknown). | 
 |                        RFB_USERNAME, RFB_LOGIN_TIME, and RFB_CURRENT_TIME may | 
 |                        also be set. | 
 |  | 
 |                        If "string" is "popup" then a builtin popup window | 
 |                        is used.  The popup will time out after 120 seconds, | 
 |                        use "popup:N" to modify the timeout to N seconds | 
 |                        (use 0 for no timeout). | 
 |  | 
 |                        In the case of "popup" and when the -unixpw option | 
 |                        is specified, then a *second* window will be popped | 
 |                        up after the user successfully logs in via his UNIX | 
 |                        password.  This time the user will be identified as | 
 |                        UNIX:username@hostname, the "UNIX:" prefix indicates | 
 |                        which user the viewer logged as via -unixpw.  The first | 
 |                        popup is only for whether to allow him to even *try* | 
 |                        to login via unix password. | 
 |  | 
 |                        If "string" is "xmessage" then an xmessage(1) | 
 |                        invocation is used for the command.  xmessage must be | 
 |                        installed on the machine for this to work. | 
 |  | 
 |                        Both "popup" and "xmessage" will present an option | 
 |                        for accepting the client "View-Only" (the client | 
 |                        can only watch).  This option will not be presented if | 
 |                        -viewonly has been specified, in which case the entire | 
 |                        display is view only. | 
 |  | 
 |                        If the user supplied command is prefixed with something | 
 |                        like "yes:0,no:*,view:3 mycommand ..." then this | 
 |                        associates the numerical command return code with | 
 |                        the actions: accept, reject, and accept-view-only, | 
 |                        respectively.  Use "*" instead of a number to indicate | 
 |                        the default action (in case the command returns an | 
 |                        unexpected value).  E.g. "no:*" is a good choice. | 
 |  | 
 |                        Note that x11vnc blocks while the external command | 
 |                        or popup is running (other clients may see no updates | 
 |                        during this period).  So a person sitting a the physical | 
 |                        display is needed to respond to an popup prompt. (use | 
 |                        a 2nd x11vnc if you lock yourself out). | 
 |  | 
 |                        More -accept tricks: use "popupmouse" to only allow | 
 |                        mouse clicks in the builtin popup to be recognized. | 
 |                        Similarly use "popupkey" to only recognize | 
 |                        keystroke responses.  These are to help avoid the | 
 |                        user accidentally accepting a client by typing or | 
 |                        clicking. All 3 of the popup keywords can be followed | 
 |                        by +N+M to supply a position for the popup window. | 
 |                        The default is to center the popup window. | 
 | -afteraccept string    As -accept, except to run a user supplied command after | 
 |                        a client has been accepted and authenticated. RFB_MODE | 
 |                        will be set to "afteraccept" and the other RFB_* | 
 |                        variables are as in -accept.  Unlike -accept, the | 
 |                        command return code is not interpreted by x11vnc. | 
 |                        Example: -afteraccept 'killall xlock &' | 
 | -gone string           As -accept, except to run a user supplied command when | 
 |                        a client goes away (disconnects).  RFB_MODE will be | 
 |                        set to "gone" and the other RFB_* variables are as | 
 |                        in -accept.  The "popup" actions apply as well. | 
 |                        Unlike -accept, the command return code is not | 
 |                        interpreted by x11vnc.  Example: -gone 'xlock &' | 
 |  | 
 | -users list            If x11vnc is started as root (say from inetd(8) or from | 
 |                        display managers xdm(1), gdm(1), etc), then as soon | 
 |                        as possible after connections to the X display are | 
 |                        established try to switch to one of the users in the | 
 |                        comma separated "list".  If x11vnc is not running as | 
 |                        root this option is ignored. | 
 |  | 
 |                        Why use this option?  In general it is not needed since | 
 |                        x11vnc is already connected to the X display and can | 
 |                        perform its primary functions.  The option was added | 
 |                        to make some of the *external* utility commands x11vnc | 
 |                        occasionally runs work properly.  In particular under | 
 |                        GNOME and KDE to implement the "-solid color" feature | 
 |                        external commands (gconftool-2 and dcop) unfortunately | 
 |                        must be run as the user owning the desktop session. | 
 |                        Since this option switches userid it also affects the | 
 |                        userid used to run the processes for the -accept and | 
 |                        -gone options.  It also affects the ability to read | 
 |                        files for options such as -connect, -allow, and -remap | 
 |                        and also the ultra and tight filetransfer feature if | 
 |                        enabled.  Note that the -connect file is also sometimes | 
 |                        written to. | 
 |  | 
 |                        So be careful with this option since in some situations | 
 |                        its use can decrease security. | 
 |  | 
 |                        In general the switch to a user will only take place | 
 |                        if the display can still be successfully opened as that | 
 |                        user (this is primarily to try to guess the actual owner | 
 |                        of the session). Example: "-users fred,wilma,betty". | 
 |                        Note that a malicious local user "barney" by | 
 |                        quickly using "xhost +" when logging in may possibly | 
 |                        get the x11vnc process to switch to user "fred". | 
 |                        What happens next? | 
 |  | 
 |                        Under display managers it may be a long time before | 
 |                        the switch succeeds (i.e. a user logs in).  To instead | 
 |                        make it switch immediately regardless if the display | 
 |                        can be reopened prefix the username with the "+" | 
 |                        character. E.g. "-users +bob" or "-users +nobody". | 
 |  | 
 |                        The latter (i.e. switching immediately to user | 
 |                        "nobody") is the only obvious use of the -users option | 
 |                        that increases security. | 
 |  | 
 |                        Use the following notation to associate a group with | 
 |                        a user: user1.group1,user2.group2,...  Note that | 
 |                        initgroups(2) will still be called first to try to | 
 |                        switch to ALL of a user's groups (primary and additional | 
 |                        groups).  Only if that fails or it is not available | 
 |                        then the single group specified as above (or the user's | 
 |                        primary group if not specified) is switched to with | 
 |                        setgid(2).  Use -env X11VNC_SINGLE_GROUP=1 to prevent | 
 |                        trying initgroups(2) and only switch to the single | 
 |                        group.  This sort of setting is only really needed to | 
 |                        make the ultra or tight filetransfer permissions work | 
 |                        properly. This format applies to any comma separated lis | 
 | t | 
 |                        of users, even the special "=" modes described below. | 
 |  | 
 |                        In -unixpw mode, if "-users unixpw=" is supplied | 
 |                        then after a user authenticates himself via the | 
 |                        -unixpw mechanism, x11vnc will try to switch to that | 
 |                        user as though "-users +username" had been supplied. | 
 |                        If you want to limit which users this will be done for, | 
 |                        provide them as a comma separated list after "unixpw=" | 
 |                        Groups can also be specified as described above. | 
 |  | 
 |                        Similarly, in -ssl mode, if "-users sslpeer=" is | 
 |                        supplied then after an SSL client authenticates with his | 
 |                        cert (the -sslverify option is required for this) x11vnc | 
 |                        will extract a UNIX username from the "emailAddress" | 
 |                        field ([email protected]) of the "Subject" of the | 
 |                        x509 SSL cert and then try to switch to that user as | 
 |                        though "-users +username" had been supplied.  If you | 
 |                        want to limit which users this will be done for, provide | 
 |                        them as a comma separated list after "sslpeer=". | 
 |                        Set the env. var X11VNC_SSLPEER_CN to use the Common | 
 |                        Name (normally a hostname) instead of the Email field. | 
 |  | 
 |                        NOTE: for sslpeer= mode the x11vnc administrator must | 
 |                        take care that any client certs he adds to -sslverify | 
 |                        have the intended UNIX username in the "emailAddress" | 
 |                        field of the cert.  Otherwise a user may be able to | 
 |                        log in as another.  This command can be of use in | 
 |                        checking: "openssl x509 -text -in file.crt", see the | 
 |                        "Subject:" line.  Also, along with the normal RFB_* | 
 |                        env. vars. (see -accept) passed to external cmd= | 
 |                        commands, RFB_SSL_CLIENT_CERT will be set to the | 
 |                        client's x509 certificate string. | 
 |  | 
 |                        The sslpeer= mode can aid finding X sessions via the | 
 |                        FINDDISPLAY and FINDCREATEDISPLAY mechanisms. | 
 |  | 
 |                        To immediately switch to a user *before* connections | 
 |                        to the X display are made or any files opened use the | 
 |                        "=" character: "-users =bob".  That user needs to | 
 |                        be able to open the X display and any files of course. | 
 |  | 
 |                        The special user "guess=" means to examine the utmpx | 
 |                        database (see who(1)) looking for a user attached to | 
 |                        the display number (from DISPLAY or -display option) | 
 |                        and try him/her.  To limit the list of guesses, use: | 
 |                        "-users guess=bob,betty". | 
 |  | 
 |                        Even more sinister is the special user "lurk=" | 
 |                        that means to try to guess the DISPLAY from the utmpx | 
 |                        login database as well.  So it "lurks" waiting for | 
 |                        anyone to log into an X session and then connects to it. | 
 |                        Specify a list of users after the = to limit which users | 
 |                        will be tried.  To enable a different searching mode, if | 
 |                        the first user in the list is something like ":0" or | 
 |                        ":0-2" that indicates a range of DISPLAY numbers that | 
 |                        will be tried (regardless of whether they are in the | 
 |                        utmpx database) for all users that are logged in.  Also | 
 |                        see the "-display WAIT:..." functionality.  Examples: | 
 |                        "-users lurk=" and also "-users lurk=:0-1,bob,mary" | 
 |  | 
 |                        Be especially careful using the "guess=" and "lurk=" | 
 |                        modes.  They are not recommended for use on machines | 
 |                        with untrustworthy local users. | 
 |  | 
 | -noshm                 Do not use the MIT-SHM extension for the polling. | 
 |                        Remote displays can be polled this way: be careful this | 
 |                        can use large amounts of network bandwidth.  This is | 
 |                        also of use if the local machine has a limited number | 
 |                        of shm segments and -onetile is not sufficient. | 
 | -flipbyteorder         Sometimes needed if remotely polled host has different | 
 |                        endianness.  Ignored unless -noshm is set. | 
 | -onetile               Do not use the new copy_tiles() framebuffer mechanism, | 
 |                        just use 1 shm tile for polling.  Limits shm segments | 
 |                        used to 3. | 
 |  | 
 |                        To disable any automatic shm reduction set the | 
 |                        env. var. X11VNC_NO_LIMIT_SHM. | 
 |  | 
 | -solid [color]         To improve performance, when VNC clients are connected | 
 |                        try to change the desktop background to a solid color. | 
 |                        The [color] is optional: the default color is "cyan4". | 
 |                        For a different one specify the X color (rgb.txt name, | 
 |                        e.g. "darkblue" or numerical "#RRGGBB"). | 
 |  | 
 |                        Currently this option only works on GNOME, KDE, CDE, | 
 |                        XFCE, and classic X (i.e. with the background image | 
 |                        on the root window).  The "gconftool-2", "dcop" | 
 |                        and "xfconf-query" external commands are run for | 
 |                        GNOME, KDE, and XFCE respectively.  This also works | 
 |                        on native MacOSX.  (There is no color selection for | 
 |                        MacOSX or XFCE.)  Other desktops won't work, (send | 
 |                        us the corresponding commands if you find them). | 
 |                        If x11vnc is running as root (inetd(8) or gdm(1)), | 
 |                        the -users option may be needed for GNOME, KDE, XFCE. | 
 |                        If x11vnc guesses your desktop incorrectly, you can | 
 |                        force it by prefixing color with "gnome:", "kde:", | 
 |                        "cde:", "xfce:", or "root:". | 
 |  | 
 |                        Update: -solid no longer works on KDE4. | 
 |  | 
 |                        This mode works in a limited way on the Mac OS X Console | 
 |                        with one color ('kelp') using the screensaver writing | 
 |                        to the background.  Look in "~/Library/Screen Savers" | 
 |                        for VncSolidColor.png to change the color. | 
 |  | 
 | -blackout string       Black out rectangles on the screen. "string" is a | 
 |                        comma separated list of WxH+X+Y type geometries for | 
 |                        each rectangle.  If one of the items on the list is the | 
 |                        string "noptr" the mouse pointer will not be allowed | 
 |                        to go into a blacked out region. | 
 | -xinerama              If your screen is composed of multiple monitors | 
 | -noxinerama            glued together via XINERAMA, and that screen is | 
 |                        not a rectangle this option will try to guess the | 
 |                        areas to black out (if your system has libXinerama). | 
 |                        default: -xinerama | 
 |  | 
 |                        In general, we have noticed on XINERAMA displays you may | 
 |                        need to use the "-xwarppointer" option if the mouse | 
 |                        pointer misbehaves and it is enabled by default. Use | 
 |                        "-noxwarppointer" if you do not want this. | 
 |  | 
 | -xtrap                 Use the DEC-XTRAP extension for keystroke and mouse | 
 |                        input insertion.  For use on legacy systems, e.g. X11R5, | 
 |                        running an incomplete or missing XTEST extension. | 
 |                        By default DEC-XTRAP will be used if XTEST server grab | 
 |                        control is missing, use -xtrap to do the keystroke and | 
 |                        mouse insertion via DEC-XTRAP as well. | 
 |  | 
 | -xrandr [mode]         If the display supports the XRANDR (X Resize, Rotate | 
 |                        and Reflection) extension, and you expect XRANDR events | 
 |                        to occur to the display while x11vnc is running, this | 
 |                        options indicates x11vnc should try to respond to | 
 |                        them (as opposed to simply crashing by assuming the | 
 |                        old screen size).  See the xrandr(1) manpage and run | 
 |                        'xrandr -q' for more info.  [mode] is optional and | 
 |                        described below. | 
 |  | 
 |                        Since watching for XRANDR events and trapping errors | 
 |                        increases polling overhead, only use this option if | 
 |                        XRANDR changes are expected.  For example on a rotatable | 
 |                        screen PDA or laptop, or using a XRANDR-aware Desktop | 
 |                        where you resize often.  It is best to be viewing with a | 
 |                        vncviewer that supports the NewFBSize encoding, since it | 
 |                        knows how to react to screen size changes.  Otherwise, | 
 |                        LibVNCServer tries to do so something reasonable for | 
 |                        viewers that cannot do this (portions of the screen | 
 |                        may be clipped, unused, etc). | 
 |  | 
 |                        Note: the default now is to check for XRANDR events, but | 
 |                        do not trap every X call that may fail due to resize. | 
 |                        If a resize event is received, the full -xrandr mode | 
 |                        is enabled.  To disable even checking for events supply: | 
 |                        -noxrandr. | 
 |  | 
 |                        "mode" defaults to "resize", which means create a | 
 |                        new, resized, framebuffer and hope all viewers can cope | 
 |                        with the change.  "newfbsize" means first disconnect | 
 |                        all viewers that do not support the NewFBSize VNC | 
 |                        encoding, and then resize the framebuffer.  "exit" | 
 |                        means disconnect all viewer clients, and then terminate | 
 |                        x11vnc. | 
 |  | 
 | -rotate string         Rotate and/or flip the framebuffer view exported by VNC. | 
 |                        This transformation is independent of XRANDR and is | 
 |                        done in software in main memory and so may be slower. | 
 |                        This mode could be useful on a handheld with portrait or | 
 |                        landscape modes that do not correspond to the scanline | 
 |                        order of the actual framebuffer.  "string" can be: | 
 |  | 
 |                              x     flip along x-axis | 
 |                              y     flip along y-axis | 
 |                             xy     flip along x- and y-axes | 
 |                            +90     rotate 90 degrees clockwise | 
 |                            -90     rotate 90 degrees counter-clockwise | 
 |                           +90x     rotate 90 degrees CW, then flip along x | 
 |                           +90y     rotate 90 degrees CW, then flip along y | 
 |  | 
 |                        these give all possible rotations and reflections. | 
 |  | 
 |                        Aliases: same as xy:  yx, +180, -180, 180 | 
 |                                 same as -90: +270, 270 | 
 |                                 same as +90: 90, (ditto for 90x, 90y) | 
 |  | 
 |                        Like -scale, this transformation is applied at the very | 
 |                        end of any chain of framebuffer transformations and so | 
 |                        any options with geometries, e.g. -blackout, -clip, etc. | 
 |                        are relative to the original X (or -rawfb) framebuffer, | 
 |                        not the final one sent to VNC viewers. | 
 |  | 
 |                        If you do not want the cursor shape to be rotated | 
 |                        prefix "string" with "nc:", e.g. "nc:+90", | 
 |                        "nc:xy", etc. | 
 |  | 
 | -padgeom WxH           Whenever a new vncviewer connects, the framebuffer is | 
 |                        replaced with a fake, solid black one of geometry WxH. | 
 |                        Shortly afterwards the framebuffer is replaced with the | 
 |                        real one.  This is intended for use with vncviewers | 
 |                        that do not support NewFBSize and one wants to make | 
 |                        sure the initial viewer geometry will be big enough | 
 |                        to handle all subsequent resizes (e.g. under -xrandr, | 
 |                        -remote id:windowid, rescaling, etc.) | 
 |  | 
 |                        In -unixpw mode this sets the size of the login screen. | 
 |                        Use "once:WxH" it ignore padgeom after the login | 
 |                        screen is set up. | 
 |  | 
 | -o logfile             Write stderr messages to file "logfile" instead of to | 
 |                        the terminal.  Same as "-logfile file".  To append | 
 |                        to the file use "-oa file" or "-logappend file". | 
 |                        If "logfile" contains the string "%VNCDISPLAY" | 
 |                        it is expanded to the vnc display (the name may need | 
 |                        to be guessed at.)  "%HOME" works too. | 
 |  | 
 | -flag file             Write the "PORT=NNNN" (e.g. PORT=5900) string to | 
 |                        "file" in addition to stdout.  This option could be | 
 |                        useful by wrapper script to detect when x11vnc is ready. | 
 |  | 
 | -rmflag file           Remove "file" at exit to signal when x11vnc is done. | 
 |                        The file is created at startup if it does not already | 
 |                        exist or if "file" is prefixed with "create:". | 
 |                        If the file is created, the x11vnc PID is placed in | 
 |                        the file.  Otherwise the files contents is not changed. | 
 |                        Use prefix "nocreate:" to prevent creation. | 
 |  | 
 | -rc filename           Use "filename" instead of $HOME/.x11vncrc for rc file. | 
 | -norc                  Do not process any .x11vncrc file for options. | 
 |  | 
 | -env VAR=VALUE         Set the environment variable 'VAR' to value 'VALUE' | 
 |                        at x11vnc startup.  This is a convenience utility to | 
 |                        avoid shell script wrappers, etc. to set the env. var. | 
 |                        You may specify as many of these as needed on the | 
 |                        command line. | 
 | -prog /path/to/x11vnc  Set the full path to the x11vnc program for cases when | 
 |                        it cannot be determined from argv[0] (e.g. tcpd/inetd) | 
 |  | 
 | -h, -help              Print this help text. | 
 | -?, -opts              Only list the x11vnc options. | 
 | -V, -version           Print program version and last modification date. | 
 | -license               Print out license information.  Same as -copying and | 
 |                        -warranty. | 
 |  | 
 | -dbg                   Instead of exiting after cleaning up, run a simple | 
 |                        "debug crash shell" when fatal errors are trapped. | 
 |  | 
 | -q, -quiet             Be quiet by printing less informational output to | 
 |                        stderr. (use -noquiet to undo an earlier -quiet.) | 
 |  | 
 |                        The -quiet option does not eliminate all informational | 
 |                        output, it only reduces it.  It is ignored in most | 
 |                        auxiliary usage modes, e.g. -storepasswd.  To eliminate | 
 |                        all output use: 2>/dev/null 1>&2, etc. | 
 |  | 
 | -v, -verbose           Print out more information to stderr. | 
 |  | 
 | -bg                    Go into the background after screen setup.  Messages to | 
 |                        stderr are lost unless -o logfile is used.  Something | 
 |                        like this could be useful in a script: | 
 |                         port=`ssh -t $host "x11vnc -display :0 -bg" | grep PORT | 
 | ` | 
 |                         port=`echo "$port" | sed -e 's/PORT=//'` | 
 |                         port=`expr $port - 5900` | 
 |                         vncviewer $host:$port | 
 |  | 
 | -modtweak              Option -modtweak automatically tries to adjust the AltGr | 
 | -nomodtweak            and Shift modifiers for differing language keyboards | 
 |                        between client and host.  Otherwise, only a single key | 
 |                        press/release of a Keycode is simulated (i.e. ignoring | 
 |                        the state of the modifiers: this usually works for | 
 |                        identical keyboards).  Also useful in resolving cases | 
 |                        where a Keysym is bound to multiple keys (e.g. "<" + ">" | 
 |                        and "," + "<" keys).  Default: -modtweak | 
 |  | 
 |                        If you are having trouble with with keys and -xkb or | 
 |                        -noxkb, and similar things don't help, try -nomodtweak. | 
 |  | 
 |                        On some HP-UX systems it is been noted that they have | 
 |                        an odd keymapping where a single keycode will have a | 
 |                        keysym, e.g. "#", up to three times.  You can check | 
 |                        via "xmodmap -pk" or the -dk option.  The failure | 
 |                        is when you try to type "#" it yields "3".  If you | 
 |                        see this problem try setting the environment variable | 
 |                        MODTWEAK_LOWEST=1 to see if it helps. | 
 |  | 
 | -xkb                   When in modtweak mode, use the XKEYBOARD extension (if | 
 | -noxkb                 the X display supports it) to do the modifier tweaking. | 
 |                        This is powerful and should be tried if there are still | 
 |                        keymapping problems when using -modtweak by itself. | 
 |                        The default is to check whether some common keysyms, | 
 |                        e.g. !, @, [, are only accessible via -xkb mode and if | 
 |                        so then automatically enable the mode.  To disable this | 
 |                        automatic detection use -noxkb. | 
 |  | 
 |                        When -xkb mode is active you can set these env. vars. | 
 |                        They apply only when there is ambiguity as to which | 
 |                        key to choose (i.e the mapping is not one-to-one). | 
 |                        NOKEYHINTS=1: for up ascii keystrokes do not use score | 
 |                        hints saved when the key was pressed down. NOANYDOWN=1: | 
 |                        for up keystrokes do not resort to searching through | 
 |                        keys that are currently pressed down.  KEYSDOWN=N: | 
 |                        remember the last N keys press down for tie-breaking | 
 |                        when an up keystroke comes in. | 
 |  | 
 | -capslock              When in -modtweak (the default) or -xkb mode, | 
 |                        if a keysym in the range A-Z comes in check the X | 
 |                        server to see if the Caps_Lock is set.  If it is do | 
 |                        not artificially press Shift to generate the keysym. | 
 |                        This will enable the CapsLock key to behave correctly | 
 |                        in some circumstances: namely *both* the VNC viewer | 
 |                        machine and the x11vnc X server are in the CapsLock | 
 |                        on state.  If one side has CapsLock on and the other | 
 |                        off and the keyboard is not behaving as you think it | 
 |                        should you should correct the CapsLock states (hint: | 
 |                        pressing CapsLock inside and outside of the viewer can | 
 |                        help toggle them both to the correct state).  However, | 
 |                        for best results do not use this option, but rather | 
 |                        *only* enable CapsLock on the VNC viewer side (i.e. by | 
 |                        pressing CapsLock outside of the viewer window, also | 
 |                        -skip_lockkeys below).  Also try -nomodtweak for a | 
 |                        possible workaround. | 
 |  | 
 | -skip_lockkeys         Have x11vnc ignore all Caps_Lock, Shift_Lock, Num_Lock, | 
 | -noskip_lockkeys       Scroll_Lock keysyms received from viewers.  The idea is | 
 |                        you press Caps_Lock on the VNC Viewer side but that does | 
 |                        not change the lock state in the x11vnc-side X server. | 
 |                        Nevertheless your capitalized letters come in over | 
 |                        the wire and are applied correctly to the x11vnc-side | 
 |                        X server.  Note this mode probably won't do what you | 
 |                        want in -nomodtweak mode.  Also, a kludge for KP_n | 
 |                        digits is always done in this mode: they are mapped to | 
 |                        regular digit keysyms.  See also -capslock above. | 
 |                        The default is -noskip_lockkeys. | 
 |  | 
 | -skip_keycodes string  Ignore the comma separated list of decimal keycodes. | 
 |                        Perhaps these are keycodes not on your keyboard but | 
 |                        your X server thinks exist.  Currently only applies | 
 |                        to -xkb mode.  Use this option to help x11vnc in the | 
 |                        reverse problem it tries to solve: Keysym -> Keycode(s) | 
 |                        when ambiguities exist (more than one Keycode per | 
 |                        Keysym).  Run 'xmodmap -pk' to see your keymapping. | 
 |                        Example: "-skip_keycodes 94,114" | 
 | -sloppy_keys           Experimental option that tries to correct some | 
 |                        "sloppy" key behavior.  E.g. if at the viewer you | 
 |                        press Shift+Key but then release the Shift before | 
 |                        Key that could give rise to extra unwanted characters | 
 |                        (usually only between keyboards of different languages). | 
 |                        Only use this option if you observe problems with | 
 |                        some keystrokes. | 
 | -skip_dups             Some VNC viewers send impossible repeated key events, | 
 | -noskip_dups           e.g. key-down, key-down, key-up, key-up all for the same | 
 |                        key, or 20 downs in a row for the same modifier key! | 
 |                        Setting -skip_dups means to skip these duplicates and | 
 |                        just process the first event. Note: some VNC viewers | 
 |                        assume they can send down's without the corresponding | 
 |                        up's and so you should not set this option for | 
 |                        these viewers (symptom: some keys do not autorepeat) | 
 |                        Default: -noskip_dups | 
 | -add_keysyms           If a Keysym is received from a VNC viewer and that | 
 | -noadd_keysyms         Keysym does not exist in the X server, then add the | 
 |                        Keysym to the X server's keyboard mapping on an unused | 
 |                        key.  Added Keysyms will be removed periodically and | 
 |                        also when x11vnc exits.  Default: -add_keysyms | 
 | -clear_mods            At startup and exit clear the modifier keys by sending | 
 |                        KeyRelease for each one. The Lock modifiers are skipped. | 
 |                        Used to clear the state if the display was accidentally | 
 |                        left with any pressed down. | 
 | -clear_keys            As -clear_mods, except try to release ANY pressed key. | 
 |                        Note that this option and -clear_mods can interfere | 
 |                        with a person typing at the physical keyboard. | 
 | -clear_all             As -clear_keys, except try to release any CapsLock, | 
 |                        NumLock, etc. locks as well. | 
 |  | 
 | -remap string          Read Keysym remappings from file named "string". | 
 |                        Format is one pair of Keysyms per line (can be name | 
 |                        or hex value) separated by a space.  If no file named | 
 |                        "string" exists, it is instead interpreted as this | 
 |                        form: key1-key2,key3-key4,...  See <X11/keysymdef.h> | 
 |                        header file for a list of Keysym names, or use xev(1). | 
 |  | 
 |                        To map a key to a button click, use the fake Keysyms | 
 |                        "Button1", ..., etc. E.g: "-remap Super_R-Button2" | 
 |                        (useful for pasting on a laptop) | 
 |  | 
 |                        I use these if the machine I am viewing from does not | 
 |                        have a scrollwheel or I don't like using the one it has: | 
 |  | 
 |                               -remap Super_R-Button4,Menu-Button5 | 
 |                               -remap KP_Add-Button4,KP_Enter-Button5 | 
 |  | 
 |                        the former would be used on a PC, the latter on a | 
 |                        MacBook.  This way those little used keys can be used | 
 |                        to generate bigger hops than the Up and Down arrows | 
 |                        provide.  One can scroll through text or web pages more | 
 |                        quickly this way (especially if x11vnc scroll detection | 
 |                        is active.) | 
 |  | 
 |                        Use Button44, Button12, etc. for multiple clicks. | 
 |  | 
 |                        To disable a keysym (i.e. make it so it will not be | 
 |                        injected), remap it to "NoSymbol" or "None". | 
 |  | 
 |                        Dead keys: "dead" (or silent, mute) keys are keys that | 
 |                        do not produce a character but must be followed by a 2nd | 
 |                        keystroke.  This is often used for accenting characters, | 
 |                        e.g. to put "`" on top of "a" by pressing the dead | 
 |                        key and then "a".  Note that this interpretation | 
 |                        is not part of core X11, it is up to the toolkit or | 
 |                        application to decide how to react to the sequence. | 
 |                        The X11 names for these keysyms are "dead_grave", | 
 |                        "dead_acute", etc.  However some VNC viewers send the | 
 |                        keysyms "grave", "acute" instead thereby disabling | 
 |                        the accenting.  To work around this -remap can be used. | 
 |                        For example "-remap grave-dead_grave,acute-dead_acute" | 
 |                        As a convenience, "-remap DEAD" applies these remaps: | 
 |  | 
 |                                g     grave-dead_grave | 
 |                                a     acute-dead_acute | 
 |                                c     asciicircum-dead_circumflex | 
 |                                t     asciitilde-dead_tilde | 
 |                                m     macron-dead_macron | 
 |                                b     breve-dead_breve | 
 |                                D     abovedot-dead_abovedot | 
 |                                d     diaeresis-dead_diaeresis | 
 |                                o     degree-dead_abovering | 
 |                                A     doubleacute-dead_doubleacute | 
 |                                r     caron-dead_caron | 
 |                                e     cedilla-dead_cedilla | 
 |  | 
 |                        If you just want a subset use the first letter | 
 |                        label, e.g. "-remap DEAD=ga" to get the first two. | 
 |                        Additional remaps may also be supplied via commas, | 
 |                        e.g.  "-remap DEAD=ga,Super_R-Button2".  Finally, | 
 |                        "DEAD=missing" means to apply all of the above as | 
 |                        long as the left hand member is not already in the | 
 |                        X11 keymap. | 
 |  | 
 | -norepeat              Option -norepeat disables X server key auto repeat when | 
 | -repeat                VNC clients are connected and VNC keyboard input is | 
 |                        not idle for more than 5 minutes.  This works around a | 
 |                        repeating keystrokes bug (triggered by long processing | 
 |                        delays between key down and key up client events: | 
 |                        either from large screen changes or high latency). | 
 |                        Default: -norepeat | 
 |  | 
 |                        You can set the env. var. X11VNC_IDLE_TIMEOUT to the | 
 |                        number of idle seconds you want (5min = 300secs). | 
 |  | 
 |                        Note: your VNC viewer side will likely do autorepeating, | 
 |                        so this is no loss unless someone is simultaneously at | 
 |                        the real X display. | 
 |  | 
 |                        Use "-norepeat N" to set how many times norepeat will | 
 |                        be reset if something else (e.g. X session manager) | 
 |                        undoes it.  The default is 2.  Use a negative value | 
 |                        for unlimited resets. | 
 |  | 
 | -nofb                  Ignore video framebuffer: only process keyboard and | 
 |                        pointer.  Intended for use with Win2VNC and x2vnc | 
 |                        dual-monitor setups. | 
 | -nobell                Do not watch for XBell events. (no beeps will be heard) | 
 |                        Note: XBell monitoring requires the XKEYBOARD extension. | 
 | -nosel                 Do not manage exchange of X selection/cutbuffer between | 
 |                        VNC viewers and the X server at all. | 
 | -noprimary             Do not poll the PRIMARY selection for changes to send | 
 |                        back to clients.  (PRIMARY is still set on received | 
 |                        changes, however). | 
 | -nosetprimary          Do not set the PRIMARY selection for changes received | 
 |                        from VNC clients. | 
 | -noclipboard           Do not poll the CLIPBOARD selection for changes to send | 
 |                        back to clients.  (CLIPBOARD is still set on received | 
 |                        changes, however). | 
 | -nosetclipboard        Do not set the CLIPBOARD selection for changes | 
 |                        received from VNC clients. | 
 | -seldir string         If direction string is "send", only send the selection | 
 |                        to viewers, and if it is "recv" only receive it from | 
 |                        viewers.  To work around apps setting the selection | 
 |                        too frequently and messing up the other end.  You can | 
 |                        actually supply a comma separated list of directions, | 
 |                        including "debug" to turn on debugging output. | 
 |  | 
 | -cursor [mode]         Sets how the pointer cursor shape (little icon at the | 
 | -nocursor              mouse pointer) should be handled.  The "mode" string | 
 |                        is optional and is described below.  The default | 
 |                        is to show some sort of cursor shape(s).  How this | 
 |                        is done depends on the VNC viewer and the X server. | 
 |                        Use -nocursor to disable cursor shapes completely. | 
 |  | 
 |                        Some VNC viewers support the TightVNC CursorPosUpdates | 
 |                        and CursorShapeUpdates extensions (cuts down on | 
 |                        network traffic by not having to send the cursor image | 
 |                        every time the pointer is moved), in which case these | 
 |                        extensions are used (see -nocursorshape and -nocursorpos | 
 |                        below to disable).  For other viewers the cursor shape | 
 |                        is written directly to the framebuffer every time the | 
 |                        pointer is moved or changed and gets sent along with | 
 |                        the other framebuffer updates.  In this case, there | 
 |                        will be some lag between the vnc viewer pointer and | 
 |                        the remote cursor position. | 
 |  | 
 |                        If the X display supports retrieving the cursor shape | 
 |                        information from the X server, then the default is | 
 |                        to use that mode.  On Solaris this can be done with | 
 |                        the SUN_OVL extension using -overlay (see also the | 
 |                        -overlay_nocursor option).  A similar overlay scheme | 
 |                        is used on IRIX.  Xorg (e.g. Linux) and recent Solaris | 
 |                        Xsun servers support the XFIXES extension to retrieve | 
 |                        the exact cursor shape from the X server.  If XFIXES | 
 |                        is present it is preferred over Overlay and is used by | 
 |                        default (see -noxfixes below).  This can be disabled | 
 |                        with -nocursor, and also some values of the "mode" | 
 |                        option below. | 
 |  | 
 |                        Note that under XFIXES cursors with transparency (alpha | 
 |                        channel) will usually not be exactly represented and one | 
 |                        may find Overlay preferable.  See also the -alphacut | 
 |                        and -alphafrac options below as fudge factors to try | 
 |                        to improve the situation for cursors with transparency | 
 |                        for a given theme. | 
 |  | 
 |                        The "mode" string can be used to fine-tune the | 
 |                        displaying of cursor shapes.  It can be used the | 
 |                        following ways: | 
 |  | 
 |                        "-cursor arrow" - just show the standard arrow | 
 |                        nothing more or nothing less. | 
 |  | 
 |                        "-cursor none" - same as "-nocursor" | 
 |  | 
 |                        "-cursor X" - when the cursor appears to be on the | 
 |                        root window, draw the familiar X shape.  Some desktops | 
 |                        such as GNOME cover up the root window completely, | 
 |                        and so this will not work, try "X1", etc, to try to | 
 |                        shift the tree depth.  On high latency links or slow | 
 |                        machines there will be a time lag between expected and | 
 |                        the actual cursor shape. | 
 |  | 
 |                        "-cursor some" - like "X" but use additional | 
 |                        heuristics to try to guess if the window should have | 
 |                        a windowmanager-like resizer cursor or a text input | 
 |                        I-beam cursor.  This is a complete hack, but may be | 
 |                        useful in some situations because it provides a little | 
 |                        more feedback about the cursor shape. | 
 |  | 
 |                        "-cursor most" - try to show as many cursors as | 
 |                        possible.  Often this will only be the same as "some" | 
 |                        unless the display has overlay visuals or XFIXES | 
 |                        extensions available.  On Solaris and IRIX if XFIXES | 
 |                        is not available, -overlay mode will be attempted. | 
 |  | 
 | -cursor_drag           Show cursor shape changes even when the mouse is being | 
 |                        dragged with a mouse button down.  This is useful if you | 
 |                        want to be able to see Drag-and-Drop cursor icons, etc. | 
 |  | 
 | -arrow n               Choose an alternate "arrow" cursor from a set of | 
 |                        some common ones.  n can be 1 to 6.  Default is: 1 | 
 |                        Ignored when in XFIXES cursor-grabbing mode. | 
 |  | 
 | -noxfixes              Do not use the XFIXES extension to draw the exact cursor | 
 |                        shape even if it is available. | 
 |  | 
 |                        Note: To work around a crash in Xorg 1.5 and later | 
 |                        some people needed to use -noxfixes.  The Xorg crash | 
 |                        occurred right after a Display Manager (e.g. GDM) login. | 
 |                        Starting with x11vnc 0.9.9 it tries to automatically | 
 |                        avoid using XFIXES until it is sure a window manager | 
 |                        is running.  See the -reopen option for more info and | 
 |                        how to use X11VNC_AVOID_WINDOWS=never to disable it. | 
 |  | 
 | -alphacut n            When using the XFIXES extension for the cursor shape, | 
 |                        cursors with transparency will not usually be displayed | 
 |                        exactly (but opaque ones will).  This option sets n as | 
 |                        a cutoff for cursors that have transparency ("alpha | 
 |                        channel" with values ranging from 0 to 255) Any cursor | 
 |                        pixel with alpha value less than n becomes completely | 
 |                        transparent.  Otherwise the pixel is completely opaque. | 
 |                        Default 240 | 
 |  | 
 | -alphafrac fraction    With the threshold in -alphacut some cursors will become | 
 |                        almost completely transparent because their alpha values | 
 |                        are not high enough.  For those cursors adjust the | 
 |                        alpha threshold until fraction of the non-zero alpha | 
 |                        channel pixels become opaque.  Default 0.33 | 
 | -alpharemove           By default, XFIXES cursors pixels with transparency have | 
 |                        the alpha factor multiplied into the RGB color values | 
 |                        (i.e. that corresponding to blending the cursor with a | 
 |                        black background).  Specify this option to remove the | 
 |                        alpha factor. (useful for light colored semi-transparent | 
 |                        cursors). | 
 | -noalphablend          In XFIXES mode do not send cursor alpha channel data | 
 |                        to LibVNCServer.  The default is to send it.  The | 
 |                        alphablend effect will only be visible in -nocursorshape | 
 |                        mode or for clients with cursorshapeupdates turned | 
 |                        off. (However there is a hack for 32bpp with depth 24, | 
 |                        it uses the extra 8 bits to store cursor transparency | 
 |                        for use with a hacked vncviewer that applies the | 
 |                        transparency locally.  See the FAQ for more info). | 
 |  | 
 | -nocursorshape         Do not use the TightVNC CursorShapeUpdates extension | 
 |                        even if clients support it.  See -cursor above. | 
 | -cursorpos             Option -cursorpos enables sending the X cursor position | 
 | -nocursorpos           back to all vnc clients that support the TightVNC | 
 |                        CursorPosUpdates extension.  Other clients will be able | 
 |                        to see the pointer motions. Default: -cursorpos | 
 | -xwarppointer          Move the pointer with XWarpPointer(3X) instead of | 
 | -noxwarppointer        the XTEST extension.  Use this as a workaround | 
 |                        if the pointer motion behaves incorrectly, e.g. | 
 |                        on touchscreens or other non-standard setups. | 
 |  | 
 |                        It is also sometimes needed on XINERAMA displays and is | 
 |                        enabled by default if XINERAMA is found to be active. | 
 |                        To prevent this, use -noxwarppointer. | 
 |  | 
 | -always_inject         Even if there is no displacement (dx = dy = 0) for a | 
 |                        VNC mouse event force the pointer to the indicated x,y | 
 |                        position anyway.  Recent (2009) gui toolkits (gnome) | 
 |                        have problems with x11vnc's original mouse input | 
 |                        injection method.  So x11vnc's mouse input injection | 
 |                        method has been modified.  To regain the OLD behavior | 
 |                        use this option: -always_inject.  Then x11vnc will | 
 |                        always force positioning the mouse to the x,y position | 
 |                        even if that position has not changed since the previous | 
 |                        VNC input event. | 
 |  | 
 |                        The first place this problem was noticed was in gnome | 
 |                        terminal: if you pressed and released mouse button 3, a | 
 |                        menu was posted and then its first element 'New Terminal | 
 |                        Window' was activated.  This was because x11vnc injected | 
 |                        the mouse position twice: once on ButtonPress and again | 
 |                        on ButtonRelease.  The toolkit interpreted the 2nd one | 
 |                        as mouse motion even though the mouse hadn't moved. | 
 |                        So now by default x11vnc tries to avoid injecting the | 
 |                        2nd one. | 
 |  | 
 |                        Note that with the new default x11vnc will be oblivious | 
 |                        to applications moving the pointer (warping) or the | 
 |                        user at the physical display moving it.  So it might, | 
 |                        e.g., inject ButtonRelease at the wrong position. | 
 |                        If this (or similar scenarios) causes problems in your | 
 |                        environment, specify -always_inject for the old method. | 
 |  | 
 | -buttonmap string      String to remap mouse buttons.  Format: IJK-LMN, this | 
 |                        maps buttons I -> L, etc., e.g.  -buttonmap 13-31 | 
 |  | 
 |                        Button presses can also be mapped to keystrokes: replace | 
 |                        a button digit on the right of the dash with :<sym>: | 
 |                        or :<sym1>+<sym2>: etc. for multiple keys. For example, | 
 |                        if the viewing machine has a mouse-wheel (buttons 4 5) | 
 |                        but the x11vnc side does not, these will do scrolls: | 
 |                               -buttonmap 12345-123:Prior::Next: | 
 |                               -buttonmap 12345-123:Up+Up+Up::Down+Down+Down: | 
 |  | 
 |                        See <X11/keysymdef.h> header file for a list of Keysyms, | 
 |                        or use the xev(1) program.  Note: mapping of button | 
 |                        clicks to Keysyms may not work if -modtweak or -xkb is | 
 |                        needed for the Keysym. | 
 |  | 
 |                        If you include a modifier like "Shift_L" the | 
 |                        modifier's up/down state is toggled, e.g. to send | 
 |                        "The" use :Shift_L+t+Shift_L+h+e: (the 1st one is | 
 |                        shift down and the 2nd one is shift up). (note: the | 
 |                        initial state of the modifier is ignored and not reset) | 
 |                        To include button events use "Button1", ... etc. | 
 |  | 
 |                        -buttonmap currently does not work on MacOSX console | 
 |                        or in -rawfb mode. | 
 |  | 
 |                        Workaround: use -buttonmap IJ...-LM...=n to limit the | 
 |                        number of mouse buttons to n, e.g. 123-123=3.  This will | 
 |                        prevent x11vnc from crashing if the X server reports | 
 |                        there are 5 buttons (4/5 scroll wheel), but there are | 
 |                        only really 3. | 
 |  | 
 | -nodragging            Do not update the display during mouse dragging events | 
 |                        (mouse button held down).  Greatly improves response on | 
 |                        slow setups, but you lose all visual feedback for drags, | 
 |                        text selection, and some menu traversals.  It overrides | 
 |                        any -pointer_mode setting. | 
 |  | 
 | -ncache n              Client-side caching scheme.  Framebuffer memory "n" | 
 |                        (an integer) times that of the full display is allocated | 
 |                        below the actual framebuffer to cache screen contents | 
 |                        for rapid retrieval.  So a W x H frambuffer is expanded | 
 |                        to a W x (n+1)*H one.  Use 0 to disable. | 
 |  | 
 |                        The "n" is actually optional, the default is 10. | 
 |  | 
 |                        For this and the other -ncache* options below you can | 
 |                        abbreviate "-ncache" with "-nc".  Also, "-nonc" | 
 |                        is the same as "-ncache 0" | 
 |  | 
 |                        This is an experimental option, currently implemented in | 
 |                        an awkward way in that in the VNC Viewer you can see the | 
 |                        pixel cache contents if you scroll down, etc.  So you | 
 |                        will have to set things up so you can't see that region. | 
 |                        If this method is successful, the changes required for | 
 |                        clients to do this less awkwardly will be investigated. | 
 |  | 
 |                        The SSVNC viewer does a good job at automatically hiding | 
 |                        the pixel cache region.  Or use SSVNC's -ycrop option | 
 |                        to explicitly hide the region. | 
 |  | 
 |                        Note that this mode consumes a huge amount of memory, | 
 |                        both on the x11vnc server side and on the VNC Viewer | 
 |                        side.  If n=2 then the amount of RAM used is roughly | 
 |                        tripled for both x11vnc and the VNC Viewer.  As a rule | 
 |                        of thumb, note that 1280x1024 at depth 24 is about 5MB | 
 |                        of pixel data. | 
 |  | 
 |                        For reasonable response when cycling through 4 to 6 | 
 |                        large (e.g. web browser) windows a value n of 6 to 12 | 
 |                        is recommended. (that's right: ~10X more memory...) | 
 |  | 
 |                        Because of the way window backingstore and saveunders | 
 |                        are implemented, n must be even.  It will be incremented | 
 |                        by 1 if it is not. | 
 |  | 
 |                        This mode also works for native MacOS X, but may not | 
 |                        be as effective as the X version.  This is due to a | 
 |                        number of things, one is the drop-shadow compositing | 
 |                        that leaves extra areas that need to be repaired (see | 
 |                        -ncache_pad).  Another is the window iconification | 
 |                        animations need to be avoided (see -macicontime). | 
 |                        It appears the that the 'Scale' animation mode gives | 
 |                        better results than the 'Genie' one.  Also, window event | 
 |                        detection not as accurate as the X version. | 
 |  | 
 | -ncache_cr             In -ncache mode, try to do copyrect opaque window | 
 |                        moves/drags instead of wireframes (this can induce | 
 |                        painting errors).  The wireframe will still be used when | 
 |                        moving a window whose save-unders has not yet been set | 
 |                        or has been invalidated. | 
 |  | 
 |                        Some VNC Viewers provide better response than others | 
 |                        with this option.  On Unix, realvnc viewer gives | 
 |                        smoother drags than tightvnc viewer.  Response may also | 
 |                        be choppy if the server side machine is too slow. | 
 |  | 
 |                        Sometimes on very slow modem connections, this actually | 
 |                        gives an improvement because no pixel data at all | 
 |                        (not even the box animation) is sent during the drag. | 
 |  | 
 | -ncache_no_moveraise   In -ncache mode, do not assume that moving a window | 
 |                        will cause the window manager to raise it to the top | 
 |                        of the stack.  The default is to assume it does, and | 
 |                        so at the beginning of any wireframe, etc, window moves | 
 |                        the window will be pushed to top in the VNC viewer. | 
 |  | 
 | -ncache_no_dtchange    In -ncache mode, do not try to guess when the desktop | 
 |                        (viewport) changes to another one (i.e. another | 
 |                        workarea).  The default is to try to guess and when | 
 |                        detected try to make the transistion more smoothly. | 
 |  | 
 | -ncache_no_rootpixmap  In -ncache mode, do not try to snapshot the desktop | 
 |                        background to use in guessing or reconstructing window | 
 |                        save-unders. | 
 |  | 
 | -ncache_keep_anims     In -ncache mode, do not try to disable window | 
 |                        manager animations and other effects (that usually | 
 |                        degrade ncache performance or cause painting errors). | 
 |                        The default is to try to disable them on KDE (but not | 
 |                        GNOME) when VNC clients are connected. | 
 |  | 
 |                        For other window managers or desktops that provide | 
 |                        animations, effects, compositing, translucency, | 
 |                        etc. that interfere with the -ncache method you will | 
 |                        have to disable them manually. | 
 |  | 
 | -ncache_old_wm         In -ncache mode, enable some heuristics for old style | 
 |                        window managers such as fvwm and twm. | 
 |  | 
 | -ncache_pad n          In -ncache mode, pad each window with n pixels for the | 
 |                        caching rectangles.  This can be used to try to improve | 
 |                        the situation with dropshadows or other compositing | 
 |                        (e.g. MacOS X window manager), although it could make | 
 |                        things worse.  The default is 0 on Unix and 24 on | 
 |                        MacOS X. | 
 | -debug_ncache          Turn on debugging and profiling output under -ncache. | 
 |  | 
 | -wireframe [str]       Try to detect window moves or resizes when a mouse | 
 | -nowireframe           button is held down and show a wireframe instead of | 
 |                        the full opaque window.  This is based completely on | 
 |                        heuristics and may not always work: it depends on your | 
 |                        window manager and even how you move things around. | 
 |                        See -pointer_mode below for discussion of the "bogging | 
 |                        down" problem this tries to avoid. | 
 |                        Default: -wireframe | 
 |  | 
 |                        Shorter aliases:  -wf [str]  and -nowf | 
 |  | 
 |                        The value "str" is optional and, of course, is | 
 |                        packed with many tunable parameters for this scheme: | 
 |  | 
 |                        Format: shade,linewidth,percent,T+B+L+R,mod,t1+t2+t3+t4 | 
 |                        Default: 0xff,2,0,32+8+8+8,all,0.15+0.30+5.0+0.125 | 
 |  | 
 |                        If you leave nothing between commas: ",," the default | 
 |                        value is used.  If you don't specify enough commas, | 
 |                        the trailing parameters are set to their defaults. | 
 |  | 
 |                        "shade" indicate the "color" for the wireframe, | 
 |                        usually a greyscale: 0-255, however for 16 and 32bpp you | 
 |                        can specify an rgb.txt X color (e.g. "dodgerblue") or | 
 |                        a value > 255 is treated as RGB (e.g. red is 0xff0000). | 
 |                        "linewidth" sets the width of the wireframe in pixels. | 
 |                        "percent" indicates to not apply the wireframe scheme | 
 |                        to windows with area less than this percent of the | 
 |                        full screen. | 
 |  | 
 |                        "T+B+L+R" indicates four integers for how close in | 
 |                        pixels the pointer has to be from the Top, Bottom, Left, | 
 |                        or Right edges of the window to consider wireframing. | 
 |                        This is a speedup to quickly exclude a window from being | 
 |                        wireframed: set them all to zero to not try the speedup | 
 |                        (scrolling and selecting text will likely be slower). | 
 |  | 
 |                        "mod" specifies if a button down event in the | 
 |                        interior of the window with a modifier key (Alt, Shift, | 
 |                        etc.) down should indicate a wireframe opportunity. | 
 |                        It can be "0" or "none" to skip it, "1" or "all" | 
 |                        to apply it to any modifier, or "Shift", "Alt", | 
 |                        "Control", "Meta", "Super", or "Hyper" to only | 
 |                        apply for that type of modifier key. | 
 |  | 
 |                        "t1+t2+t3+t4" specify four floating point times in | 
 |                        seconds: t1 is how long to wait for the pointer to move, | 
 |                        t2 is how long to wait for the window to start moving | 
 |                        or being resized (for some window managers this can be | 
 |                        rather long), t3 is how long to keep a wireframe moving | 
 |                        before repainting the window. t4 is the minimum time | 
 |                        between sending wireframe "animations".  If a slow | 
 |                        link is detected, these values may be automatically | 
 |                        changed to something better for a slow link. | 
 |  | 
 | -nowireframelocal      By default, mouse motion and button presses of a | 
 |                        user sitting at the LOCAL display are monitored for | 
 |                        wireframing opportunities (so that the changes will be | 
 |                        sent efficiently to the VNC clients).  Use this option | 
 |                        to disable this behavior. | 
 |  | 
 | -wirecopyrect mode     Since the -wireframe mechanism evidently tracks moving | 
 | -nowirecopyrect        windows accurately, a speedup can be obtained by | 
 |                        telling the VNC viewers to locally copy the translated | 
 |                        window region.  This is the VNC CopyRect encoding: | 
 |                        the framebuffer update doesn't need to send the actual | 
 |                        new image data. | 
 |  | 
 |                        Shorter aliases:  -wcr [mode]  and -nowcr | 
 |  | 
 |                        "mode" can be "never" (same as -nowirecopyrect) | 
 |                        to never try the copyrect, "top" means only do it if | 
 |                        the window was not covered by any other windows, and | 
 |                        "always" means to translate the orginally unobscured | 
 |                        region (this may look odd as the remaining pieces come | 
 |                        in, but helps on a slow link).  Default: "always" | 
 |  | 
 |                        Note: there can be painting errors or slow response | 
 |                        when using -scale so you may want to disable CopyRect | 
 |                        in this case "-wirecopyrect never" on the command | 
 |                        line or by remote-control.  Or you can also use the | 
 |                        "-scale xxx:nocr" scale option. | 
 |  | 
 | -debug_wireframe       Turn on debugging info printout for the wireframe | 
 |                        heuristics.  "-dwf" is an alias.  Specify multiple | 
 |                        times for more output. | 
 |  | 
 | -scrollcopyrect mode   Like -wirecopyrect, but use heuristics to try to guess | 
 | -noscrollcopyrect      if a window has scrolled its contents (either vertically | 
 |                        or horizontally).  This requires the RECORD X extension | 
 |                        to "snoop" on X applications (currently for certain | 
 |                        XCopyArea and XConfigureWindow X protocol requests). | 
 |                        Examples: Hitting <Return> in a terminal window when the | 
 |                        cursor was at the bottom, the text scrolls up one line. | 
 |                        Hitting <Down> arrow in a web browser window, the web | 
 |                        page scrolls up a small amount.  Or scrolling with a | 
 |                        scrollbar or mouse wheel. | 
 |  | 
 |                        Shorter aliases:  -scr [mode]  and -noscr | 
 |  | 
 |                        This scheme will not always detect scrolls, but when | 
 |                        it does there is a nice speedup from using the VNC | 
 |                        CopyRect encoding (see -wirecopyrect).  The speedup | 
 |                        is both in reduced network traffic and reduced X | 
 |                        framebuffer polling/copying.  On the other hand, it may | 
 |                        induce undesired transients (e.g. a terminal cursor | 
 |                        being scrolled up when it should not be) or other | 
 |                        painting errors (window tearing, bunching-up, etc). | 
 |                        These are automatically repaired in a short period | 
 |                        of time.  If this is unacceptable disable the feature | 
 |                        with -noscrollcopyrect. | 
 |  | 
 |                        Screen clearing kludges:  for testing at least, there | 
 |                        are some "magic key sequences" (must be done in less | 
 |                        than 1 second) to aid repairing painting errors that | 
 |                        may be seen when using this mode: | 
 |  | 
 |                        3 Alt_L's   in a row: resend whole screen, | 
 |                        4 Alt_L's   in a row: reread and resend whole screen, | 
 |                        3 Super_L's in a row: mark whole screen for polling, | 
 |                        4 Super_L's in a row: reset RECORD context, | 
 |                        5 Super_L's in a row: try to push a black screen | 
 |  | 
 |                        note: Alt_L is the Left "Alt" key (a single key) | 
 |                        Super_L is the Left "Super" key (Windows flag). | 
 |                        Both of these are modifier keys, and so should not | 
 |                        generate characters when pressed by themselves.  Also, | 
 |                        your VNC viewer may have its own refresh hot-key | 
 |                        or button. | 
 |  | 
 |                        "mode" can be "never" (same as -noscrollcopyrect) | 
 |                        to never try the copyrect, "keys" means to try it | 
 |                        in response to keystrokes only, "mouse" means to | 
 |                        try it in response to mouse events only, "always" | 
 |                        means to do both. Default: "always" | 
 |  | 
 |                        Note: there can be painting errors or slow response | 
 |                        when using -scale so you may want to disable CopyRect | 
 |                        in this case "-scrollcopyrect never" on the command | 
 |                        line or by remote-control.  Or you can also use the | 
 |                        "-scale xxx:nocr" scale option. | 
 |  | 
 | -scr_area n            Set the minimum area in pixels for a rectangle | 
 |                        to be considered for the -scrollcopyrect detection | 
 |                        scheme.  This is to avoid wasting the effort on small | 
 |                        rectangles that would be quickly updated the normal way. | 
 |                        E.g. suppose an app updated the position of its skinny | 
 |                        scrollbar first and then shifted the large panel | 
 |                        it controlled.  We want to be sure to skip the small | 
 |                        scrollbar and get the large panel. Default: 60000 | 
 |  | 
 | -scr_skip list         Skip scroll detection for applications matching | 
 |                        the comma separated list of strings in "list". | 
 |                        Some applications implement their scrolling in | 
 |                        strange ways where the XCopyArea, etc, also applies | 
 |                        to invisible portions of the window: if we CopyRect | 
 |                        those areas it looks awful during the scroll and | 
 |                        there may be painting errors left after the scroll. | 
 |                        Soffice.bin is the worst known offender. | 
 |  | 
 |                        Use "##" to denote the start of the application class | 
 |                        (e.g. "##XTerm") and "++" to denote the start | 
 |                        of the application instance name (e.g. "++xterm"). | 
 |                        The string your list is matched against is of the form | 
 |                        "^^WM_NAME##Class++Instance<same-for-any-subwindows>" | 
 |                        The "xlsclients -la" command will provide this info. | 
 |  | 
 |                        If a pattern is prefixed with "KEY:" it only applies | 
 |                        to Keystroke generated scrolls (e.g. Up arrow).  If it | 
 |                        is prefixed with "MOUSE:" it only applies to Mouse | 
 |                        induced scrolls (e.g. dragging on a scrollbar). | 
 |                        Default: ##Soffice.bin,##StarOffice,##OpenOffice | 
 |  | 
 | -scr_inc list          Opposite of -scr_skip: this list is consulted first | 
 |                        and if there is a match the window will be monitored | 
 |                        via RECORD for scrolls irrespective of -scr_skip. | 
 |                        Use -scr_skip '*' to skip anything that does not match | 
 |                        your -scr_inc.  Use -scr_inc '*' to include everything. | 
 |  | 
 | -scr_keys list         For keystroke scroll detection, only apply the RECORD | 
 |                        heuristics to the comma separated list of keysyms in | 
 |                        "list".  You may find the RECORD overhead for every | 
 |                        one of your keystrokes disrupts typing too much, but you | 
 |                        don't want to turn it off completely with "-scr mouse" | 
 |                        and -scr_parms does not work or is too confusing. | 
 |  | 
 |                        The listed keysyms can be numeric or the keysym | 
 |                        names in the <X11/keysymdef.h> header file or from the | 
 |                        xev(1) program.  Example: "-scr_keys Up,Down,Return". | 
 |                        One probably wants to have application specific lists | 
 |                        (e.g. for terminals, etc) but that is too icky to think | 
 |                        about for now... | 
 |  | 
 |                        If "list" begins with the "-" character the list | 
 |                        is taken as an exclude list: all keysyms except those | 
 |                        list will be considered.  The special string "builtin" | 
 |                        expands to an internal list of keysyms that are likely | 
 |                        to cause scrolls.  BTW, by default modifier keys, | 
 |                        Shift_L, Control_R, etc, are skipped since they almost | 
 |                        never induce scrolling by themselves. | 
 |  | 
 | -scr_term list         Yet another cosmetic kludge.  Apply shell/terminal | 
 |                        heuristics to applications matching comma separated | 
 |                        list (same as for -scr_skip/-scr_inc).  For example an | 
 |                        annoying transient under scroll detection is if you | 
 |                        hit Enter in a terminal shell with full text window, | 
 |                        the solid text cursor block will be scrolled up. | 
 |                        So for a short time there are two (or more) block | 
 |                        cursors on the screen.  There are similar scenarios, | 
 |                        (e.g. an output line is duplicated). | 
 |  | 
 |                        These transients are induced by the approximation of | 
 |                        scroll detection (e.g. it detects the scroll, but not | 
 |                        the fact that the block cursor was cleared just before | 
 |                        the scroll).  In nearly all cases these transient errors | 
 |                        are repaired when the true X framebuffer is consulted | 
 |                        by the normal polling.  But they are distracting, so | 
 |                        what this option provides is extra "padding" near the | 
 |                        bottom of the terminal window: a few extra lines near | 
 |                        the bottom will not be scrolled, but rather updated | 
 |                        from the actual X framebuffer.  This usually reduces | 
 |                        the annoying artifacts.  Use "none" to disable. | 
 |                        Default: "term" | 
 |  | 
 | -scr_keyrepeat lo-hi   If a key is held down (or otherwise repeats rapidly) and | 
 |                        this induces a rapid sequence of scrolls (e.g. holding | 
 |                        down an Arrow key) the "scrollcopyrect" detection | 
 |                        and overhead may not be able to keep up.  A time per | 
 |                        single scroll estimate is performed and if that estimate | 
 |                        predicts a sustainable scrollrate of keys per second | 
 |                        between "lo" and "hi" then repeated keys will be | 
 |                        DISCARDED to maintain the scrollrate. For example your | 
 |                        key autorepeat may be 25 keys/sec, but for a large | 
 |                        window or slow link only 8 scrolls per second can be | 
 |                        sustained, then roughly 2 out of every 3 repeated keys | 
 |                        will be discarded during this period. Default: "4-20" | 
 |  | 
 | -scr_parms string      Set various parameters for the scrollcopyrect mode. | 
 |                        The format is similar to that for -wireframe and packed | 
 |                        with lots of parameters: | 
 |  | 
 |                        Format: T+B+L+R,t1+t2+t3,s1+s2+s3+s4+s5 | 
 |                        Default: 0+64+32+32,0.02+0.10+0.9,0.03+0.06+0.5+0.1+5.0 | 
 |  | 
 |                        If you leave nothing between commas: ",," the default | 
 |                        value is used.  If you don't specify enough commas, | 
 |                        the trailing parameters are set to their defaults. | 
 |  | 
 |                        "T+B+L+R" indicates four integers for how close in | 
 |                        pixels the pointer has to be from the Top, Bottom, Left, | 
 |                        or Right edges of the window to consider scrollcopyrect. | 
 |                        If -wireframe overlaps it takes precedence.  This is a | 
 |                        speedup to quickly exclude a window from being watched | 
 |                        for scrollcopyrect: set them all to zero to not try | 
 |                        the speedup (things like selecting text will likely | 
 |                        be slower). | 
 |  | 
 |                        "t1+t2+t3" specify three floating point times in | 
 |                        seconds that apply to scrollcopyrect detection with | 
 |                        *Keystroke* input: t1 is how long to wait after a key | 
 |                        is pressed for the first scroll, t2 is how long to keep | 
 |                        looking after a Keystroke scroll for more scrolls. | 
 |                        t3 is how frequently to try to update surrounding | 
 |                        scrollbars outside of the scrolling area (0.0 to | 
 |                        disable) | 
 |  | 
 |                        "s1+s2+s3+s4+s5" specify five floating point times | 
 |                        in seconds that apply to scrollcopyrect detection with | 
 |                        *Mouse* input: s1 is how long to wait after a mouse | 
 |                        button is pressed for the first scroll, s2 is how long | 
 |                        to keep waiting for additional scrolls after the first | 
 |                        Mouse scroll was detected.  s3 is how frequently to | 
 |                        try to update surrounding scrollbars outside of the | 
 |                        scrolling area (0.0 to disable).  s4 is how long to | 
 |                        buffer pointer motion (to try to get fewer, bigger | 
 |                        mouse scrolls). s5 is the maximum time to spend just | 
 |                        updating the scroll window without updating the rest | 
 |                        of the screen. | 
 |  | 
 | -fixscreen string      Periodically "repair" the screen based on settings | 
 |                        in "string".  Hopefully you won't need this option, | 
 |                        it is intended for cases when the -scrollcopyrect or | 
 |                        -wirecopyrect features leave too many painting errors, | 
 |                        but it can be used for any scenario.  This option | 
 |                        periodically performs costly operations and so | 
 |                        interactive response may be reduced when it is on. | 
 |                        You can use 3 Alt_L's (the Left "Alt" key) taps in | 
 |                        a row (as described under -scrollcopyrect) instead to | 
 |                        manually request a screen repaint when it is needed. | 
 |  | 
 |                        "string" is a comma separated list of one or more of | 
 |                        the following: "V=t", "C=t", "X=t", and "8=t". | 
 |                        In these "t" stands for a time in seconds (it is | 
 |                        a floating point even though one should usually use | 
 |                        values > 2 to avoid wasting resources).  V sets how | 
 |                        frequently the entire screen should be sent to viewers | 
 |                        (it is like the 3 Alt_L's).  C sets how long to wait | 
 |                        after a CopyRect to repaint the full screen.  X sets | 
 |                        how frequently to reread the full X11 framebuffer from | 
 |                        the X server and push it out to connected viewers. | 
 |                        Use of X should be rare, please report a bug if you | 
 |                        find you need it. 8= applies only for -8to24 mode: it | 
 |                        sets how often the non-default visual regions of the | 
 |                        screen (e.g. 8bpp windows) are refreshed.  Examples: | 
 |                        -fixscreen V=10 -fixscreen C=10 | 
 |  | 
 | -debug_scroll          Turn on debugging info printout for the scroll | 
 |                        heuristics.  "-ds" is an alias.  Specify it multiple | 
 |                        times for more output. | 
 |  | 
 | -noxrecord             Disable any use of the RECORD extension.  This is | 
 |                        currently used by the -scrollcopyrect scheme and to | 
 |                        monitor X server grabs. | 
 |  | 
 | -grab_buster           Some of the use of the RECORD extension can leave a | 
 | -nograb_buster         tiny window for XGrabServer deadlock.  This is only if | 
 |                        the whole-server grabbing application expects mouse or | 
 |                        keyboard input before releasing the grab.  It is usually | 
 |                        a window manager that does this.  x11vnc takes care to | 
 |                        avoid the problem, but if caught x11vnc will freeze. | 
 |                        Without -grab_buster, the only solution is to go the | 
 |                        physical display and give it some input to satisfy the | 
 |                        grabbing app.  Or manually kill and restart the window | 
 |                        manager if that is feasible.  With -grab_buster, x11vnc | 
 |                        will fork a helper thread and if x11vnc appears to be | 
 |                        stuck in a grab after a period of time (20-30 sec) then | 
 |                        it will inject some user input: button clicks, Escape, | 
 |                        mouse motion, etc to try to break the grab.  If you | 
 |                        experience a lot of grab deadlock, please report a bug. | 
 |  | 
 | -debug_grabs           Turn on debugging info printout with respect to | 
 |                        XGrabServer() deadlock for -scrollcopyrect mode. | 
 |  | 
 | -debug_sel             Turn on debugging info printout with respect to | 
 |                        PRIMARY, CLIPBOARD, and CUTBUFFER0 selections. | 
 |  | 
 | -pointer_mode n        Various pointer motion update schemes. "-pm" is | 
 |                        an alias.  The problem is pointer motion can cause | 
 |                        rapid changes on the screen: consider the rapid | 
 |                        changes when you drag a large window around opaquely. | 
 |                        Neither x11vnc's screen polling and vnc compression | 
 |                        routines nor the bandwidth to the vncviewers can keep | 
 |                        up these rapid screen changes: everything will bog down | 
 |                        when dragging or scrolling.  So a scheme has to be used | 
 |                        to "eat" much of that pointer input before re-polling | 
 |                        the screen and sending out framebuffer updates. The | 
 |                        mode number "n" can be 0 to 4 and selects one of | 
 |                        the schemes desribed below. | 
 |  | 
 |                        Note that the -wireframe and -scrollcopyrect modes | 
 |                        complement -pointer_mode by detecting (and improving) | 
 |                        certain periods of "rapid screen change". | 
 |  | 
 |                        n=0: does the same as -nodragging. (all screen polling | 
 |                        is suspended if a mouse button is pressed.) | 
 |  | 
 |                        n=1: was the original scheme used to about Jan 2004: | 
 |                        it basically just skips -input_skip keyboard or pointer | 
 |                        events before repolling the screen. | 
 |  | 
 |                        n=2 is an improved scheme: by watching the current rate | 
 |                        of input events it tries to detect if it should try to | 
 |                        "eat" additional pointer events before continuing. | 
 |  | 
 |                        n=3 is basically a dynamic -nodragging mode: it detects | 
 |                        when the mouse motion has paused and then refreshes | 
 |                        the display. | 
 |  | 
 |                        n=4 attempts to measures network rates and latency, | 
 |                        the video card read rate, and how many tiles have been | 
 |                        changed on the screen.  From this, it aggressively tries | 
 |                        to push screen "frames" when it decides it has enough | 
 |                        resources to do so.  NOT FINISHED. | 
 |  | 
 |                        The default n is 2. Note that modes 2, 3, 4 will skip | 
 |                        -input_skip keyboard events (but it will not count | 
 |                        pointer events).  Also note that these modes are not | 
 |                        available in -threads mode which has its own pointer | 
 |                        event handling mechanism. | 
 |  | 
 |                        To try out the different pointer modes to see which | 
 |                        one gives the best response for your usage, it is | 
 |                        convenient to use the remote control function, for | 
 |                        example "x11vnc -R pm:4" or the tcl/tk gui (Tuning -> | 
 |                        pointer_mode -> n). | 
 |  | 
 | -input_skip n          For the pointer handling when non-threaded: try to | 
 |                        read n user input events before scanning display. n < 0 | 
 |                        means to act as though there is always user input. | 
 |                        Default: 10 | 
 |  | 
 | -allinput              Have x11vnc read and process all available client input | 
 |                        before proceeding. | 
 |  | 
 | -input_eagerly         Similar to -allinput but use the handleEventsEagerly | 
 |                        mechanism built into LibVNCServer. | 
 |  | 
 | -speeds rd,bw,lat      x11vnc tries to estimate some speed parameters that | 
 |                        are used to optimize scheduling (e.g. -pointer_mode | 
 |                        4, -wireframe, -scrollcopyrect) and other things. | 
 |                        Use the -speeds option to set these manually. | 
 |                        The triple "rd,bw,lat" corresponds to video h/w | 
 |                        read rate in MB/sec, network bandwidth to clients in | 
 |                        KB/sec, and network latency to clients in milliseconds, | 
 |                        respectively.  If a value is left blank, e.g. "-speeds | 
 |                        ,100,15", then the internal scheme is used to estimate | 
 |                        the empty value(s). | 
 |  | 
 |                        Typical PC video cards have read rates of 5-10 MB/sec. | 
 |                        If the framebuffer is in main memory instead of video | 
 |                        h/w (e.g. SunRay, shadowfb, dummy driver, Xvfb), the | 
 |                        read rate may be much faster.  "x11perf -getimage500" | 
 |                        can be used to get a lower bound (remember to factor | 
 |                        in the bytes per pixel).  It is up to you to estimate | 
 |                        the network bandwith and latency to clients.  For the | 
 |                        latency the ping(1) command can be used. | 
 |  | 
 |                        For convenience there are some aliases provided, | 
 |                        e.g. "-speeds modem".  The aliases are: "modem" for | 
 |                        6,4,200; "dsl" for 6,100,50; and "lan" for 6,5000,1 | 
 |  | 
 | -wmdt string           For some features, e.g. -wireframe and -scrollcopyrect, | 
 |                        x11vnc has to work around issues for certain window | 
 |                        managers or desktops (currently kde and xfce). | 
 |                        By default it tries to guess which one, but it can | 
 |                        guess incorrectly.  Use this option to indicate which | 
 |                        wm/dt.  "string" can be "gnome", "kde", "cde", | 
 |                        "xfce", or "root" (classic X wm).  Anything else | 
 |                        is interpreted as "root". | 
 |  | 
 | -debug_pointer         Print debugging output for every pointer event. | 
 | -debug_keyboard        Print debugging output for every keyboard event. | 
 |                        Same as -dp and -dk, respectively.  Use multiple | 
 |                        times for more output. | 
 |  | 
 | -defer time            Time in ms to delay sending updates to connected clients | 
 |                        (deferUpdateTime)  Default: 20 | 
 |  | 
 | -wait time             Time in ms to pause between screen polls.  Used to cut | 
 |                        down on load.  Default: 20 | 
 |  | 
 | -extra_fbur n          Perform extra FrameBufferUpdateRequests checks to | 
 |                        try to be in better sync with the client's requests. | 
 |                        What this does is perform extra polls of the client | 
 |                        socket at critical times (before '-defer' and '-wait' | 
 |                        calls.)  The default is n=1.  Set to a larger number to | 
 |                        insert more checks or set to n=0 to disable.  A downside | 
 |                        of these extra calls is that more mouse input may be | 
 |                        processed than desired. | 
 |  | 
 | -wait_ui factor        Factor by which to cut the -wait time if there | 
 |                        has been recent user input (pointer or keyboard). | 
 |                        Improves response, but increases the load whenever you | 
 |                        are moving the mouse or typing.  Default: 2.00 | 
 | -setdefer n            When the -wait_ui mechanism cuts down the wait time ms, | 
 |                        set the defer time to the same ms value. n=1 to enable, | 
 |                        0 to disable, and -1 to set defer to 0 (no delay). | 
 |                        Similarly, 2 and -2 indicate 'urgent_update' mode should | 
 |                        be used to push the updates even sooner.  Default: 1 | 
 | -nowait_bog            Do not detect if the screen polling is "bogging down" | 
 |                        and sleep more.  Some activities with no user input can | 
 |                        slow things down a lot: consider a large terminal window | 
 |                        with a long build running in it continuously streaming | 
 |                        text output.  By default x11vnc will try to detect this | 
 |                        (3 screen polls in a row each longer than 0.25 sec with | 
 |                        no user input), and sleep up to 1.5 secs to let things | 
 |                        "catch up".  Use this option to disable that detection. | 
 | -slow_fb time          Floating point time in seconds to delay all screen | 
 |                        polling.  For special purpose usage where a low frame | 
 |                        rate is acceptable and desirable, but you want the | 
 |                        user input processed at the normal rate so you cannot | 
 |                        use -wait. | 
 | -xrefresh time         Floating point time in seconds to indicate how often to | 
 |                        do the equivalent of xrefresh(1) to force all windows | 
 |                        (in the viewable area if -id, -sid, or -clip is used) | 
 |                        to repaint themselves.  Use this only if applications | 
 |                        misbehave by not repainting themselves properly. | 
 |                        See also -noxdamage. | 
 | -nap                   Monitor activity and if it is low take longer naps | 
 | -nonap                 between screen polls to really cut down load when idle. | 
 |                        Default: take naps | 
 | -sb time               Time in seconds after NO activity (e.g. screen blank) | 
 |                        to really throttle down the screen polls (i.e. sleep | 
 |                        for about 1.5 secs). Use 0 to disable.  Default: 60 | 
 |                        Set the env. var. X11VNC_SB_FACTOR to scale it. | 
 |  | 
 | -readtimeout n         Set LibVNCServer rfbMaxClientWait to n seconds. On | 
 |                        slow links that take a long time to paint the first | 
 |                        screen LibVNCServer may hit the timeout and drop the | 
 |                        connection.  Default: 20 seconds. | 
 | -ping n                Send a 1x1 framebuffer update to all clients every n | 
 |                        seconds (e.g. to try to keep a network connection alive) | 
 |  | 
 | -nofbpm                If the system supports the FBPM (Frame Buffer Power | 
 | -fbpm                  Management) extension (i.e. some Sun systems), then | 
 |                        prevent the video h/w from going into a reduced power | 
 |                        state when VNC clients are connected. | 
 |  | 
 |                        FBPM capable video h/w save energy when the workstation | 
 |                        is idle by going into low power states (similar to DPMS | 
 |                        for monitors).  This interferes with x11vnc's polling | 
 |                        of the framebuffer data. | 
 |  | 
 |                        "-nofbpm" means prevent FBPM low power states whenever | 
 |                        VNC clients are connected, while "-fbpm" means to not | 
 |                        monitor the FBPM state at all.  See the xset(1) manpage | 
 |                        for details.  -nofbpm is basically the same as running | 
 |                        "xset fbpm force on" periodically.  Default: -fbpm | 
 |  | 
 | -nodpms                If the system supports the DPMS (Display Power Managemen | 
 | t | 
 | -dpms                  Signaling) extension, then prevent the monitor from | 
 |                        going into a reduced power state when VNC clients | 
 |                        are connected. | 
 |  | 
 |                        DPMS reduced power monitor states are a good thing | 
 |                        and you normally want the power down to take place | 
 |                        (usually x11vnc has no problem exporting the display in | 
 |                        this state).  You probably only want to use "-nodpms" | 
 |                        to work around problems with Screen Savers kicking | 
 |                        on in DPMS low power states.  There is known problem | 
 |                        with kdesktop_lock on KDE where the screen saver keeps | 
 |                        kicking in every time user input stops for a second | 
 |                        or two.  Specifying "-nodpms" works around it. | 
 |  | 
 |                        "-nodpms" means prevent DPMS low power states whenever | 
 |                        VNC clients are connected, while "-dpms" means to not | 
 |                        monitor the DPMS state at all.  See the xset(1) manpage | 
 |                        for details.  -nodpms is basically the same as running | 
 |                        "xset dpms force on" periodically.  Default: -dpms | 
 |  | 
 | -forcedpms             If the system supports the DPMS (Display Power | 
 |                        Management Signaling) extension, then try to keep the | 
 |                        monitor in a powered off state.  This is to prevent | 
 |                        nosey people at the physical display from viewing what | 
 |                        is on the screen.  Be sure to lock the screen before | 
 |                        disconnecting. | 
 |  | 
 |                        This method is far from bullet proof, e.g. suppose | 
 |                        someone attaches a non-DPMS monitor, or loads the | 
 |                        machine so that there is a gap of time before x11vnc | 
 |                        restores the powered off state?  On many machines if | 
 |                        he floods it with keyboard and mouse input he can see | 
 |                        flashes of what is on the screen before the DPMS off | 
 |                        state is reestablished.  For this to work securely | 
 |                        there would need to be support in the X server to do | 
 |                        this exactly rather than approximately with DPMS. | 
 |  | 
 | -clientdpms            As -forcedpms but only when VNC clients are connected. | 
 |  | 
 | -noserverdpms          The UltraVNC ServerInput extension is supported. | 
 |                        This allows the VNC viewer to click a button that will | 
 |                        cause the server (x11vnc) to try to disable keyboard | 
 |                        and mouse input at the physical display and put the | 
 |                        monitor in dpms powered off state.  Use this option to | 
 |                        skip powering off the monitor. | 
 |  | 
 | -noultraext            Disable the following UltraVNC extensions: SingleWindow | 
 |                        and ServerInput.  The others managed by LibVNCServer | 
 |                        (textchat, 1/n scaling, rfbEncodingUltra) are not. | 
 |  | 
 | -chatwindow            Place a local UltraVNC chat window on the X11 display | 
 |                        that x11vnc is polling.  That way the person on the VNC | 
 |                        viewer-side can chat with the person at the physical | 
 |                        X11 console. (e.g. helpdesk w/o telephone) | 
 |  | 
 |                        For this to work the SSVNC package (version 1.0.21 or | 
 |                        later) MUST BE installed on the system where x11vnc runs | 
 |                        and the 'ssvnc' command must be available in $PATH. | 
 |                        The ssvncviewer is used as a chat window helper. | 
 |                        See http://www.karlrunge.com/x11vnc/ssvnc.html | 
 |  | 
 |                        This option implies '-rfbversion 3.6' so as to trick | 
 |                        UltraVNC viewers, otherwise they assume chat is not | 
 |                        available.  To specify a different rfbversion, place | 
 |                        it after the -chatwindow option on the cmdline. | 
 |  | 
 |                        See also the remote control 'chaton' and 'chatoff' | 
 |                        actions.  These can also be set from the tkx11vnc GUI. | 
 |  | 
 | -noxdamage             Do not use the X DAMAGE extension to detect framebuffer | 
 |                        changes even if it is available.  Use -xdamage if your | 
 |                        default is to have it off. | 
 |  | 
 |                        x11vnc's use of the DAMAGE extension: 1) significantly | 
 |                        reduces the load when the screen is not changing much, | 
 |                        and 2) detects changed areas (small ones by default) | 
 |                        more quickly. | 
 |  | 
 |                        Currently the DAMAGE extension is overly conservative | 
 |                        and often reports large areas (e.g. a whole terminal | 
 |                        or browser window) as damaged even though the actual | 
 |                        changed region is much smaller (sometimes just a few | 
 |                        pixels).  So heuristics were introduced to skip large | 
 |                        areas and use the damage rectangles only as "hints" | 
 |                        for the traditional scanline polling.  The following | 
 |                        tuning parameters are introduced to adjust this | 
 |                        behavior: | 
 |  | 
 | -xd_area A             Set the largest DAMAGE rectangle area "A" (in | 
 |                        pixels: width * height) to trust as truly damaged: | 
 |                        the rectangle will be copied from the framebuffer | 
 |                        (slow) no matter what.  Set to zero to trust *all* | 
 |                        rectangles. Default: 20000 | 
 | -xd_mem f              Set how long DAMAGE rectangles should be "remembered", | 
 |                        "f" is a floating point number and is in units of the | 
 |                        scanline repeat cycle time (32 iterations).  The default | 
 |                        (1.0) should give no painting problems. Increase it if | 
 |                        there are problems or decrease it to live on the edge | 
 |                        (perhaps useful on a slow machine). | 
 |  | 
 | -sigpipe string        Broken pipe (SIGPIPE) handling.  "string" can be | 
 |                        "ignore" or "exit".  For "ignore" LibVNCServer | 
 |                        will handle the abrupt loss of a client and continue, | 
 |                        for "exit" x11vnc will cleanup and exit at the 1st | 
 |                        broken connection. | 
 |  | 
 |                        This option is not really needed since LibVNCServer | 
 |                        is doing the correct thing now for quite some time. | 
 |                        However, for convenience you can use it to ignore other | 
 |                        signals, e.g. "-sigpipe ignore:HUP,INT,TERM" in case | 
 |                        that would be useful for some sort of application. | 
 |                        You can also put "exit:.." in the list to have x11vnc | 
 |                        cleanup on the listed signals. "-sig" is an alias | 
 |                        for this option if you don't like the 'pipe'. Example: | 
 |                        -sig ignore:INT,TERM,exit:USR1 | 
 |  | 
 | -threads               Whether or not to use the threaded LibVNCServer | 
 | -nothreads             algorithm [rfbRunEventLoop] if libpthread is available. | 
 |                        In this mode new threads (one for input and one | 
 |                        for output) are created to handle each new client. | 
 |                        Default: -nothreads. | 
 |  | 
 |                        Thread stability is much improved in version 0.9.8. | 
 |  | 
 |                        Multiple clients in threaded mode should be stable | 
 |                        for the ZRLE encoding on all platforms.  The Tight and | 
 |                        Zlib encodings are currently only stable on Linux for | 
 |                        multiple clients.  Compile with -DTLS=__thread if your | 
 |                        OS and compiler and linker support it. | 
 |  | 
 |                        For resizes (randr, etc.) set this env. var. to the numb | 
 | er | 
 |                        of milliseconds to sleep: X11VNC_THREADS_NEW_FB_SLEEP | 
 |                        at various places in the do_new_fb() action.  This is to | 
 |                        let various activities settle.  Default is about 500ms. | 
 |  | 
 |                        Multiple clients in threaded mode could yield better | 
 |                        performance for 'class-room' broadcasting usage; also in | 
 |                        -appshare broadcast mode.  See also the -reflect option. | 
 |  | 
 | -fs f                  If the fraction of changed tiles in a poll is greater | 
 |                        than f, the whole screen is updated.  Default: 0.75 | 
 | -gaps n                Heuristic to fill in gaps in rows or cols of n or | 
 |                        less tiles.  Used to improve text paging.  Default: 4 | 
 | -grow n                Heuristic to grow islands of changed tiles n or wider | 
 |                        by checking the tile near the boundary.  Default: 3 | 
 | -fuzz n                Tolerance in pixels to mark a tiles edges as changed. | 
 |                        Default: 2 | 
 | -debug_tiles           Print debugging output for tiles, fb updates, etc. | 
 |  | 
 | -snapfb                Instead of polling the X display framebuffer (fb) | 
 |                        for changes, periodically copy all of X display fb | 
 |                        into main memory and examine that copy for changes. | 
 |                        (This setting also applies for non-X -rawfb modes). | 
 |                        Under some circumstances this will improve interactive | 
 |                        response, or at least make things look smoother, but in | 
 |                        others (most!) it will make the response worse.  If the | 
 |                        video h/w fb is such that reading small tiles is very | 
 |                        slow this mode could help.  To keep the "framerate" | 
 |                        up the screen size x bpp cannot be too large.  Note that | 
 |                        this mode is very wasteful of memory I/O resources | 
 |                        (it makes full screen copies even if nothing changes). | 
 |                        It may be of use in video capture-like applications, | 
 |                        webcams, or where window tearing is a problem. | 
 |  | 
 | -rawfb string          Instead of polling X, poll the memory object specified | 
 |                        in "string". | 
 |  | 
 |                        For file polling, to memory map mmap(2) a file use: | 
 |                        "map:/path/to/a/file@WxHxB", with framebuffer Width, | 
 |                        Height, and Bits per pixel.  "mmap:..." is the | 
 |                        same. | 
 |  | 
 |                        If there is trouble with mmap, use "file:/..." | 
 |                        for slower lseek(2) based reading. | 
 |  | 
 |                        Use "snap:..." to imply -snapfb mode and the "file:" | 
 |                        access (this is for unseekable devices that only provide | 
 |                        the fb all at once, e.g. a video camera provides the | 
 |                        whole frame). | 
 |  | 
 |                        For shared memory segments string is of the form: | 
 |                        "shm:N@WxHxB" which specifies a shmid N and with | 
 |                        WxHxB as above.  See shmat(1) and ipcs(1) | 
 |  | 
 |                        If you do not supply a type "map" is assumed if | 
 |                        the file exists (see the next paragraphs for some | 
 |                        exceptions to this.) | 
 |  | 
 |                        If string is "setup:cmd", then the command "cmd" | 
 |                        is run and the first line from it is read and used | 
 |                        as "string".  This allows initializing the device, | 
 |                        determining WxHxB, etc. These are often done as root | 
 |                        so take care. | 
 |  | 
 |                        If the string begins with "video", see the VIDEO4LINUX | 
 |                        discussion below where the device may be queried for | 
 |                        (and possibly set) the framebuffer parameters. | 
 |  | 
 |                        If the string begins with "console", "/dev/fb", | 
 |                        "fb", or "vt", see the LINUX CONSOLE discussion | 
 |                        below where the framebuffer device is opened and | 
 |                        keystrokes (and possibly mouse events) are inserted | 
 |                        into the console. | 
 |  | 
 |                        If the string begins with "vnc", see the VNC HOST | 
 |                        discussion below where the framebuffer is taken as that | 
 |                        of another remote VNC server. | 
 |  | 
 |                        Optional suffixes are ":R/G/B" and "+O" to specify | 
 |                        red, green, and blue masks (in hex) and an offset into | 
 |                        the memory object.  If the masks are not provided x11vnc | 
 |                        guesses them based on the bpp (if the colors look wrong, | 
 |                        you need to provide the masks.) | 
 |  | 
 |                        Another optional suffix is the Bytes Per Line which in | 
 |                        some cases is not WxB/8.  Specify it as WxHxB-BPL | 
 |                        e.g. 800x600x16-2048.  This could be a normal width | 
 |                        1024 at 16bpp fb, but only width 800 shows up. | 
 |  | 
 |                        So the full format is: mode:file@WxHxB:R/G/B+O-BPL | 
 |  | 
 |                        Examples: | 
 |                            -rawfb shm:210337933@800x600x32:ff/ff00/ff0000 | 
 |                            -rawfb map:/dev/fb0@1024x768x32 | 
 |                            -rawfb map:/tmp/Xvfb_screen0@640x480x8+3232 | 
 |                            -rawfb file:/tmp/my.pnm@250x200x24+37 | 
 |                            -rawfb file:/dev/urandom@128x128x8 | 
 |                            -rawfb snap:/dev/video0@320x240x24 -24to32 | 
 |                            -rawfb video0 | 
 |                            -rawfb video -pipeinput VID | 
 |                            -rawfb console | 
 |                            -rawfb vt2 | 
 |                            -rawfb vnc:somehost:0 | 
 |  | 
 |                        (see ipcs(1) and fbset(1) for the first two examples) | 
 |  | 
 |                        In general all user input is discarded by default (see | 
 |                        the -pipeinput option for how to use a helper program | 
 |                        to insert).  Most of the X11 (screen, keyboard, mouse) | 
 |                        options do not make sense and many will cause this | 
 |                        mode to crash, so please think twice before setting or | 
 |                        changing them in a running x11vnc. | 
 |  | 
 |                        If you DO NOT want x11vnc to close the X DISPLAY in | 
 |                        rawfb mode, prepend a "+" e.g. +file:/dev/fb0... | 
 |                        Keeping the display open enables the default | 
 |                        remote-control channel, which could be useful. | 
 |                        Alternatively, if you specify -noviewonly, then the | 
 |                        mouse and keyboard input are STILL sent to the X | 
 |                        display, this usage should be very rare, i.e. doing | 
 |                        something strange with /dev/fb0. | 
 |  | 
 |                        If the device is not "seekable" (e.g. webcam) try | 
 |                        reading it all at once in full snaps via the "snap:" | 
 |                        mode (note: this is a resource hog).  If you are using | 
 |                        file: or map: AND the device needs to be reopened for | 
 |                        *every* snapfb snapshot, set the environment variable: | 
 |                        SNAPFB_RAWFB_RESET=1 as well. | 
 |  | 
 |                        If you want x11vnc to dynamically transform a 24bpp | 
 |                        rawfb to 32bpp (note that this will be slower) also | 
 |                        supply the -24to32 option.  This would be useful for, | 
 |                        say, a video camera that delivers the pixel data as | 
 |                        24bpp packed RGB.  This is the default under "video" | 
 |                        mode if the bpp is 24. | 
 |  | 
 |                        Normally the bits per pixel, B, is 8, 16, or 32 (or | 
 |                        rarely 24), however there is also some support for | 
 |                        B < 8 (e.g. old graphics displays 4 bpp or 1 bpp). | 
 |                        In this case you certainly must supply the masks as | 
 |                        well: WxHxB:R/G/B.  The pixels will be padded out to | 
 |                        8 bpp using depth 8 truecolor.  The scheme currently | 
 |                        does not work with snap fb (ask if interested.) B=1 | 
 |                        monochrome example: file:/dev/urandom@128x128x1:1/1/1 | 
 |                        Some other like this are 128x128x2:3/3/3 128x128x4:7/7/7 | 
 |  | 
 |                        For B < 8 framebuffers you can also set the env. var | 
 |                        RAWFB_CGA=1 to try a CGA mapping for B=4 (e.g. linux | 
 |                        vga16fb driver.)  Note with low bpp and/or resolution | 
 |                        VGA and VGA16 modes on the Linux console one's attempt | 
 |                        to export them via x11vnc can often be thwarted due to | 
 |                        special color palettes, pixel packings, and even video | 
 |                        painting buffering.  OTOH, often experimenting with the | 
 |                        RGB masks can yield something recognizable. | 
 |  | 
 |                        VIDEO4LINUX: on Linux some attempt is made to handle | 
 |                        video devices (webcams or TV tuners) automatically. | 
 |                        The idea is the WxHxB will be extracted from the | 
 |                        device itself.  So if you do not supply "@WxHxB... | 
 |                        parameters x11vnc will try to determine them.  It first | 
 |                        tries the v4l API if that support has been compiled in. | 
 |                        Otherwise it will run the v4l-info(1) external program | 
 |                        if it is available. | 
 |  | 
 |                        The simplest examples are "-rawfb video" and "-rawfb | 
 |                        video1" which imply the device file /dev/video and | 
 |                        /dev/video1, respectively.  You can also supply the | 
 |                        /dev if you like, e.g. "-rawfb /dev/video0" | 
 |  | 
 |                        Since the video capture device framebuffer usually | 
 |                        changes continuously (e.g. brightness fluctuations), | 
 |                        you may want to use the -wait, -slow_fb, or -defer | 
 |                        options to lower the "framerate" to cut down on | 
 |                        network VNC traffic. | 
 |  | 
 |                        A more sophisticated video device scheme allows | 
 |                        initializing the device's settings using: | 
 |  | 
 |                            -rawfb video:<settings> | 
 |  | 
 |                        The prefix could also be, as above, e.g. "video1:" to | 
 |                        specify the device file.  The v4l API must be available | 
 |                        for this to work.  Otherwise, you will need to try | 
 |                        to initialize the device with an external program, | 
 |                        e.g. xawtv, spcaview, and hope they persist when x11vnc | 
 |                        re-opens the device. | 
 |  | 
 |                        <settings> is a comma separated list of key=value pairs. | 
 |                        The device's brightness, color, contrast, and hue can | 
 |                        be set to percentages, e.g. br=80,co=50,cn=44,hu=60. | 
 |  | 
 |                        The device filename can be set too if needed (if it | 
 |                        does not start with "video"), e.g. fn=/dev/qcam. | 
 |  | 
 |                        The width, height and bpp of the framebuffer can be | 
 |                        set via, e.g., w=160,h=120,bpp=16. | 
 |  | 
 |                        Related to the bpp above, the pixel format can be set | 
 |                        via the fmt=XXX, where XXX can be one of: GREY, HI240, | 
 |                        RGB555, RGB565, RGB24, and RGB32 (with bpp 8, 8, 16, 16, | 
 |                        24, and 32 respectively).  See http://www.linuxtv.org | 
 |                        for more info (V4L api). | 
 |  | 
 |                        For TV/rf tuner cards one can set the tuning mode | 
 |                        via tun=XXX where XXX can be one of PAL, NTSC, SECAM, | 
 |                        or AUTO. | 
 |  | 
 |                        One can switch the input channel by the inp=XXX setting, | 
 |                        where XXX is the name of the input channel (Television, | 
 |                        Composite1, S-Video, etc).  Use the name that is in the | 
 |                        information about the device that is printed at startup. | 
 |  | 
 |                        For input channels with tuners (e.g. Television) one | 
 |                        can change which station is selected by the sta=XXX | 
 |                        setting.  XXX is the station number.  Currently only | 
 |                        the ntsc-cable-us (US cable) channels are built into | 
 |                        x11vnc.  See the -freqtab option below to supply one | 
 |                        from xawtv. If XXX is greater than 500, then it is | 
 |                        interpreted as a raw frequency in KHz. | 
 |  | 
 |                        Example: | 
 |  | 
 |                        -rawfb video:br=80,w=320,h=240,fmt=RGB32,tun=NTSC,sta=47 | 
 |  | 
 |                        one might need to add inp=Television too for the input | 
 |                        channel to be TV if the card doesn't come up by default | 
 |                        in that one. | 
 |  | 
 |                        Note that not all video capture devices will support | 
 |                        all of the above settings. | 
 |  | 
 |                        See the -pipeinput VID option below for a way to control | 
 |                        the settings through the VNC Viewer via keystrokes. | 
 |                        As a shortcut, if the string begins "Video.." instead | 
 |                        of "video.." then -pipeinput VID is implied. | 
 |  | 
 |                        As above, if you specify a "@WxHxB..." after the | 
 |                        <settings> string they are used verbatim: the device | 
 |                        is not queried for the current values.  Otherwise the | 
 |                        device will be queried. | 
 |  | 
 |                        LINUX CONSOLE:  The following describes some ways to | 
 |                        view and possibly interact with the Linux text/graphics | 
 |                        console (i.e. not X11 XFree86/Xorg) | 
 |  | 
 |                        Note: If the LibVNCServer LinuxVNC program is on your | 
 |                        system you may want to use that instead of the following | 
 |                        method because it will be faster and more accurate | 
 |                        for the Linux text console and includes mouse support. | 
 |                        There is, however, the basic LinuxVNC functionality in | 
 |                        x11vnc if you replace "console" with "vt" in the | 
 |                        examples below. | 
 |  | 
 |                        If the rawfb string begins with "console" the | 
 |                        framebuffer device /dev/fb0 is opened and /dev/tty0 is | 
 |                        opened too.  The latter is used to inject keystrokes | 
 |                        (not all are supported, but the basic ones are). | 
 |                        You will need to be root to inject keystrokes, but | 
 |                        not necessarily to open /dev/fb0.  /dev/tty0 refers to | 
 |                        the active VT, to indicate one explicitly, use, e.g., | 
 |                        "console2" for /dev/tty2, etc. by indicating the | 
 |                        specific VT number. | 
 |  | 
 |                        For the Linux framebuffer device, /dev/fb0, (fb1, | 
 |                        etc) to be enabled the appropriate kernel drivers must | 
 |                        be loaded.  E.g. vesafb or vga16fb and also by setting | 
 |                        the boot parameter vga=0x301 (or 0x314, 0x317, etc.) | 
 |                        (The vga=... method is the preferred way; set your | 
 |                        machines up that way.)  Otherwise there will be a | 
 |                        'No such device' error.  You can also load a Linux | 
 |                        framebuffer driver specific to your make of video card | 
 |                        for more functionality.  Once the machine is booted one | 
 |                        can often 'modprobe' the fb driver as root to obtain | 
 |                        a framebuffer device. | 
 |  | 
 |                        If you cannot get /dev/fb0 working on Linux, try | 
 |                        using the LinuxVNC emulation mode by "-rawfb vtN" | 
 |                        where N = 1, ... 6 is the Linux Virtual Terminal (aka | 
 |                        virtual console) you wish to view, e.g. "-rawfb vt2". | 
 |                        Unlike /dev/fb mode, it need not be the active Virtual | 
 |                        Terminal.  Note that this mode can only show text and | 
 |                        not graphics.  x11vnc polls the text in /dev/vcsaN | 
 |  | 
 |                        Set the env. var. RAWFB_VCSA_BW=1 to disable colors in | 
 |                        the "vtN" mode (i.e. black and white only.)  If you | 
 |                        do not prefer the default 16bpp set RAWFB_VCSA_BPP to | 
 |                        8 or 32.  If you need to tweak the rawfb parameters by | 
 |                        using the 'console_guess' string printed at startup, | 
 |                        be sure to indicate the snap: method. | 
 |  | 
 |                        uinput: If the Linux version appears to be 2.6 | 
 |                        or later and the "uinput" module appears to be | 
 |                        present (modprobe uinput), then the uinput method | 
 |                        will be used instead of /dev/ttyN.  uinput allows | 
 |                        insertion of BOTH keystrokes and mouse input and so it | 
 |                        preferred when accessing graphical (e.g. QT-embedded) | 
 |                        linux console apps.  It also provides more accurate | 
 |                        keystroke insertion.  See -pipeinput UINPUT below for | 
 |                        more information on this mode; you will have to use | 
 |                        -pipeinput if you want to tweak any UINPUT parameters. | 
 |                        You may also want to also use the -nodragging and | 
 |                        -cursor none options.  Use "console0", etc  or | 
 |                        -pipeinput CONSOLE to force the /dev/ttyN method. | 
 |  | 
 |                        Note you can change the Linux VT remotely using the | 
 |                        chvt(1) command to make the one you want be the active | 
 |                        one (e.g. 'chvt 3').  Sometimes switching out and back | 
 |                        corrects the framebuffer's graphics state.  For the | 
 |                        "-rawfb vtN" mode there is no need to switch the VT's. | 
 |  | 
 |                        To skip input injecting entirely use "consolex" | 
 |                        or "vtx". | 
 |  | 
 |                        The string "/dev/fb0" (1, etc.) can be used instead | 
 |                        of "console".  This can be used to specify a different | 
 |                        framebuffer device, e.g. /dev/fb1.  As a shortcut the | 
 |                        "/dev/" can be dropped.  If the name is something | 
 |                        nonstandard, use "console:/dev/foofb" | 
 |  | 
 |                        If you do not want x11vnc to guess the framebuffer's | 
 |                        WxHxB and masks automatically (sometimes the kernel | 
 |                        gives incorrect information), specify them with a @WxHxB | 
 |                        (and optional :R/G/B masks) at the end of the string. | 
 |  | 
 |                        Examples: | 
 |                            -rawfb console | 
 |                            -rawfb /dev/fb0           (same) | 
 |                            -rawfb console3           (force /dev/tty3) | 
 |                            -rawfb consolex           (no keystrokes or mouse) | 
 |                            -rawfb console:/dev/nonstd | 
 |                            -rawfb console -pipeinput UINPUT:accel=4.0 | 
 |                            -rawfb vt3                (/dev/tty3 w/o /dev/fb0) | 
 |  | 
 |                        VNC HOST: if the -rawfb string is of the form | 
 |                        "vnc:host:N" then the VNC display "N" on the remote | 
 |                        VNC server "host" is connected to (i.e. x11vnc acts as | 
 |                        a VNC client itself) and that framebuffer is exported. | 
 |  | 
 |                        This mode is really only of use if you are trying | 
 |                        to improve performance in the case of many (e.g. > | 
 |                        10) simultaneous VNC viewers, and you try a divide | 
 |                        and conquer scheme to reduce bandwidth and improve | 
 |                        responsiveness.  (However, another user found this mode | 
 |                        useful to export a demo display through a slow link: | 
 |                        then multiple demo viewers connected to the reflecting | 
 |                        x11vnc on the fast side of the link, and so avoided | 
 |                        all of the demo viewers going through the slow link.) | 
 |  | 
 |                        For example, if there will be 64 simultaneous VNC | 
 |                        viewers this can lead to a lot of redundant VNC traffic | 
 |                        to and from the server host:N, extra CPU usage, | 
 |                        and all viewers response can be reduced by having | 
 |                        to wait for writes to the slowest client to finish. | 
 |                        However, if you set up 8 reflectors/repeaters started | 
 |                        with option -rawfb vnc:host:N, then there are only | 
 |                        8 connections to host:N.  Each repeater then handles | 
 |                        8 vnc viewer connections thereby spreading the load | 
 |                        around.  In classroom broadcast usage, try to put the | 
 |                        repeaters on different switches.  This mode is the same | 
 |                        as -reflect host:N.  Replace "host:N" by "listen" | 
 |                        or "listen:port" for a reverse connection. | 
 |  | 
 |                        Overall performance will not be as good as a single | 
 |                        direct connection because, among other things, | 
 |                        there is an additional level of framebuffer polling | 
 |                        and pointer motion can still induce many changes per | 
 |                        second that must be propagated.  Tip: if the remote VNC | 
 |                        is x11vnc doing wireframing, or an X display that does | 
 |                        wireframing that gives much better response than opaque | 
 |                        window dragging.  Consider the -nodragging option if | 
 |                        the problem is severe. | 
 |  | 
 |                        The env. var. X11VNC_REFLECT_PASSWORD can be set to | 
 |                        the password needed to log into the vnc host server, or | 
 |                        to "file:path_to_file" to indicate a file containing | 
 |                        the password as its first line. | 
 |  | 
 |                        To set the pixel format that x11vnc requests as a VNC | 
 |                        CLIENT set the env. vars: X11VNC_REFLECT_bitsPerSample | 
 |                        X11VNC_REFLECT_samplesPerPixel, and | 
 |                        X11VNC_REFLECT_bytesPerPixel; the defaults are 8, 3, 4. | 
 |                        2, 3, 1 would give a low color mode.  See the function | 
 |                        rfbGetClient() in libvncclient for more info. | 
 |  | 
 |                        The VNC HOST mode implies -shared.  Use -noshared as | 
 |                        a subsequent cmdline option to disable sharing. | 
 |  | 
 | -freqtab file          For use with "-rawfb video" for TV tuner devices to | 
 |                        specify station frequencies.  Instead of using the built | 
 |                        in ntsc-cable-us mapping of station number to frequency, | 
 |                        use the data in file.  For stations that are not | 
 |                        numeric, e.g. SE20, they are placed above the highest | 
 |                        numbered station in the order they are found.  Example: | 
 |                        "-freqtab /usr/X11R6/share/xawtv/europe-west.list" | 
 |                        You can make your own freqtab by copying the xawtv | 
 |                        format. | 
 |  | 
 | -pipeinput cmd         This option lets you supply an external command in | 
 |                        "cmd" that x11vnc will pipe all of the user input | 
 |                        events to in a simple format.  In -pipeinput mode by | 
 |                        default x11vnc will not process any of the user input | 
 |                        events.  If you prefix "cmd" with "tee:" it will | 
 |                        both send them to the pipe command and process them. | 
 |                        For a description of the format run "-pipeinput | 
 |                        tee:/bin/cat".  Another prefix is "reopen" which | 
 |                        means to reopen pipe if it exits.  Separate multiple | 
 |                        prefixes with commas. | 
 |  | 
 |                        In combination with -rawfb one might be able to | 
 |                        do amusing things (e.g. control non-X devices). | 
 |                        To facilitate this, if -rawfb is in effect then the | 
 |                        value is stored in X11VNC_RAWFB_STR for the pipe command | 
 |                        to use if it wants. Do 'env | grep X11VNC' for more. | 
 |  | 
 |                        Built-in pipeinput modes (no external program required): | 
 |  | 
 |                        If cmd is "VID" and you are using the -rawfb for a | 
 |                        video capture device, then an internal list of keyboard | 
 |                        mappings is used to set parameters of the video. | 
 |                        The mappings are: | 
 |  | 
 |                          "B" and "b" adjust the brightness up and down. | 
 |                          "H" and "h" adjust the hue. | 
 |                          "C" and "c" adjust the colour. | 
 |                          "N" and "n" adjust the contrast. | 
 |                          "S" and "s" adjust the size of the capture screen. | 
 |                          "I" and "i" cycle through input channels. | 
 |                          Up and Down arrows adjust the station (if a tuner) | 
 |                          F1, F2, ..., F6 will switch the video capture pixel | 
 |                          format to HI240, RGB565, RGB24, RGB32, RGB555, and | 
 |                          GREY respectively.  See -rawfb video for details. | 
 |  | 
 |                        If cmd is "CONSOLE" or "CONSOLEn" where n | 
 |                        is a Linux console number, then the linux console | 
 |                        keystroke insertion to /dev/ttyN (see -rawfb console) | 
 |                        is performed. | 
 |  | 
 |                        If cmd begins with "UINPUT" then the Linux uinput | 
 |                        module is used to insert both keystroke and mouse events | 
 |                        to the Linux console (see -rawfb above).  This usually | 
 |                        is the /dev/input/uinput device file (you may need to | 
 |                        create it with "mknod /dev/input/uinput c 10 223" | 
 |                        and insert the module with "modprobe uinput". | 
 |  | 
 |                        The UINPUT mode currently only does US keyboards (a | 
 |                        scan code option may be added), and not all keysyms | 
 |                        are supported.  But it is probably more accurate than | 
 |                        the "CONSOLE" method. | 
 |  | 
 |                        You may want to use the options -cursor none and | 
 |                        -nodragging in this mode. | 
 |  | 
 |                        Additional tuning options may be supplied via: | 
 |                        UINPUT:opt1,opt2,... (a comma separated list). If an | 
 |                        option begins with "/" it is taken as the uinput | 
 |                        device file. | 
 |  | 
 |                        Which uinput is injected can be controlled by an option | 
 |                        string made of the characters "K", "M", and "B" | 
 |                        (see the -input option), e.g. "KM" allows keystroke | 
 |                        and motion but not button clicks. | 
 |  | 
 |                        A UINPUT option of the form: accel=f, or accel=fx+fy | 
 |                        sets the mouse motion "acceleration".  This is used | 
 |                        to correct raw mouse relative motion into how much the | 
 |                        application cursor moves (x11vnc has no control over, | 
 |                        or knowledge of how the windowing application interprets | 
 |                        the raw mouse motions).  Typically the acceleration | 
 |                        for an X display is 2 (see xset "m" option).  "f" | 
 |                        is a floating point number, e.g. 3.0.  Use "fx+fy" | 
 |                        if you need to supply different corrections for x and y. | 
 |  | 
 |                        Note: the default acceleration is 2.0 since it seems | 
 |                        both X and qt-embedded often (but not always) use | 
 |                        this value. | 
 |  | 
 |                        Even with a correct accel setting the mouse position | 
 |                        will get out of sync (probably due to a mouse | 
 |                        "threshold" setting where the acceleration doe not | 
 |                        apply, set xset(1)).  The option reset=N sets the | 
 |                        number of ms (default 150) after which the cursor is | 
 |                        attempted to be reset (by forcing the mouse to (0, | 
 |                        0) via small increments and then back out to (x, y) | 
 |                        in 1 jump), This correction seems to be needed but can | 
 |                        cause jerkiness or unexpected behavior with menus, etc. | 
 |                        Use reset=0 to disable. | 
 |  | 
 |                        If you set the env. var X11VNC_UINPUT_THRESHOLDS then | 
 |                        the thresh=n mode will be enabled.  It is currently | 
 |                        not working well.  If |dx| <= thresh and |dy| < thresh | 
 |                        no acceleration is applied.  Use "thresh=+n" |dx| + | 
 |                        |dy| < thresh to be used instead (X11?) | 
 |  | 
 |                        Example: | 
 |                            -pipeinput UINPUT:accel=4.0 -cursor none | 
 |  | 
 |                        If the uinput device has an absolute pointer (as opposed | 
 |                        to a normal mouse that is a relative pointer) you can | 
 |                        specify the option "abs".  Note that a touchpad | 
 |                        on a laptop is an absolute device to some degree. | 
 |                        This (usually) avoids all the problems with mouse | 
 |                        acceleration.  If x11vnc has trouble deducing the | 
 |                        size of the device, use "abs=WxH".  Furthermore, | 
 |                        if the device is a touchscreen (assumed to have an | 
 |                        absolute pointer) use "touch" or "touch=WxH". | 
 |                        For touchscreens, when a mouse button is pressed, | 
 |                        a pressure increase is injected, and when the button | 
 |                        is released a pressure of zero is injected. | 
 |  | 
 |                        If touch has been set, use "touch_always=1" to | 
 |                        indicate whenever the mouse moves with no button | 
 |                        pressed, a touch event of zero pressure should be | 
 |                        sent anyway.  Also use "btn_touch=1" to indicate a | 
 |                        BTN_TOUCH keystroke press or release should be sent | 
 |                        instead of a pressure change.  Set "dragskip=n" to | 
 |                        skip n dragged mouse touches (with pressure applied) | 
 |                        before injecting one.  To indicate the pressure that | 
 |                        should be sent when there is a button click for a | 
 |                        touchscreen device, specify pressure=n, e.g. n=5. The | 
 |                        default is n=1. | 
 |  | 
 |                        If a touch screen is being used ("touch" above) | 
 |                        and it is having its input processed by tslib, you can | 
 |                        specify the tslib calibration file via tslib_cal=<file>. | 
 |                        For example, tslib_cal=/etc/pointercal.  To get accurate | 
 |                        or even usable positioning this is required when tslib | 
 |                        is in use. | 
 |  | 
 |                        The Linux uinput mechanism can be bypassed and one can | 
 |                        write input events DIRECTLY to the devices instead. | 
 |                        To do this, specify one or more of the following | 
 |                        for the input classes: direct_rel=<device> | 
 |                        direct_abs=<device> direct_btn=<device> or | 
 |                        direct_key=<device>.  The <device> file is usually | 
 |                        something like /dev/input/event1 but you can specify | 
 |                        any device file or pipe.  You must specify each one | 
 |                        of the above classes even if they correspond to the | 
 |                        same device file (rel/abs and btn are often the same.) | 
 |                        Look at the file /proc/bus/input/devices to get an idea | 
 |                        what is available and the device filenames.  Note: | 
 |                        The /dev/input/mouse* devices do not seem to work, | 
 |                        use the corresponding /dev/input/event* file instead. | 
 |                        Any input class not directly specified as above will be | 
 |                        handled via the uinput mechanism.  To disable creating a | 
 |                        uinput device (and thereby discarding unhandled input), | 
 |                        specify "nouinput". | 
 |  | 
 |                        Examples: | 
 |  | 
 |                          -pipeinput UINPUT:direct_abs=/dev/input/event1 | 
 |  | 
 |                        this was used on a qtmoko Neo freerunner (armel): | 
 |  | 
 |                          -pipeinput UINPUT:touch,tslib_cal=/etc/pointercal, | 
 |                           direct_abs=/dev/input/event1,nouinput,dragskip=4 | 
 |  | 
 |                        (where the long line has been split into two.) | 
 |  | 
 |                        You can set the env. var X11VNC_UINPUT_DEBUG=1 or higher | 
 |                        to get debugging output for UINPUT mode. | 
 |  | 
 | -macnodim              For the native MacOSX server, disable dimming. | 
 | -macnosleep            For the native MacOSX server, disable display sleep. | 
 | -macnosaver            For the native MacOSX server, disable screensaver. | 
 | -macnowait             For the native MacOSX server, do not wait for the | 
 |                        user to switch back to his display. | 
 | -macwheel n            For the native MacOSX server, set the mouse wheel | 
 |                        speed to n (default 5). | 
 | -macnoswap             For the native MacOSX server, do not swap mouse | 
 |                        buttons 2 and 3. | 
 | -macnoresize           For the native MacOSX server, do not resize or reset | 
 |                        the framebuffer even if it is detected that the screen | 
 |                        resolution or depth has changed. | 
 | -maciconanim n         For the native MacOSX server, set n to the number | 
 |                        of milliseconds that the window iconify/deiconify | 
 |                        animation takes.  In -ncache mode this value will be | 
 |                        used to skip the animation if possible. (default 400) | 
 | -macmenu               For the native MacOSX server, in -ncache client-side | 
 |                        caching mode, try to cache pull down menus (not perfect | 
 |                        because they have animated fades, etc.) | 
 | -macuskbd              For the native MacOSX server, use the original | 
 |                        keystroke insertion code based on a US keyboard. | 
 | -macnoopengl           For the native MacOSX server, do not use OpenGL for | 
 |                        screen capture, but rather use the original, deprecated | 
 |                        raw memory access method: addr = CGDisplayBaseAddress(). | 
 | -macnorawfb            For the native MacOSX server, disable the raw memory | 
 |                        address screen capture method. | 
 |  | 
 |                        MACOSX NOTE: There are some deprecated MacOSX interfaces | 
 |                        to inject keyboard and mouse events and the raw memory | 
 |                        access method is deprecated as well (however, OpenGL | 
 |                        will be preferred if available because it is faster.) | 
 |                        One can force not using any deprecated interfaces at | 
 |                        compile time by setting -DX11VNC_MACOSX_NO_DEPRECATED=1 | 
 |                        in CPPFLAGS.  Or to turn them off one by one: | 
 |                        -DX11VNC_MACOSX_NO_DEPRECATED_LOCALEVENTS=1, | 
 |                        -DX11VNC_MACOSX_NO_DEPRECATED_POSTEVENTS=1 or | 
 |                        -DX11VNC_MACOSX_NO_DEPRECATED_FRAMEBUFFER=1 | 
 |                        At run time, for testing and workarounds, one can | 
 |                        disable them by using: | 
 |                        -env X11VNC_MACOSX_NO_DEPRECATED=1 | 
 |                        -env X11VNC_MACOSX_NO_DEPRECATED_LOCALEVENTS=1 | 
 |                        -env X11VNC_MACOSX_NO_DEPRECATED_POSTEVENTS=1 or | 
 |                        -env X11VNC_MACOSX_NO_DEPRECATED_FRAMEBUFFER=1 | 
 |                        Note: When doing either of these for the mouse input | 
 |                        not everything works currently, e.g. double clicks and | 
 |                        wireframing.  Also, screen resolution and pixel depth | 
 |                        changes will not be automatically detected unless the | 
 |                        deprecated framebuffer interfaces are allowed. | 
 |  | 
 |                        Conversely, if you are compiling on an | 
 |                        older machine that does not have some of | 
 |                        the newer interfaces, you may need to specify | 
 |                        -DX11VNC_MACOSX_NO_CGEVENTCREATESCROLLWHEELEVENT | 
 |                        -DX11VNC_MACOSX_NO_CGEVENTCREATEMOUSEEVENT or | 
 |                        -DX11VNC_MACOSX_NO_CGEVENTCREATEKEYBOARDEVENT.  Use | 
 |                        -DX11VNC_MACOSX_USE_GETMAINDEVICE to regain the very | 
 |                        old QuickDraw GetMainDevice() interface (rare...) | 
 |  | 
 | -gui [gui-opts]        Start up a simple tcl/tk gui based on the remote | 
 |                        control options -remote/-query described below. | 
 |                        Requires the "wish" program to be installed on the | 
 |                        machine.  "gui-opts" is not required: the default | 
 |                        is to start up both the full gui and x11vnc with the | 
 |                        gui showing up on the X display in the environment | 
 |                        variable DISPLAY. | 
 |  | 
 |                        "gui-opts" can be a comma separated list of items. | 
 |                        Currently there are these types of items: 1) a gui | 
 |                        mode, a 2) gui "simplicity", 3) the X display the | 
 |                        gui should display on, 4) a "tray" or "icon" mode, | 
 |                        and 5) a gui geometry. | 
 |  | 
 |                        1) The gui mode can be "start", "conn", or "wait" | 
 |                        "start" is the default mode above and is not required. | 
 |                        "conn" means do not automatically start up x11vnc, | 
 |                        but instead just try to connect to an existing x11vnc | 
 |                        process.  "wait" means just start the gui and nothing | 
 |                        else (you will later instruct the gui to start x11vnc | 
 |                        or connect to an existing one.) | 
 |  | 
 |                        2) The gui simplicity is off by default (a power-user | 
 |                        gui with all options is presented) To start with | 
 |                        something less daunting supply the string "simple" | 
 |                        ("ez" is an alias for this).  Once the gui is | 
 |                        started you can toggle between the two with "Misc -> | 
 |                        simple_gui". | 
 |  | 
 |                        3) Note the possible confusion regarding the potentially | 
 |                        two different X displays: x11vnc polls one, but you | 
 |                        may want the gui to appear on another.  For example, if | 
 |                        you ssh in and x11vnc is not running yet you may want | 
 |                        the gui to come back to you via your ssh redirected X | 
 |                        display (e.g. localhost:10). | 
 |  | 
 |                        If you do not specify a gui X display in "gui-opts" | 
 |                        then the DISPLAY environment variable and -display | 
 |                        option are tried (in that order).  Regarding the x11vnc | 
 |                        X display the gui will try to communication with, it | 
 |                        first tries -display and then DISPLAY.  For example, | 
 |                        "x11vnc -display :0 -gui otherhost:0", will remote | 
 |                        control an x11vnc polling :0 and display the gui on | 
 |                        otherhost:0 The "tray/icon" mode below reverses this | 
 |                        preference, preferring to display on the x11vnc display. | 
 |  | 
 |                        4) When "tray" or "icon" is specified, the gui | 
 |                        presents itself as a small icon with behavior typical | 
 |                        of a "system tray" or "dock applet".  The color | 
 |                        of the icon indicates status (connected clients) and | 
 |                        there is also a balloon status.  Clicking on the icon | 
 |                        gives a menu from which properties, etc, can be set and | 
 |                        the full gui is available under "Advanced".  To be | 
 |                        fully functional, the gui mode should be "start" | 
 |                        (the default). | 
 |  | 
 |                        Note that tray or icon mode will imply the -forever | 
 |                        x11vnc option (if the x11vnc server is started along | 
 |                        with the gui) unless -connect or -connect_or_exit has | 
 |                        been specified.  So x11vnc (and the tray/icon gui) | 
 |                        will wait for more connections after the first client | 
 |                        disconnects.  If you want only one viewer connection | 
 |                        include the -once option. | 
 |  | 
 |                        For "icon" the gui just a small standalone window. | 
 |                        For "tray" it will attempt to embed itself in the | 
 |                        "system tray" if possible. If "=setpass" is appended the | 
 | n | 
 |                        at startup the X11 user will be prompted to set the | 
 |                        VNC session password.  If =<hexnumber> is appended | 
 |                        that icon will attempt to embed itself in the window | 
 |                        given by hexnumber.  Use =noadvanced to disable the | 
 |                        full gui. (To supply more than one, use "+" sign). | 
 |                        E.g. -gui tray=setpass and -gui icon=0x3600028 | 
 |  | 
 |                        Other modes: "full", the default and need not be | 
 |                        specified.  "-gui none", do not show a gui, useful | 
 |                        to override a ~/.x11vncrc setting, etc. | 
 |  | 
 |                        5) When "geom=+X+Y" is specified, that geometry | 
 |                        is passed to the gui toplevel.  This is the icon in | 
 |                        icon/tray mode, or the full gui otherwise.  You can | 
 |                        also specify width and height, i.e. WxH+X+Y, but it | 
 |                        is not recommended.  In "tray" mode the geometry is | 
 |                        ignored unless the system tray manager does not seem | 
 |                        to be running.  One could imagine using something like | 
 |                        "-gui tray,geom=+4000+4000" with a display manager | 
 |                        to keep the gui invisible until someone logs in... | 
 |  | 
 |                        More icon tricks, "icon=minimal" gives an icon just | 
 |                        with the VNC display number.  You can also set the font | 
 |                        with "iconfont=...".  The following could be useful: | 
 |                        "-gui icon=minimal,iconfont=5x8,geom=24x10+0-0" | 
 |  | 
 |                        General examples of the -gui option: "x11vnc -gui", | 
 |                        "x11vnc -gui ez" "x11vnc -gui localhost:10", | 
 |                        "x11vnc -gui conn,host:0", "x11vnc -gui tray,ez" | 
 |                        "x11vnc -gui tray=setpass" | 
 |  | 
 |                        If you do not intend to start x11vnc from the gui | 
 |                        (i.e. just remote control an existing one), then the | 
 |                        gui process can run on a different machine from the | 
 |                        x11vnc server as long as X permissions, etc. permit | 
 |                        communication between the two. | 
 |  | 
 |                        FONTS: On some systems the tk fonts can be too small, | 
 |                        jagged, or otherwise unreadable.  There are 4 env vars | 
 |                        you can set to be the tk font you prefer: | 
 |  | 
 |                        X11VNC_FONT_BOLD   main font for menus and buttons. | 
 |                        X11VNC_FONT_FIXED  font for fixed width text. | 
 |  | 
 |                        X11VNC_FONT_BOLD_SMALL  tray icon font. | 
 |                        X11VNC_FONT_REG_SMALL   tray icon menu font. | 
 |  | 
 |                        The last two only apply for the tray icon mode. | 
 |  | 
 |                        Here are some examples: | 
 |  | 
 |                        -env X11VNC_FONT_BOLD='Helvetica -16 bold' | 
 |                        -env X11VNC_FONT_FIXED='Courier -14' | 
 |                        -env X11VNC_FONT_REG_SMALL='Helvetica -12' | 
 |  | 
 |                        You can put the lines like the above (without the | 
 |                        quotes) in your ~/.x11vncrc file to avoid having to | 
 |                        specify them on the x11vnc command line. | 
 |  | 
 | -remote command        Remotely control some aspects of an already running | 
 |                        x11vnc server.  "-R" and "-r" are aliases for | 
 |                        "-remote".  After the remote control command is | 
 |                        sent to the running server the 'x11vnc -remote ...' | 
 |                        x11vnc command exits.  You can often use the -query | 
 |                        command (see below) to see if the x11vnc server | 
 |                        processed your -remote command. | 
 |  | 
 |                        The default communication channel is that of X | 
 |                        properties (specifically X11VNC_REMOTE), and so this | 
 |                        command must be run with correct settings for DISPLAY | 
 |                        and possibly XAUTHORITY to connect to the X server | 
 |                        and set the property.  Alternatively, use the -display | 
 |                        and -auth options to set them to the correct values. | 
 |                        The running server cannot use the -novncconnect option | 
 |                        because that disables the communication channel. | 
 |                        See below for alternate channels. | 
 |  | 
 |                        For example: 'x11vnc -remote stop' (which is the same as | 
 |                        'x11vnc -R stop') will close down the x11vnc server. | 
 |                        'x11vnc -R shared' will enable shared connections, and | 
 |                        'x11vnc -R scale:3/4' will rescale the desktop. | 
 |  | 
 |                        To use a different name for the X11 property (e.g. to | 
 |                        have separate communication channels for multiple | 
 |                        x11vnc's on the same display) set the X11VNC_REMOTE | 
 |                        environment variable to the string you want, for | 
 |                        example: -env X11VNC_REMOTE=X11VNC_REMOTE_12345 | 
 |                        Both sides of the channel must use the same unique name. | 
 |  | 
 |                        To run a bunch of commands in a sequence use something | 
 |                        like: x11vnc -R 'script:firstcmd;secondcmd;...' | 
 |  | 
 |                        Use x11vnc -R script:file=/path/to/file to read commands | 
 |                        from a file (can be multi-line and use the comment '#' | 
 |                        character in the normal way.  The ';' separator must | 
 |                        still be used to separate each command.) | 
 |  | 
 |                        To not try to contact another x11vnc process and instead | 
 |                        just run the command (or query) directly, prefix the | 
 |                        command with the string "DIRECT:" | 
 |  | 
 |                        The following -remote/-R commands are supported: | 
 |  | 
 |                        stop            terminate the server, same as "quit" | 
 |                                        "exit" or "shutdown". | 
 |                        ping            see if the x11vnc server responds. | 
 |                                        return is: ans=ping:<display> | 
 |                        ping:mystring   as above, but use your own unique string | 
 | . | 
 |                                        return is: ans=ping:mystring:<xdisplay> | 
 |                        blacken         try to push a black fb update to all | 
 |                                        clients (due to timings a client | 
 |                                        could miss it). Same as "zero", also | 
 |                                        "zero:x1,y1,x2,y2" for a rectangle. | 
 |                        refresh         send the entire fb to all clients. | 
 |                        reset           recreate the fb, polling memory, etc. | 
 |                        id:windowid     set -id window to "windowid". empty | 
 |                                        or "root" to go back to root window | 
 |                        sid:windowid    set -sid window to "windowid" | 
 |                        id_cmd:cmd      cmds: raise, lower, map, unmap, iconify, | 
 |                                        move:dXdY, resize:dWdH, geom:WxH+X+Y. dX | 
 |                                        dY, dW, and dH must have a leading "+" | 
 |                                        or "-" e.g.: move:-30+10 resize:+20+35 | 
 |                                        also: wm_delete, wm_name:string and | 
 |                                        icon_name:string. Also id_cmd:win=N:cmd | 
 |                        waitmapped      wait until subwin is mapped. | 
 |                        nowaitmapped    do not wait until subwin is mapped. | 
 |                        clip:WxH+X+Y    set -clip mode to "WxH+X+Y" | 
 |                        flashcmap       enable  -flashcmap mode. | 
 |                        noflashcmap     disable -flashcmap mode. | 
 |                        shiftcmap:n     set -shiftcmap to n. | 
 |                        notruecolor     enable  -notruecolor mode. | 
 |                        truecolor       disable -notruecolor mode. | 
 |                        overlay         enable  -overlay mode (if applicable). | 
 |                        nooverlay       disable -overlay mode. | 
 |                        overlay_cursor  in -overlay mode, enable cursor drawing. | 
 |                        overlay_nocursor disable cursor drawing. same as | 
 |                                         nooverlay_cursor. | 
 |                        8to24           enable  -8to24 mode (if applicable). | 
 |                        no8to24         disable -8to24 mode. | 
 |                        8to24_opts:str  set the -8to24 opts to "str". | 
 |                        24to32          enable  -24to32 mode (if applicable). | 
 |                        no24to32        disable -24to32 mode. | 
 |                        visual:vis      set -visual to "vis" | 
 |                        scale:frac      set -scale to "frac" | 
 |                        scale_cursor:f  set -scale_cursor to "f" | 
 |                        viewonly        enable  -viewonly mode. | 
 |                        noviewonly      disable -viewonly mode. | 
 |                        shared          enable  -shared mode. | 
 |                        noshared        disable -shared mode. | 
 |                        forever         enable  -forever mode. | 
 |                        noforever       disable -forever mode. | 
 |                        timeout:n       reset -timeout to n, if there are | 
 |                                        currently no clients, exit unless one | 
 |                                        connects in the next n secs. | 
 |                        tightfilexfer   enable  filetransfer for NEW clients. | 
 |                        notightfilexfer disable filetransfer for NEW clients. | 
 |                        ultrafilexfer   enable  filetransfer for clients. | 
 |                        noultrafilexfer disable filetransfer for clients. | 
 |                        rfbversion:n.m  set -rfbversion for new clients. | 
 |                        http            enable  http client connections. | 
 |                        nohttp          disable http client connections. | 
 |                        deny            deny any new connections, same as "lock" | 
 |                        nodeny          allow new connections, same as "unlock" | 
 |                        avahi           enable  avahi service advertising. | 
 |                        noavahi         disable avahi service advertising. | 
 |                        mdns            enable  avahi service advertising. | 
 |                        nomdns          disable avahi service advertising. | 
 |                        zeroconf        enable  avahi service advertising. | 
 |                        nozeroconf      disable avahi service advertising. | 
 |                        connect:host    do reverse connection to host, "host" | 
 |                                        may be a comma separated list of hosts | 
 |                                        or host:ports.  See -connect.  Passwords | 
 |                                        required as with fwd connections. | 
 |                                        See X11VNC_REVERSE_CONNECTION_NO_AUTH=1 | 
 |                        disconnect:host disconnect any clients from "host" | 
 |                                        same as "close:host".  Use host | 
 |                                        "all" to close all current clients. | 
 |                                        If you know the client internal hex ID, | 
 |                                        e.g. 0x3 (returned by "-query clients" | 
 |                                        and RFB_CLIENT_ID) you can use that too. | 
 |                        proxy:host:port set reverse connection proxy (empty to | 
 |                                        disable). | 
 |                        allowonce:host  For the next connection only, allow | 
 |                                        connection from "host". In -ssl mode | 
 |                                        two connections are allowed (i.e. Fetch | 
 |                                        Cert) unless X11VNC_NO_SSL_ALLOW_TWICE=1 | 
 |                        allow:hostlist  set -allow list to (comma separated) | 
 |                                        "hostlist". See -allow and -localhost. | 
 |                                        Do not use with -allow /path/to/file | 
 |                                        Use "+host" to add a single host, and | 
 |                                        use "-host" to delete a single host | 
 |                        localhost       enable  -localhost mode | 
 |                        nolocalhost     disable -localhost mode | 
 |                        listen:str      set -listen to str, empty to disable. | 
 |                        noipv6          enable  -noipv6 mode. | 
 |                        ipv6            disable -noipv6 mode. | 
 |                        noipv4          enable  -noipv4 mode. | 
 |                        ipv4            disable -noipv4 mode. | 
 |                        6               enable  -6 IPv6 listening mode. | 
 |                        no6             disable -6 IPv6 listening mode. | 
 |                        lookup          disable -nolookup mode. | 
 |                        nolookup        enable  -nolookup mode. | 
 |                        lookup          disable -nolookup mode. | 
 |                        input:str       set -input to "str", empty to disable. | 
 |                        grabkbd         enable  -grabkbd mode. | 
 |                        nograbkbd       disable -grabkbd mode. | 
 |                        grabptr         enable  -grabptr mode. | 
 |                        nograbptr       disable -grabptr mode. | 
 |                        grabalways      enable  -grabalways mode. | 
 |                        nograbalways    disable -grabalways mode. | 
 |                        grablocal:n     set -grablocal to n. | 
 |                        client_input:str set the K, M, B -input on a per-client | 
 |                                        basis.  select which client as for | 
 |                                        disconnect, e.g. client_input:host:MB | 
 |                                        or client_input:0x2:K | 
 |                        accept:cmd      set -accept "cmd" (empty to disable). | 
 |                        afteraccept:cmd set -afteraccept (empty to disable). | 
 |                        gone:cmd        set -gone "cmd" (empty to disable). | 
 |                        noshm           enable  -noshm mode. | 
 |                        shm             disable -noshm mode (i.e. use shm). | 
 |                        flipbyteorder   enable -flipbyteorder mode, you may need | 
 |                                        to set noshm for this to do something. | 
 |                        noflipbyteorder disable -flipbyteorder mode. | 
 |                        onetile         enable  -onetile mode. (you may need to | 
 |                                        set shm for this to do something) | 
 |                        noonetile       disable -onetile mode. | 
 |                        solid           enable  -solid mode | 
 |                        nosolid         disable -solid mode. | 
 |                        solid_color:color set -solid color (and apply it). | 
 |                        blackout:str    set -blackout "str" (empty to disable). | 
 |                                        See -blackout for the form of "str" | 
 |                                        (basically: WxH+X+Y,...) | 
 |                                        Use "+WxH+X+Y" to append a single | 
 |                                        rectangle use "-WxH+X+Y" to delete one | 
 |                        xinerama        enable  -xinerama mode. (if applicable) | 
 |                        noxinerama      disable -xinerama mode. | 
 |                        xtrap           enable  -xtrap input mode(if applicable) | 
 |                        noxtrap         disable -xtrap input mode. | 
 |                        xrandr          enable  -xrandr mode. (if applicable) | 
 |                        noxrandr        disable -xrandr mode. | 
 |                        xrandr_mode:mode set the -xrandr mode to "mode". | 
 |                        rotate:mode     set the -rotate mode to "mode". | 
 |                        padgeom:WxH     set -padgeom to WxH (empty to disable) | 
 |                                        If WxH is "force" or "do" the padded | 
 |                                        geometry fb is immediately applied. | 
 |                        quiet           enable  -quiet mode. | 
 |                        noquiet         disable -quiet mode. | 
 |                        modtweak        enable  -modtweak mode. | 
 |                        nomodtweak      enable  -nomodtweak mode. | 
 |                        xkb             enable  -xkb modtweak mode. | 
 |                        noxkb           disable -xkb modtweak mode. | 
 |                        capslock        enable  -capslock mode. | 
 |                        nocapslock      disable -capslock mode. | 
 |                        skip_lockkeys   enable  -skip_lockkeys mode. | 
 |                        noskip_lockkeys disable -skip_lockkeys mode. | 
 |                        skip_keycodes:str enable -xkb -skip_keycodes "str". | 
 |                        sloppy_keys     enable  -sloppy_keys mode. | 
 |                        nosloppy_keys   disable -sloppy_keys mode. | 
 |                        skip_dups       enable  -skip_dups mode. | 
 |                        noskip_dups     disable -skip_dups mode. | 
 |                        add_keysyms     enable -add_keysyms mode. | 
 |                        noadd_keysyms   stop adding keysyms. those added will | 
 |                                        still be removed at exit. | 
 |                        clear_mods      enable  -clear_mods mode and clear them. | 
 |                        noclear_mods    disable -clear_mods mode. | 
 |                        clear_keys      enable  -clear_keys mode and clear them. | 
 |                        noclear_keys    disable -clear_keys mode. | 
 |                        clear_locks     do the clear_locks action. | 
 |                        clear_all       do the clear_all action. | 
 |                        keystate        have x11vnc print current keystate. | 
 |                        remap:str       set -remap "str" (empty to disable). | 
 |                                        See -remap for the form of "str" | 
 |                                        (basically: key1-key2,key3-key4,...) | 
 |                                        Use "+key1-key2" to append a single | 
 |                                        keymapping, use "-key1-key2" to delete. | 
 |                        norepeat        enable  -norepeat mode. | 
 |                        repeat          disable -norepeat mode. | 
 |                        nofb            enable  -nofb mode. | 
 |                        fb              disable -nofb mode. | 
 |                        bell            enable  bell (if supported). | 
 |                        nobell          disable bell. | 
 |                        sendbell        ring the bell now. | 
 |                        nosel           enable  -nosel mode. | 
 |                        sel             disable -nosel mode. | 
 |                        noprimary       enable  -noprimary mode. | 
 |                        primary         disable -noprimary mode. | 
 |                        nosetprimary    enable  -nosetprimary mode. | 
 |                        setprimary      disable -nosetprimary mode. | 
 |                        noclipboard     enable  -noclipboard mode. | 
 |                        clipboard       disable -noclipboard mode. | 
 |                        nosetclipboard  enable  -nosetclipboard mode. | 
 |                        setclipboard    disable -nosetclipboard mode. | 
 |                        seldir:str      set -seldir to "str" | 
 |                        resend_cutbuffer resend the most recent CUTBUFFER0 copy | 
 |                        resend_clipboard resend the most recent CLIPBOARD copy | 
 |                        resend_primary   resend the most recent PRIMARY copy | 
 |                        cursor:mode     enable  -cursor "mode". | 
 |                        show_cursor     enable  showing a cursor. | 
 |                        noshow_cursor   disable showing a cursor. (same as | 
 |                                        "nocursor") | 
 |                        cursor_drag     enable  cursor changes during drag. | 
 |                        nocursor_drag   disable cursor changes during drag. | 
 |                        arrow:n         set -arrow to alternate n. | 
 |                        xfixes          enable  xfixes cursor shape mode. | 
 |                        noxfixes        disable xfixes cursor shape mode. | 
 |                        alphacut:n      set -alphacut to n. | 
 |                        alphafrac:f     set -alphafrac to f. | 
 |                        alpharemove     enable  -alpharemove mode. | 
 |                        noalpharemove   disable -alpharemove mode. | 
 |                        alphablend      disable -noalphablend mode. | 
 |                        noalphablend    enable  -noalphablend mode. | 
 |                        cursorshape     disable -nocursorshape mode. | 
 |                        nocursorshape   enable  -nocursorshape mode. | 
 |                        cursorpos       disable -nocursorpos mode. | 
 |                        nocursorpos     enable  -nocursorpos mode. | 
 |                        xwarp           enable  -xwarppointer mode. | 
 |                        noxwarp         disable -xwarppointer mode. | 
 |                        always_inject   enable  -always_inject mode. | 
 |                        noalways_inject disable -always_inject mode. | 
 |                        buttonmap:str   set -buttonmap "str", empty to disable | 
 |                        dragging        disable -nodragging mode. | 
 |                        nodragging      enable  -nodragging mode. | 
 |                        ncache          reenable -ncache mode. | 
 |                        noncache        disable  -ncache mode. | 
 |                        ncache_size:n   set -ncache size to n. | 
 |                        ncache_cr       enable  -ncache_cr mode. | 
 |                        noncache_cr     disable -ncache_cr mode. | 
 |                        ncache_no_moveraise     enable  no_moveraise mode. | 
 |                        noncache_no_moveraise   disable no_moveraise mode. | 
 |                        ncache_no_dtchange      enable  ncache_no_dtchange mode. | 
 |                        noncache_no_dtchange    disable ncache_no_dtchange mode. | 
 |                        ncache_old_wm           enable  ncache_old_wm mode. | 
 |                        noncache_old_wm         disable ncache_old_wm mode. | 
 |                        ncache_no_rootpixmap    enable  ncache_no_rootpixmap. | 
 |                        noncache_no_rootpixmap  disable ncache_no_rootpixmap. | 
 |                        ncache_reset_rootpixmap recheck the root pixmap, ncrp | 
 |                        ncache_keep_anims       enable  ncache_keep_anims. | 
 |                        noncache_keep_anims     disable ncache_keep_anims. | 
 |                        ncache_pad:n    set -ncache_pad to n. | 
 |                        wireframe       enable  -wireframe mode. same as "wf" | 
 |                        nowireframe     disable -wireframe mode. same as "nowf" | 
 |                        wireframe:str   enable  -wireframe mode string. | 
 |                        wireframe_mode:str enable  -wireframe mode string. | 
 |                        wireframelocal  enable  wireframelocal. same as "wfl" | 
 |                        nowireframe     disable wireframelocal. same as "nowfl" | 
 |                        wirecopyrect:str set -wirecopyrect string. same as "wcr: | 
 | " | 
 |                        scrollcopyrect:str set -scrollcopyrect string. same "scr | 
 | " | 
 |                        noscrollcopyrect disable -scrollcopyrect mode. "noscr" | 
 |                        scr_area:n      set -scr_area to n | 
 |                        scr_skip:list   set -scr_skip to "list" | 
 |                        scr_inc:list    set -scr_inc to "list" | 
 |                        scr_keys:list   set -scr_keys to "list" | 
 |                        scr_term:list   set -scr_term to "list" | 
 |                        scr_keyrepeat:str set -scr_keyrepeat to "str" | 
 |                        scr_parms:str   set -scr_parms parameters. | 
 |                        fixscreen:str   set -fixscreen to "str". | 
 |                        noxrecord       disable all use of RECORD extension. | 
 |                        xrecord         enable  use of RECORD extension. | 
 |                        reset_record    reset RECORD extension (if avail.) | 
 |                        pointer_mode:n  set -pointer_mode to n. same as "pm" | 
 |                        input_skip:n    set -input_skip to n. | 
 |                        allinput        enable  use of -allinput mode. | 
 |                        noallinput      disable use of -allinput mode. | 
 |                        input_eagerly   enable  use of -input_eagerly mode. | 
 |                        noinput_eagerly disable use of -input_eagerly mode. | 
 |                        ssltimeout:n    set -ssltimeout to n. | 
 |                        speeds:str      set -speeds to str. | 
 |                        wmdt:str        set -wmdt to str. | 
 |                        debug_pointer   enable  -debug_pointer, same as "dp" | 
 |                        nodebug_pointer disable -debug_pointer, same as "nodp" | 
 |                        debug_keyboard   enable  -debug_keyboard, same as "dk" | 
 |                        nodebug_keyboard disable -debug_keyboard, same as "nodk" | 
 |                        keycode:n       inject keystroke 'keycode' (xmodmap -pk) | 
 |                        keycode:n,down  inject 'keycode' (down=0,1) | 
 |                        keysym:str      inject keystroke 'keysym' (number/name) | 
 |                        keysym:str,down inject 'keysym' (down=0,1) | 
 |                        ptr:x,y,mask    inject pointer event x, y, button-mask | 
 |                        fakebuttonevent:button,down direct XTestFakeButtonEvent. | 
 |                        sleep:t         sleep floating point time t. | 
 |                        get_xprop:p     get X property named 'p'. | 
 |                        set_xprop:p:val set X property named 'p' to 'val'. | 
 |                                        p -> id=NNN:p for hex/dec window id. | 
 |                        wininfo:id      get info about X window id.  use 'root' | 
 |                                        for root window, use +id for children. | 
 |                        grab_state      get state of pointer and keyboard grab. | 
 |                        pointer_pos     print XQueryPointer x,y cursor position. | 
 |                        pointer_x       print XQueryPointer x cursor position. | 
 |                        pointer_y       print XQueryPointer y cursor position. | 
 |                        pointer_same    print XQueryPointer ptr on same screen. | 
 |                        pointer_root    print XQueryPointer curr ptr rootwin. | 
 |                        pointer_mask    print XQueryPointer button and mods mask | 
 |                        mouse_x         print x11vnc's idea of cursor position. | 
 |                        mouse_y         print x11vnc's idea of cursor position. | 
 |                        noop            do nothing. | 
 |                        defer:n         set -defer to n ms,same as deferupdate:n | 
 |                        wait:n          set -wait to n ms. | 
 |                        extra_fbur:n    set -extra_fbur to n. | 
 |                        wait_ui:f       set -wait_ui factor to f. | 
 |                        setdefer:n      set -setdefer to -2,-1,0,1, or 2. | 
 |                        wait_bog        disable -nowait_bog mode. | 
 |                        nowait_bog      enable  -nowait_bog mode. | 
 |                        slow_fb:f       set -slow_fb to f seconds. | 
 |                        xrefresh:f      set -xrefresh to f seconds. | 
 |                        readtimeout:n   set read timeout to n seconds. | 
 |                        nap             enable  -nap mode. | 
 |                        nonap           disable -nap mode. | 
 |                        sb:n            set -sb to n s, same as screen_blank:n | 
 |                        fbpm            disable -nofbpm mode. | 
 |                        nofbpm          enable  -nofbpm mode. | 
 |                        dpms            disable -nodpms mode. | 
 |                        nodpms          enable  -nodpms mode. | 
 |                        forcedpms       enable  -forcedpms mode. | 
 |                        noforcedpms     disable -forcedpms mode. | 
 |                        clientdpms      enable  -clientdpms mode. | 
 |                        noclientdpms    disable -clientdpms mode. | 
 |                        noserverdpms    enable  -noserverdpms mode. | 
 |                        serverdpms      disable -noserverdpms mode. | 
 |                        noultraext      enable  -noultraext mode. | 
 |                        ultraext        disable -noultraext mode. | 
 |                        chatwindow      enable  local chatwindow mode. | 
 |                        nochatwindow    disable local chatwindow mode. | 
 |                        chaton          begin chat using local window. | 
 |                        chatoff         end   chat using local window. | 
 |                        xdamage         enable  xdamage polling hints. | 
 |                        noxdamage       disable xdamage polling hints. | 
 |                        xd_area:A       set -xd_area max pixel area to "A" | 
 |                        xd_mem:f        set -xd_mem remembrance to "f" | 
 |                        fs:frac         set -fs fraction to "frac", e.g. 0.5 | 
 |                        gaps:n          set -gaps to n. | 
 |                        grow:n          set -grow to n. | 
 |                        fuzz:n          set -fuzz to n. | 
 |                        snapfb          enable  -snapfb mode. | 
 |                        nosnapfb        disable -snapfb mode. | 
 |                        rawfb:str       set -rawfb mode to "str". | 
 |                        uinput_accel:f  set uinput_accel to f. | 
 |                        uinput_thresh:n set uinput_thresh to n. | 
 |                        uinput_reset:n  set uinput_reset to n ms. | 
 |                        uinput_always:n set uinput_always to 1/0. | 
 |                        progressive:n   set LibVNCServer -progressive slice | 
 |                                        height parameter to n. | 
 |                        desktop:str     set -desktop name to str for new clients | 
 | . | 
 |                        rfbport:n       set -rfbport to n. | 
 |                        macnosaver      enable  -macnosaver mode. | 
 |                        macsaver        disable -macnosaver mode. | 
 |                        macnowait       enable  -macnowait  mode. | 
 |                        macwait         disable -macnowait  mode. | 
 |                        macwheel:n      set -macwheel to n. | 
 |                        macnoswap       enable  -macnoswap mouse button mode. | 
 |                        macswap         disable -macnoswap mouse button mode. | 
 |                        macnoresize     enable  -macnoresize mode. | 
 |                        macresize       disable -macnoresize mode. | 
 |                        maciconanim:n   set -maciconanim to n. | 
 |                        macmenu         enable  -macmenu  mode. | 
 |                        macnomenu       disable -macmenu  mode. | 
 |                        macuskbd        enable  -macuskbd mode. | 
 |                        macnouskbd      disable -macuskbd mode. | 
 |                        httpport:n      set -httpport to n. | 
 |                        httpdir:dir     set -httpdir to dir (and enable http). | 
 |                        enablehttpproxy   enable  -enablehttpproxy mode. | 
 |                        noenablehttpproxy disable -enablehttpproxy mode. | 
 |                        alwaysshared     enable  -alwaysshared mode. | 
 |                        noalwaysshared   disable -alwaysshared mode. | 
 |                                         (may interfere with other options) | 
 |                        nevershared      enable  -nevershared mode. | 
 |                        nonevershared    disable -nevershared mode. | 
 |                                         (may interfere with other options) | 
 |                        dontdisconnect   enable  -dontdisconnect mode. | 
 |                        nodontdisconnect disable -dontdisconnect mode. | 
 |                                         (may interfere with other options) | 
 |                        debug_xevents   enable  debugging X events. | 
 |                        nodebug_xevents disable debugging X events. | 
 |                        debug_xdamage   enable  debugging X DAMAGE mechanism. | 
 |                        nodebug_xdamage disable debugging X DAMAGE mechanism. | 
 |                        debug_wireframe enable   debugging wireframe mechanism. | 
 |                        nodebug_wireframe disable debugging wireframe mechanism. | 
 |                        debug_scroll    enable  debugging scrollcopy mechanism. | 
 |                        nodebug_scroll  disable debugging scrollcopy mechanism. | 
 |                        debug_tiles     enable  -debug_tiles | 
 |                        nodebug_tiles   disable -debug_tiles | 
 |                        debug_grabs     enable  -debug_grabs | 
 |                        nodebug_grabs   disable -debug_grabs | 
 |                        debug_sel       enable  -debug_sel | 
 |                        nodebug_sel     disable -debug_sel | 
 |                        debug_ncache    enable  -debug_ncache | 
 |                        nodebug_ncache  disable -debug_ncache | 
 |                        dbg             enable  -dbg crash shell | 
 |                        nodbg           disable -dbg crash shell | 
 |  | 
 |                        noremote        disable the -remote command processing, | 
 |                                        it cannot be turned back on. | 
 |  | 
 |                        bcx_xattach:str  This remote control command is for | 
 |                        use with the BARCO xattach program or the x2x program. | 
 |                        Both of these programs are for 'pointer and keyboard' | 
 |                        sharing between separate X displays.  In general the | 
 |                        two displays are usually nearby, e.g. on the same desk, | 
 |                        and this allows the user to share a single pointer and | 
 |                        keyboard between them.  The user moves the mouse to | 
 |                        an edge and then the mouse pointer appears to 'jump' | 
 |                        to the other display screen.  Thus it emulates what a | 
 |                        single X server would do for two screens (e.g. :0.0 and | 
 |                        :0.1) The illusion of a single Xserver with multiple | 
 |                        screens is achieved by forwarding events to the 2nd | 
 |                        one via the XTEST extension. | 
 |  | 
 |                        What the x11vnc bcx_xattach command does is to perform | 
 |                        some pointer movements to try to INDUCE xattach/x2x | 
 |                        to 'jump' to the other display.  In what follows the | 
 |                        'master' display refers to the one that when it has | 
 |                        'focus' it is basically doing nothing besides watching | 
 |                        for the mouse to go over an edge.  The 'slave' | 
 |                        display refers to the one to which the mouse and | 
 |                        keyboard is redirected to once an edge in the master | 
 |                        has been crossed.  Note that the x11vnc executing the | 
 |                        bcx_xattach command MUST be the one connected to the | 
 |                        *master* display. | 
 |  | 
 |                        Also note that when input is being redirected (via | 
 |                        XTEST) from the master display to the slave display, | 
 |                        the master display's pointer and keyboard are *grabbed* | 
 |                        by xattach/x2x.  x11vnc can use this info to verify that | 
 |                        the master/slave mode change has taken place correctly. | 
 |                        If you specify the "ifneeded" option (see below) | 
 |                        and the initial grab state is that of the desired | 
 |                        final state, then no pointer movements are injected | 
 |                        and "DONE,GRAB_OK" is returned. | 
 |  | 
 |                        "str" must contain one of "up", "down", "left", | 
 |                        or "right" to indicate the direction of the 'jump'. | 
 |                        "str" must also contain one of "master_to_slave" | 
 |                        or "slave_to_master" to indicate the type of mode | 
 |                        change induced by the jump.  Use "M2S" and "S2M" | 
 |                        as shorter aliases. | 
 |  | 
 |                        "str" may be a "+" separated list of additional | 
 |                        tuning options.  The "shift=n" option indicates an | 
 |                        offset shift position away from (0,0) (default 20). | 
 |                        "final=x+y" specifies the final position of the cursor | 
 |                        at the end of the normal move sequence; default 30+30. | 
 |                        "extra_move=x+y" means to do one more pointer move | 
 |                        after "final" to x+y.  "dt=n" sets the sleep time | 
 |                        in milliseconds between pointer moves (default: 40ms) | 
 |                        "retry=n" specifies the maximum number of retries if | 
 |                        the grab state change fails. "ifneeded" means to not | 
 |                        apply the pointer movements if the initial grab state is | 
 |                        that of the desired final state. "nograbcheck" means | 
 |                        to not check if the grab state changed as expected and | 
 |                        only apply the pointer movements (default is to check | 
 |                        the grab states.) | 
 |  | 
 |                        If you do not specify "up", etc., to bcx_xattach | 
 |                        nothing will be attempted and the command returns | 
 |                        the string FAIL,NO_DIRECTION_SPECIFIED.  If you do | 
 |                        not specify "master_to_slave" or "M2S", etc., to | 
 |                        bcx_xattach nothing will be attempted and the command | 
 |                        returns the string FAIL,NO_MODE_CHANGE_SPECIFIED. | 
 |  | 
 |                        Otherwise, the returned string will contain "DONE". | 
 |                        It will be "DONE,GRAB_OK" if the grab state changed | 
 |                        as expected (or if "ifneeded" was supplied and | 
 |                        the initial grab state was already the desired | 
 |                        one.)  If the initial grab state was incorrect, | 
 |                        but the final grab state was correct then it is | 
 |                        "DONE,GRAB_FAIL_INIT".  If the initial grab state | 
 |                        was correct, but the final grab state was incorrect | 
 |                        then it is "DONE,GRAB_FAIL_FINAL".  If both are | 
 |                        incorrect it will be "DONE,GRAB_FAIL".  Under grab | 
 |                        failure the string will be followed by ":p1,k1-p2,k2" | 
 |                        where  p1,k1 indicates the initial pointer and keyboard | 
 |                        grab states and p2,k2 the final ones. If GRAB_FAIL or | 
 |                        GRAB_FAIL_FINAL occurs, the action will be retried up | 
 |                        to 3 times; trying to reset the state and sleeping a | 
 |                        bit between each try.  Set retry=n to adjust the number | 
 |                        of retries, zero to disable retries. | 
 |  | 
 |                        Examples: | 
 |                            -R bcx_xattach:down+M2S | 
 |                            -R bcx_xattach:up+S2M | 
 |                            -R bcx_xattach:up+S2M+nograbcheck+dt=30 | 
 |                            -R bcx_xattach:down+M2S+extra_move=100+100 | 
 |  | 
 |                        or use -Q instead of -R to retrieve the result text. | 
 |  | 
 |                        End of the bcx_xattach:str description. | 
 |  | 
 |                        The vncconnect(1) command from standard VNC | 
 |                        distributions may also be used if string is prefixed | 
 |                        with "cmd=" E.g. 'vncconnect cmd=stop'.  Under some | 
 |                        circumstances xprop(1) can used if it supports -set | 
 |                        (see the FAQ). | 
 |  | 
 |                        If "-connect /path/to/file" has been supplied to the | 
 |                        running x11vnc server then that file can be used as a | 
 |                        communication channel (this is the only way to remote | 
 |                        control one of many x11vnc's polling the same X display) | 
 |                        Simply run: 'x11vnc -connect /path/to/file -remote ...' | 
 |                        or you can directly write to the file via something | 
 |                        like: "echo cmd=stop > /path/to/file", etc. | 
 |  | 
 | -query variable        Like -remote, except just query the value of | 
 |                        "variable".  "-Q" is an alias for "-query". | 
 |                        Multiple queries can be done by separating variables | 
 |                        by commas, e.g. -query var1,var2. The results come | 
 |                        back in the form ans=var1:value1,ans=var2:value2,... | 
 |                        to the standard output.  If a variable is read-only, | 
 |                        it comes back with prefix "aro=" instead of "ans=". | 
 |  | 
 |                        Some -remote commands are pure actions that do not make | 
 |                        sense as variables, e.g. "stop" or "disconnect", in | 
 |                        these cases the value returned is "N/A".  To direct a | 
 |                        query straight to the X11VNC_REMOTE property or connect | 
 |                        file use "qry=..." instead of "cmd=..." | 
 |  | 
 |                        ans= stop quit exit shutdown ping resend_cutbuffer | 
 |                        resend_clipboard resend_primary blacken zero refresh | 
 |                        reset close disconnect id_cmd id sid waitmapped | 
 |                        nowaitmapped clip flashcmap noflashcmap shiftcmap | 
 |                        truecolor notruecolor overlay nooverlay overlay_cursor | 
 |                        overlay_yescursor nooverlay_nocursor nooverlay_cursor | 
 |                        nooverlay_yescursor overlay_nocursor 8to24 no8to24 | 
 |                        8to24_opts 24to32 no24to32 visual scale scale_cursor | 
 |                        viewonly noviewonly shared noshared forever noforever | 
 |                        once timeout tightfilexfer notightfilexfer ultrafilexfer | 
 |                        noultrafilexfer rfbversion deny lock nodeny unlock avahi | 
 |                        mdns zeroconf noavahi nomdns nozeroconf connect proxy | 
 |                        allowonce allow noipv6 ipv6 noipv4 ipv4 no6 6 localhost | 
 |                        nolocalhost listen lookup nolookup accept afteraccept | 
 |                        gone shm noshm flipbyteorder noflipbyteorder onetile | 
 |                        noonetile solid_color solid nosolid blackout xinerama | 
 |                        noxinerama xtrap noxtrap xrandr noxrandr xrandr_mode | 
 |                        rotate padgeom quiet q noquiet modtweak nomodtweak xkb | 
 |                        noxkb capslock nocapslock skip_lockkeys noskip_lockkeys | 
 |                        skip_keycodes sloppy_keys nosloppy_keys skip_dups | 
 |                        noskip_dups add_keysyms noadd_keysyms clear_mods | 
 |                        noclear_mods clear_keys noclear_keys clear_all | 
 |                        clear_locks keystate remap repeat norepeat fb nofb bell | 
 |                        nobell sendbell sel nosel primary noprimary setprimary | 
 |                        nosetprimary clipboard noclipboard setclipboard | 
 |                        nosetclipboard seldir cursorshape nocursorshape | 
 |                        cursorpos nocursorpos cursor_drag nocursor_drag cursor | 
 |                        show_cursor noshow_cursor nocursor arrow xfixes noxfixes | 
 |                        xdamage noxdamage xd_area xd_mem alphacut alphafrac | 
 |                        alpharemove noalpharemove alphablend noalphablend | 
 |                        xwarppointer xwarp noxwarppointer noxwarp always_inject | 
 |                        noalways_inject buttonmap dragging nodragging ncache_cr | 
 |                        noncache_cr ncache_no_moveraise noncache_no_moveraise | 
 |                        ncache_no_dtchange noncache_no_dtchange | 
 |                        ncache_no_rootpixmap noncache_no_rootpixmap | 
 |                        ncache_reset_rootpixmap ncrp ncache_keep_anims | 
 |                        noncache_keep_anims ncache_old_wm noncache_old_wm | 
 |                        ncache_pad ncache noncache ncache_size debug_ncache | 
 |                        nodebug_ncache wireframe_mode wireframe wf nowireframe | 
 |                        nowf wireframelocal wfl nowireframelocal nowfl | 
 |                        wirecopyrect wcr nowirecopyrect nowcr scr_area | 
 |                        scr_skip scr_inc scr_keys scr_term scr_keyrepeat | 
 |                        scr_parms scrollcopyrect scr noscrollcopyrect | 
 |                        noscr fixscreen noxrecord xrecord reset_record | 
 |                        pointer_mode pm input_skip allinput noallinput | 
 |                        input_eagerly noinput_eagerly input grabkbd nograbkbd | 
 |                        grabptr nograbptr grabalways nograbalways grablocal | 
 |                        client_input ssltimeout speeds wmdt debug_pointer dp | 
 |                        nodebug_pointer nodp debug_keyboard dk nodebug_keyboard | 
 |                        nodk keycode keysym ptr fakebuttonevent sleep get_xprop | 
 |                        set_xprop wininfo bcx_xattach deferupdate defer | 
 |                        setdefer extra_fbur wait_ui wait_bog nowait_bog | 
 |                        slow_fb xrefresh wait readtimeout nap nonap sb | 
 |                        screen_blank fbpm nofbpm dpms nodpms clientdpms | 
 |                        noclientdpms forcedpms noforcedpms noserverdpms | 
 |                        serverdpms noultraext ultraext chatwindow nochatwindow | 
 |                        chaton chatoff fs gaps grow fuzz snapfb nosnapfb | 
 |                        rawfb uinput_accel uinput_thresh uinput_reset | 
 |                        uinput_always progressive rfbport http nohttp httpport | 
 |                        httpdir enablehttpproxy noenablehttpproxy alwaysshared | 
 |                        noalwaysshared nevershared noalwaysshared dontdisconnect | 
 |                        nodontdisconnect desktop debug_xevents nodebug_xevents | 
 |                        debug_xevents debug_xdamage nodebug_xdamage | 
 |                        debug_xdamage debug_wireframe nodebug_wireframe | 
 |                        debug_wireframe debug_scroll nodebug_scroll debug_scroll | 
 |                        debug_tiles dbt nodebug_tiles nodbt debug_tiles | 
 |                        debug_grabs nodebug_grabs debug_sel nodebug_sel dbg | 
 |                        nodbg macnosaver macsaver nomacnosaver macnowait macwait | 
 |                        nomacnowait macwheel macnoswap macswap nomacnoswap | 
 |                        macnoresize macresize nomacnoresize maciconanim macmenu | 
 |                        macnomenu nomacmenu macuskbd nomacuskbd noremote | 
 |  | 
 |                        aro=  noop display vncdisplay icon_mode autoport | 
 |                        loop loopbg desktopname guess_desktop guess_dbus | 
 |                        http_url auth xauth users rootshift clipshift scale_str | 
 |                        scaled_x scaled_y scale_numer scale_denom scale_fac_x | 
 |                        scale_fac_y scaling_blend scaling_nomult4 scaling_pad | 
 |                        scaling_interpolate inetd privremote unsafe safer nocmds | 
 |                        passwdfile unixpw unixpw_nis unixpw_list ssl ssl_pem | 
 |                        sslverify stunnel stunnel_pem https httpsredir usepw | 
 |                        using_shm logfile o flag rmflag rc norc h help V version | 
 |                        lastmod bg sigpipe threads readrate netrate netlatency | 
 |                        pipeinput clients client_count pid ext_xtest ext_xtrap | 
 |                        ext_xrecord ext_xkb ext_xshm ext_xinerama ext_overlay | 
 |                        ext_xfixes ext_xdamage ext_xrandr rootwin num_buttons | 
 |                        button_mask mouse_x mouse_y grab_state pointer_pos | 
 |                        pointer_x pointer_y pointer_same pointer_root | 
 |                        pointer_mask bpp depth indexed_color dpy_x dpy_y wdpy_x | 
 |                        wdpy_y off_x off_y cdpy_x cdpy_y coff_x coff_y rfbauth | 
 |                        passwd viewpasswd | 
 |  | 
 | -QD variable           Just like -query variable, but returns the default | 
 |                        value for that parameter (no running x11vnc server | 
 |                        is consulted) | 
 |  | 
 | -sync                  By default -remote commands are run asynchronously, that | 
 |                        is, the request is posted and the program immediately | 
 |                        exits.  Use -sync to have the program wait for an | 
 |                        acknowledgement from the x11vnc server that command was | 
 |                        processed (somehow).  On the other hand -query requests | 
 |                        are always processed synchronously because they have | 
 |                        to wait for the answer. | 
 |  | 
 |                        Also note that if both -remote and -query requests are | 
 |                        supplied on the command line, the -remote is processed | 
 |                        first (synchronously: no need for -sync), and then | 
 |                        the -query request is processed in the normal way. | 
 |                        This allows for a reliable way to see if the -remote | 
 |                        command was processed by querying for any new settings. | 
 |                        Note however that there is timeout of a few seconds | 
 |                        (see the next paragraph) so if the x11vnc takes longer | 
 |                        than that to process the requests the requester will | 
 |                        think that a failure has taken place. | 
 |  | 
 |                        The default is to wait 3.5 seconds.  Or if cmd=stop | 
 |                        only 1.0 seconds.  If cmd matches 'script:' then it | 
 |                        will wait up to 10.0 seconds.  Set X11VNC_SYNC_TIMEOUT | 
 |                        to the number of seconds you want it to wait. | 
 |  | 
 | -query_retries str     If a query fails to get a response from an x11vnc | 
 |                        server, retry up to n times.  "str" is specified as | 
 |                        n[:t][/match]  Optionally the delay between tries may | 
 |                        be specified by "t" a floating point time (default | 
 |                        0.5 seconds.)  Note: the response is not checked for | 
 |                        validity or whether it corresponds to the query sent. | 
 |                        The query "ping:mystring" may be used to help uniquely | 
 |                        identify the query.  Optionally, a matching string after | 
 |                        a "/" will be used to check the result text.  Up to | 
 |                        n retries will take place until the matching string is | 
 |                        found in the output text.  If the match string is never | 
 |                        found the program's exit code is 1; if the match is | 
 |                        found it exits with 0.  Note that there may be stdout | 
 |                        printed for each retry (i.e. multiple lines printed | 
 |                        out to stdout.) | 
 |                        Example: -query_retries 4:1.5/grab_state | 
 |  | 
 | -remote_prefix str     Enable a remote-control communication channel for | 
 |                        connected VNC clients.  str is a non-empty string. If a | 
 |                        VNC client sends rfbCutText having the prefix "str" | 
 |                        then the part after it is processed as though it were | 
 |                        sent via 'x11vnc -remote ...'.  If it begins with | 
 |                        neither 'cmd=' nor 'qry=' then 'qry=' is assumed. | 
 |                        Any corresponding output text for that remote control | 
 |                        command is sent back to all client as rfbCutText. | 
 |                        The returned output is also prefixed with "str". | 
 |                        Example: -remote_prefix DO_THIS: | 
 |  | 
 |                        Note that enabling -remote_prefix allows the remote | 
 |                        VNC viewers to run x11vnc -remote commands.  Do not | 
 |                        use this option if they are not to be trusted. | 
 |  | 
 | -noremote              Do not process any remote control commands or queries. | 
 | -yesremote             Do process remote control commands or queries. | 
 |                        Default: -yesremote | 
 |  | 
 |                        A note about security wrt remote control commands. | 
 |                        If someone can connect to the X display and change | 
 |                        the property X11VNC_REMOTE, then they can remotely | 
 |                        control x11vnc.  Normally access to the X display is | 
 |                        protected.  Note that if they can modify X11VNC_REMOTE | 
 |                        on the X server, they have enough permissions to also | 
 |                        run their own x11vnc and thus have complete control | 
 |                        of the desktop.  If the  "-connect /path/to/file" | 
 |                        channel is being used, obviously anyone who can write | 
 |                        to /path/to/file can remotely control x11vnc.  So be | 
 |                        sure to protect the X display and that file's write | 
 |                        permissions.  See -privremote below. | 
 |  | 
 |                        If you are paranoid and do not think -noremote is | 
 |                        enough, to disable the X11VNC_REMOTE property channel | 
 |                        completely use -novncconnect, or use the -safer option | 
 |                        that shuts many things off. | 
 |  | 
 | -unsafe                A few remote commands are disabled by default | 
 |                        (currently: id:pick, accept:<cmd>, gone:<cmd>, and | 
 |                        rawfb:setup:<cmd>) because they are associated with | 
 |                        running external programs.  If you specify -unsafe, then | 
 |                        these remote-control commands are allowed.  Note that | 
 |                        you can still specify these parameters on the command | 
 |                        line, they just cannot be invoked via remote-control. | 
 | -safer                 Equivalent to: -novncconnect -noremote and prohibiting | 
 |                        -gui and the -connect file. Shuts off communcation | 
 |                        channels. | 
 | -privremote            Perform some sanity checks and disable remote-control | 
 |                        commands if it appears that the X DISPLAY and/or | 
 |                        connectfile can be accessed by other users.  Once | 
 |                        remote-control is disabled it cannot be turned back on. | 
 | -nocmds                No external commands (e.g. system(3), popen(3), exec(3)) | 
 |                        will be run at all. | 
 | -allowedcmds list      "list" contains a comma separated list of the only | 
 |                        external commands that can be run.  The full list of | 
 |                        associated options is: | 
 |  | 
 |                         stunnel, ssl, unixpw, WAIT, zeroconf, id, accept, | 
 |                         afteraccept, gone, pipeinput, v4l-info, rawfb-setup, | 
 |                         dt, gui, ssh, storepasswd, passwdfile, custom_passwd, | 
 |                         findauth, crash. | 
 |  | 
 |                        See each option's help to learn the associated external | 
 |                        command.  Note that the -nocmds option takes precedence | 
 |                        and disables all external commands. | 
 |  | 
 | -deny_all              For use with -remote nodeny: start out denying all | 
 |                        incoming clients until "-remote nodeny" is used to | 
 |                        let them in. | 
 |  | 
 |  | 
 |  | 
 | These options are passed to LibVNCServer: | 
 |  | 
 | -rfbport port          TCP port for RFB protocol | 
 | -rfbwait time          max time in ms to wait for RFB client | 
 | -rfbauth passwd-file   use authentication on RFB protocol | 
 |                        (use 'storepasswd' to create a password file) | 
 | -rfbversion 3.x        Set the version of the RFB we choose to advertise | 
 | -permitfiletransfer    permit file transfer support | 
 | -passwd plain-password use authentication | 
 |                        (use plain-password as password, USE AT YOUR RISK) | 
 | -deferupdate time      time in ms to defer updates (default 40) | 
 | -deferptrupdate time   time in ms to defer pointer updates (default none) | 
 | -desktop name          VNC desktop name (default "LibVNCServer") | 
 | -alwaysshared          always treat new clients as shared | 
 | -nevershared           never treat new clients as shared | 
 | -dontdisconnect        don't disconnect existing clients when a new non-shared | 
 |                        connection comes in (refuse new connection instead) | 
 | -httpdir dir-path      enable http server using dir-path home | 
 | -httpport portnum      use portnum for http connection | 
 | -enablehttpproxy       enable http proxy support | 
 | -progressive height    enable progressive updating for slow links | 
 | -listen ipaddr         listen for connections only on network interface with | 
 |                        addr ipaddr. '-listen localhost' and hostname work too. | 
 |  | 
 | libvncserver-tight-extension options: | 
 | -disablefiletransfer   disable file transfer | 
 | -ftproot string        set ftp root | 
 |  | 
 |    Pretty wild huh? Contact me if you have any questions or problems. | 
 |  | 
 |    Personally, I use: | 
 | x11vnc -rfbauth $HOME/.vnc/passwd -solid |