Назад | Перейти на главную страницу

Почему необходимо установить TERM = xterm, чтобы мой скрипт работал правильно при удаленном выполнении?

Я пытаюсь автоматизировать установку сервера Debian (debian 6.0 squeeze 64bit).

Часть установки требует, чтобы был установлен пакет Sun JRE.

Этот пакет имеет лицензионное соглашение, которое необходимо принять. У меня есть сценарий, который использует следующие строки для принятия и установки JRE:

echo "sun-java6-bin shared/accepted-sun-dlj-v1-1 boolean true" | debconf-set-selections
apt-get install -y sun-java6-jre

Это отлично работает при локальном выполнении сценария. Однако мне нужно выполнить сценарий удаленно с помощью команды ssh, например:

ssh -i keyFile root@hostname './myScript'

Это не работает.

В частности, он не работает на apt-get install -y sun-java6-jre. Казалось бы, несмотря на то, что я установил лицензионное соглашение на «принято», при удаленном запуске таким образом оно игнорируется.

Несмотря на установку значения на true, Я все еще получаю запрос на принятие соглашения вручную, когда я запускаю эту команду:

ssh -i keyFile root@hostname 'apt-get install -y sun-java6-jre'

Я подозреваю, что это как-то связано со средой, о которой заботятся при запуске надлежащего сеанса терминала, но я понятия не имею, что попробовать дальше, чтобы исправить это.

Редактировать 0: Я сравнил вывод env при удаленном выполнении через ssh и при выполнении через сеанс локального терминала. Единственная разница между выходами состоит в том, что сеанс локального терминала имеет дополнительное значение TERM=xterm.

Редактировать 1: Настройка TERM переменная окружения при вызове моего скрипта, вот так ssh -i keyFile root@hostname 'export TERM=xterm; ./myScript', производит правильное поведение, но на самом деле это только половина ответа, поскольку я не знаю Зачем вам нужно установить его. Принятый ответ для человека, который лучше всего сможет объяснить, почему!

(Я также изменил заголовок вопроса с "Удаленная установка Sun / Oracle JRE по сценарию"к"Почему необходимо установить TERM = xterm, чтобы мой скрипт работал правильно при удаленном выполнении?"так как это более точный вопрос)

Это не логический но Выбрать.

Вы можете проверить содержимое базы данных debconf:

root@workstation:~# debconf-show sun-java6-jre
* shared/accepted-sun-dlj-v1-1: true
  sun-java6-jre/stopthread: true
  sun-java6-jre/jcepolicy:
  shared/error-sun-dlj-v1-1:
* shared/present-sun-dlj-v1-1:
root@workstation:~# 

Как вы можете видеть на моей машине, для него уже установлено значение true, потому что я принял его вручную во время установки. Если бы я снова установил sun-java6-jre, мне не пришлось бы принимать лицензию.

Установите значение false:

root@workstation:~# echo sun-java6-jre shared/accepted-sun-dlj-v1-1 select false | /usr/bin/debconf-set-selections

Теперь проверим:

root@workstation:~# debconf-show sun-java6-jre
* shared/accepted-sun-dlj-v1-1: false
  sun-java6-jre/stopthread: true
  sun-java6-jre/jcepolicy:
  shared/error-sun-dlj-v1-1:
* shared/present-sun-dlj-v1-1:
root@workstation:~# 

Поэтому постарайтесь :

ssh -i keyFile root@hostname "echo sun-java6-jre shared/accepted-sun-dlj-v1-1 select true | /usr/bin/debconf-set-selections && apt-get install -y sun-java6-jre"

Используйте команду debconf-show для устранения неполадок.

Я подозреваю, когда ты говоришь

Это отлично работает при локальном выполнении сценария.

Это потому, что вы в какой-то момент установили sun-java6-jre вручную.

Пакет sun-java6-jre содержит preinst скрипт, запрашивающий лицензионное соглашение через /usr/share/debconf/confmodule (также известный как интерфейс "сценария оболочки" к интерфейсу debconf). За реализацией debconf очень сложно следить, но я предполагаю, что реализация db_input() проверяет TERM переменная среды и пытается реализовать разные запросы лицензионного соглашения для разных терминалов. См. Руководство по debconf на http://www.fifi.org/doc/debconf-doc/tutorial.html. Идея состоит в том, что интерфейс debconf может в конечном итоге использовать дисплей Брайля, если конечный пользователь имеет слабое зрение, и сценарий preinst будет просто работать.

Насколько я понимаю, вы не должны передавать вывод сценария в интерактивный интерфейс debconf. Он предназначен для потребления человеком и может измениться в любое время (в зависимости от переменных окружающей среды, фазы луны и т. Д.). Возможно, вы захотите погуглить debconf frontend noninteractive.

Поскольку вопрос изменился, вот и другой ответ.

