Настройте TightVNC программно с помощью BASH

Я пишу скрипт для настройки VNC (среди прочего) на многих устройствах на основе Debian. Я хочу включить VNC в эту настройку (в частности, tightVNC, если это возможно) и установить заданный пароль (случайно сгенерированный сценарием). Проблема в том, что каждое руководство, которое я нахожу, предполагает, что это делает человек, и готов сесть, ввести пароль и нажать Enter. Кажется, я не могу заставить Bash повторить пароль для VNC (он всегда говорит «слишком короткий пароль»), и я не могу заставить «ожидать» работать должным образом.

Пример руководства, который я нашел, выглядит следующим образом: http://www.penguintutor.com/linux/tightvnc

Я ищу что-то похожее на это:

#!/bin/bash
echo "Going to configure VNC"
#turn on vnc server
tightvncserver
#spit out password to vnc server for first run only
echo $password
#confirm the pw
echo $password

Но при каждом первом запуске tightvncserver он всегда запрашивает ввод пароля вручную:

Going to configure VNC

You will require a password to access your desktops.

Password: Password too short

Как я могу # 1 обойти это или # 2 использовать bash / ожидать, чтобы ДАТЬ ему пароль, чтобы сделать его счастливым?


person Dwebtron    schedule 02.06.2015    source источник
comment
echo не записывают содержимое в процесс tightvncserver, поэтому это не работает так, как вы хотите.   -  person Charles Duffy    schedule 03.06.2015
comment
... потому что, как это сейчас написано, echo вообще не будет запускаться до тех пор, пока не выйдет tightvncserver.   -  person Charles Duffy    schedule 03.06.2015
comment
Кроме того, tightvncserver считывает пароли из TTY, а не из стандартного ввода, поэтому вы вообще не можете подключиться к нему.   -  person Charles Duffy    schedule 03.06.2015
comment
В любом случае, правильный способ сделать это — использовать команду vncpasswd напрямую, а не полагаться на tightvncserver для запроса, а затем пытаться притвориться телетайпом, чтобы ответить на этот запрос.   -  person Charles Duffy    schedule 03.06.2015
comment
Иногда пароль игнорируется, поэтому установите также правильное разрешение файла: stackoverflow.com/a/61532640/2073804   -  person ron190    schedule 01.05.2020


Ответы (1)


# Configure VNC password
umask 0077                                        # use safe default permissions
mkdir -p "$HOME/.vnc"                             # create config directory
chmod go-rwx "$HOME/.vnc"                         # enforce safe permissions
vncpasswd -f <<<"$password" >"$HOME/.vnc/passwd"  # generate and write a password

Измените по вкусу, если ваша упаковка для tightvnc использует расположение, отличное от ~/.vnc/ для файла passwd.


Если у вас есть отдельные пароли только для просмотра и для полного доступа, то:

vncpasswd -f <<<"$full_password"$'\n'"$view_password" >"$HOME/.vnc/passwd"

Если вам нужна совместимость с /bin/sh (или иначе вы не используете #!/bin/bash shebangs), это будет:

vncpasswd -f >"$HOME/.vnc/passwd" <<EOF
$full_password
$view_password
EOF
person Charles Duffy    schedule 02.06.2015
comment
Большое спасибо! Кажется, я не могу найти расположение пароля на жестком vncserver (я выполнил ваши шаги, все сработало, но он все еще запрашивает пароль .... grrr!) Но, возможно, я смогу найти его самостоятельно. Я посмотрел в home/.vnc/passwd и, хотя там БЫЛ файл, я думаю, я мог поместить его туда самостоятельно? - person Dwebtron; 03.06.2015
comment
Не знаю. Пакет tightvnc, который я использую, устанавливается как vncserver, а не tightvncserver, поэтому наши дистрибутивы работают по-разному. - person Charles Duffy; 03.06.2015
comment
... тем не менее, вы можете запустить tightvncserver вручную, установить пароль, а затем использовать что-то вроде find "$HOME" -mmin -30, чтобы найти места, измененные за последние 30 минут, чтобы найти, где они были сохранены. Или прочитайте скрипт tightvncserver (на моей платформе это perl, но вполне читаемый perl) и посмотрите, какое место хранения он использует таким образом. - person Charles Duffy; 03.06.2015
comment
Вы можете ввести strace tightvncserver 2>&1|grep passw, чтобы найти его. Тогда вы увидите, например. stat64("/root/.vnc/passwd", {st_mode=S_IFREG|0644, st_size=16, ...}) = 0 в качестве последней строки. Не забудьте сделать chmod 600 /root/.vnc/passwd, иначе он будет молча проигнорирован. - person Paul Bußmann; 23.05.2017
comment
Я получил /bin/sh: 1: Syntax error: redirection unexpected - person realtebo; 02.02.2018
comment
@realtebo, <<< - это синтаксис bash, как и $'\n'. Эти конструкции не работают с /bin/sh, поэтому их нельзя использовать в скриптах с #!/bin/sh шебангом. Либо используйте bash shebang вместо этого (как это делает OP - вы заметите, что это ответ на вопрос с тегом bash, а не sh), либо переключитесь на использование heredoc вместо синтаксиса herestring. - person Charles Duffy; 02.02.2018