Assign VNC password using script

21,526

Solution 1

As far as I know, the vncserver command only prompts for a password if the password file (by default, $HOME/.vnc/passwd) is absent - typically the first time it's run for a particular user. You could either script that initial vncserver interaction using 'expect', or pre-create the user's password file by calling the vncpasswd utility via expect before you run vncserver for the first time; e.g. [CAUTION: this is absolutely minimal, you should add some sanity checks if this is used in a serious environment]

#!/bin/sh

prog=/usr/bin/vncpasswd
mypass="newpass"

/usr/bin/expect <<EOF
spawn "$prog"
expect "Password:"
send "$mypass\r"
expect "Verify:"
send "$mypass\r"
expect eof
exit
EOF

If you don't want to (or can't) use 'expect', then there are various hacks available on the web - VNC passwords apparently use a form of DES encryption so searching with the terms 'VNC' 'DES' 'password' should get you what you need (I'm not going to link here since I cannot vouch for any particular one).

For completeness, note that the default Ubuntu 'Desktop Sharing' uses vino, and the password for that appears to be simply base64 encoded, so it is possible to set it directly e.g.

gsettings set org.gnome.Vino vnc-password "$(echo -n "newpass" | base64)"

Hope this helps

Solution 2

I found another way of doing this in a script (as root):

#!/bin/sh    

myuser="asimov"
mypasswd="mysecret"

mkdir /home/$myuser/.vnc
echo $mypasswd | vncpasswd -f > /home/$myuser/.vnc/passwd
chown -R $myuser:$myuser /home/$myuser/.vnc
chmod 0600 /home/$myuser/.vnc/passwd

Cheers!

Solution 3

Was able to do it this way today (from a dockerfile at least):

RUN printf "password\npassword\n\n" | vncpasswd

Solution 4

By slightly modifying steeldriver's version I was able to automate my usage of vncpasswd. Allows passing both the password and filename for vncpasswd to create.

Usage: $ ./scriptname <filename> <password>

#!/bin/sh    

myuser="$1"
mypass="$2"

/usr/bin/expect <<EOF
spawn /usr/bin/vncpasswd $myuser
expect "Password:"
send "$mypass\r"
expect "Verify:"
send "$mypass\r"
expect eof
exit
EOF
Share:
21,526

Related videos on Youtube

William
Author by

William

Updated on September 18, 2022

Comments

  • William
    William over 1 year

    I am using a script to automatically set up a computer. I need to assign a password to the vnc server for the user, which is normally done using the vncserver command. However, it prompts for the user to enter and re-enter their password, neither of which the script is capable of doing. So, how can I set up the VNC password without an interactive prompt?

    Thanks.

  • David Foerster
    David Foerster over 7 years
    It's generally discouraged to pass secrets as command-line arguments because they can be viewed by all users.
  • Christopher Shroba
    Christopher Shroba about 7 years
    Did you launch vncserver any differently after doing this? When I set the passwd file manually, I'm still prompted to specify a password when I run vncserver.
  • Raj
    Raj over 5 years
    I think this is the simplest cleanest way. Works in a script and in my case I'm using su and it works there as well, i.e. su -l -c 'printf "password\npassword\n\n" | vncpasswd' username
  • Lance Kind
    Lance Kind over 4 years
    Using the above comment by @raj worked well for me (I'm on VNC4): sudo printf "password\npassword\n\n" | vnc4passwd
  • Abdennour TOUMI
    Abdennour TOUMI about 4 years
    best answer IMOH
  • Rex Linder
    Rex Linder almost 3 years
    To clarify for others what this is doing, -f prints to STDOUT and then redirects the output to the passwd file with the >.