Переменная TERM проверяется как часть sun-java5-jre preinst сценарий (см. Вот ). Внутри этого скрипта / usr / share / debconf / confmodule используется для взаимодействия с базой данных deconf и для проверки того, была ли лицензия принята в базе данных или нет. В противном случае он вызовет метод debconf, чтобы предоставить вам лицензию. Debconf представит его способом, подходящим для вашей среды. Здесь на помощь приходит TERM. Если у вас нет TERM, следует переключиться на другие методы.

Итак, вот пример, когда для лицензии установлено значение false в debconf (не принято)

Preparing to replace sun-java6-jre 6.26-1~lffl~oneiric~ppa (using .../sun-java6-jre_6.26-1~lffl~oneiric~ppa_all.deb) ...
debconf: Unable to initialise frontend: Dialog
debconf: (TERM is not set so the dialogue frontend is not usable.)
debconf: falling back to frontend: Readline
debconf: Unable to initialise frontend: Readline
debconf: (This frontend requires a controlling tty.)
debconf: falling back to frontend: Teletype
Configuring sun-java6-jre
-------------------------

Operating System Distributor License for Java v1.1 (DLJ)

Operating System Distributor License for Java version 1.1 (DLJ)

SUN MICROSYSTEMS, INC. ("SUN") IS WILLING TO LICENSE THE JAVA PLATFORM STANDARD
EDITION DEVELOPER KIT ("JDK" - THE "SOFTWARE") TO YOU ONLY UPON THE CONDITION
THAT YOU ACCEPT ALL OF THE TERMS CONTAINED IN THIS LICENSE AGREEMENT (THE
"AGREEMENT").  PLEASE READ THE AGREEMENT CAREFULLY.  BY INSTALLING, USING, OR
DISTRIBUTING THIS SOFTWARE, YOU ACCEPT ALL OF THE TERMS OF THE AGREEMENT. 



...................................... CUT .................................
    DLJ v1.1                                                  27APR2006ANS

In order to install this package, you must accept the license terms, the
"Operating System Distributor License for Java" (DLJ), v1.1. Not accepting will
cancel the installation.

Do you accept the DLJ license terms? yes

А вот пример, когда лицензия была утверждена (в deconf установлено значение true)

 root@workstation:/home/andrey/buildarea# ssh root@localhost "echo 'sun-java6-bin shared/accepted-sun-dlj-v1-1 boolean true' | debconf-set-selections && aptitude -y reinstall sun-java6-jre"
root@localhost's password:
Reading package lists...
Building dependency tree...
Reading state information...
Reading extended state information...
Initialising package states...
Writing extended state information...
The following packages will be REINSTALLED:
  sun-java6-jre
0 packages upgraded, 0 newly installed, 1 reinstalled, 0 to remove and 168 not upgraded.
Need to get 0 B/6,381 kB of archives. After unpacking 0 B will be used.
Writing extended state information...
debconf: Unable to initialise frontend: Dialog
debconf: (TERM is not set so the dialogue frontend is not usable.)
debconf: falling back to frontend: Readline
debconf: Unable to initialise frontend: Readline
debconf: (This frontend requires a controlling tty.)
debconf: falling back to frontend: Teletype
dpkg-preconfigure: Unable to re-open stdin:
(Reading database ... 161723 files and directories currently installed.)
Preparing to replace sun-java6-jre 6.26-1~lffl~oneiric~ppa (using .../sun-java6-jre_6.26-1~lffl~oneiric~ppa_all.deb) ...
debconf: Unable to initialise frontend: Dialog
debconf: (TERM is not set so the dialogue frontend is not usable.)
debconf: falling back to frontend: Readline
debconf: Unable to initialise frontend: Readline
debconf: (This frontend requires a controlling tty.)
debconf: falling back to frontend: Teletype
sun-dlj-v1-1 license has already been accepted
Unpacking replacement sun-java6-jre ...
Processing triggers for shared-mime-info ...
Setting up sun-java6-jre (6.26-1~lffl~oneiric~ppa) ...
Reading package lists...
Building dependency tree...
Reading state information...
Reading extended state information...
Initialising package states...
Writing extended state information...
root@workstation:/home/andrey/buildarea# 

Получаете ли вы такие же сообщения debconf во время установки? Вы можете увидеть мои эксперименты и успешную установку sun-java6-jre по SSH Вот ПРИМЕЧАНИЕ. При запуске ssh root @ localhost "env" я также не вижу переменную TERM.

Если вы хотите увидеть, что делает пакет deb до, во время и после установки, загрузите файл .deb:

aptitude download sun-java6-jre

Извлечь .deb

ar x sun-java6-jre......deb

Распакуйте control.tar.gz и просмотрите файлы preinstal и другие файлы. data.tar.gz - это содержимое пакета.

Возможно, это не даст прямого ответа на ваш вопрос, но, надеюсь, поможет.