5.6. SSH#

5.6.1. Введение#

Сервер приложений Global ERP включает в себя SSH (Secure Shell) сервер, к которому возможно подключиться любым SSH-терминалом.

С помощью команд командной строки возможно:

  • Управлять клиентскими сессиями

  • Обновлять и перезагружать код прикладных приложений

  • Перезапускать Web-приложения

  • Выполнять SQL и Jexl-скрипты

5.6.2. Конфигурирование#

Конфигурационный файл global3.config.xml может содержать секцию <ssh/>:

<ssh defaultDb="PostgreSql" port="22"/>

Учётные данные пользователей, имеющих права на ssh-соединения, указываются в секции <security/> конфигурационного файл global3.config.xml:

<security>
  <users>
    <user name="admin" password="admin" roles="ssh"/>
  </users>
</security>

5.6.2.1. Шифрование пароля#

Для шифрования пароля необходимо запустить Global 3 Server c парамерами.

start.bat -encryptPassword password -masterPassword masterpassword

Где:

  • encryptPassword - пароль который необходимо зашифровать.

  • masterPassword - ключ шифрования.

Результатом выполнения будет вывод в консоль строки, полученной в результате шифрования пароля переданного параметром -encryptPassword.

5.6.2.2. Криптографический ключ SSH-сервера#

Приватный ключ SSH-сервера используется для удостоверения подлинности узла при установке защищённого SSL-соединения. Дистрибутив сервера приложений содержит в себе ключ SSH-сервера по умолчанию, что бы он не менялся при каждом перезапуске сервера.

Changed in version 1.22.0-rc16: Добавлена возможность замены ключа.

Для изменения ключа SSH-сервера, разместите/замените файл ./ssh/ssh_host_key в каталоге с конфигурационными файлами сервера.

{G3_HOME}
└── application
  └── config
    └── ssh
       └── ssh_host_key

Tip

Для создания или конвертации ключей можно воспользоваться графической утилитой C:\Program Files\PuTTY\puttygen.exe

ssh_host_key - файл содержит приватный RSA-ключ в формате PEM.

-----BEGIN RSA PRIVATE KEY-----
AAGHJJKKKLLJGKLYGKJHGLKJGHLKJHLKJHLKJHKJH...
-----END RSA PRIVATE KEY-----

или

-----BEGIN OPENSSH PRIVATE KEY-----
c2gtcnNhAAAAAwEAAQAAAQEAgZFF5/IE3G6Ccw5jd...
-----END OPENSSH PRIVATE KEY-----

5.6.2.3. Криптографические ключи SSH-пользователей#

Для аутентификации пользователя, при подключении к SSH-серверу, вместо пароля может быть использован публичный криптографический ключ. Публичный ключ пользователя должен быть добавлен в файл authorized_keys, соответсвующий пользователю, в каталоге с конфигурационными файлами сервера приложений.

Changed in version 1.22.0-rc16: Добавлена возможность замены ключа для пользователя admin и добавление ключей других пользователей.

Структура хранения публичных ключей пользователей для аутентификации в ssh.

{G3_HOME}
└── application
  └── config
    └── users
      ├── admin
      | └── .ssh
      |   └── authorized_keys
      └── user
        └── .ssh
          └── authorized_keys

Note

Криптографический ключ пользователя является дополнительной информацией к учётной записи пользователя, определенной в конфигурации сервера приложений.

5.6.3. Подключение#

Подключиться к SSH-серверу возможно любым SSH-терминалом.

5.6.3.1. Putty#

PuTTY.

5.6.3.1.1. Основные параметры#

Для подключения необходимо указать:

  • Host Name: host или user@host

  • Port: 22 или пользовательский

  • Connection type: SSH

Что бы не вводить значения полей при повторном запуске PuTTY, можно сохранить параметры подключения по умолчанию, нажав кнопку «Save».

Пример запуска из командной строки:

"C:\Program Files\PuTTY\putty.exe" -ssh localhost -P 22 -l admin -pw admin

5.6.3.1.2. Сохранение логов#

Для сохранения всего текстового вывода в файл, на вкладке Logging диалога подключения необходимо указать:

  • Session Logging: All session output

  • Log file name:: полный путь к файлу

    Warning

    В путях символ \ необходимо экранировать удвоением. Пример: C:\\directory\\log.txt.
    Символ / экранировать не требуется. Пример: C:/directory/log.txt.

5.6.3.1.3. Подключение с использованием RSA ключа#

При подключении к SSH из *.bat иил *.sh можно воспользоваться RSA-ключом вместо пароля.

"C:\Program Files\PuTTY\putty.exe" -ssh localhost -P 22 -l admin -i ssh_admin_private_key.ppk

Tip

Для создания или конвертации ключей можно воспользоваться графической утилитой C:\Program Files\PuTTY\puttygen.exe

5.6.3.2. Windows 10 Shell#

ssh admin@localhost -p 22

5.6.4. Команды#

  • add license

    Entering terminal in to ‘lic’ mode for input a new license.

  • alter server mode [normal|service]

    Enters the server into service or normal mode.

  • attach db [dbAlias] [as sys]

    Establish connection to the default or specified {dbAlias} database.

  • clear

    Clear terminal window.

  • clear persistence cache [{dbAlias}]

    Clear persistence shared cache.

  • compare applib {release_path}

    Compare jar’s in current sbt jarDir and release dir.

  • copy applib [force] {release_path}

    Copy jar’s from release dir to current SBT jarFolder.

  • detach

    Detach database connection, established by attach command.

  • dump all session threads

    Print stack trace of all or session threads.

  • dump all threads

    Print stack trace of all threads.

  • dump session thread {sid}

    Print stack trace of the session {sid} thread.

  • echo {message}

    Print {message}.

  • execute {expression}

    Execute Jexl expression.

  • exit

    Close SSH session.

  • help

    Print list of available commands.

  • init schema

    Initialize database schema. Required ‘attach db as sys’ before.

  • init data

    Initialize default data. Required ‘attach db as sys’ before.

  • jexl

    Entering terminal in to ‘jexl’ mode for input a text of JEXL-script.

  • kill session {sid}

    Kill the session {sid}.

  • kill classloader {mills} | [{sbtName} {mills}]

    Force close ClassLoaders witch was deactivated older then {mills} milliseconds.

  • list license | sbt | web | session

    List licenses or sbt instances or web applications or user sessions.

  • log-debug sql| app| el| oper| script| all

    Set DEBUG log level.

  • log-error sql | app | el | oper | script | all

    Set ERROR log level.

  • log-info sql | app | el | oper | script | all

    Set INFO log level.

  • log-off sql | app | el | oper | script | all

    Set OFF log level.

  • log-trace sql | app | el | oper | script | all

    Set TRACE log level.

  • log-warn sql | app | el | oper | script | all

    Set WARN log level.

  • logattach

    Start monitoring log messages.

  • login {user/password@dbAlias}|{}

    Open a user session to the database.

  • logout

    Close a user session or disconnect from session attached earlier.

  • print license request

    Print license request.

  • print current license

    Print aggregate of all installed licenses.

  • refresh web {web}

    Restart web application.

  • reload sbt {sbt}

    Refresh SBT binary directory and reload ClassLoader.

  • reload persistence {dbAlias}

    Reloading entity descriptors and common libraries.

  • remove license {id}

    Remove license by {id}.

  • reset upgrade {idSession}

    Reset current upgrade state.

  • restart web {web}

    Restart web application.

  • run {file}

    Run script file.

  • save sessions

    Save all E-sessions state.

  • save session {sid}

    Save E-session state.

  • set web {web}

    Set environment variable ‘web’.

  • set db {dbAlias}

    Set environment variable ‘defaultDb’.

  • set sid {sid}

    Set environment variable ‘sid’.

  • shutdown server [{delay}] | [immediate]

    Shutdown server after {delay} (in seconds) or immediate.

  • sql

    Entering terminal in to ‘sql’ mode for input a text of SQL-script.

  • stack trace

    Print stack trace of all session threads.

  • start web {web}

    Start web application named {web}.

  • stop web {web}

    Stop web application named {web}.

  • update acobjects

    Initialize default data. ‘attach db as sys’ before.

  • upgrade [force]

    Run upgrade process. If force - all migrations errors will be ignored

5.6.4.1. Выполнение командного файла ssh#

Для выполнения командного файла из командной строки можно выполнить:

"C:\Program Files\PuTTY\putty.exe" -ssh localhost -P 22 -l admin -pw admin -m shh_logger_test_script.txt

Attention

В данном примере файл shh_logger_test_script.txt размещён на диске клиентской машины, он считывается в момент подключения к SSH-серверу. Пути к файлам в скрипте, являются локальными для сервера.

shh_logger_test_script.txt#
login
log-info app el

execute Btk_ClassApi.getCanonicalClassName("Btk_Object")

jexl
var name = Btk_ClassApi.getCanonicalClassName("Btk_Object");
Btk_ClassApi.getApiByCanonicalClassName(name);
/
/

jexl D:/svn/depot/ASSource/sysapplication/ssh/src/test/java/ru/bitec/app/ssh/shh_jexl_exams.txt
jexl D:\\svn\\depot\\ASSource\\sysapplication\\ssh\\src\\test\\java\\ru\\bitec\\app\\ssh\\shh_jexl_exams.txt

sql
INSERT INTO gs3_roottest (id, idClass) VALUES ((select nextval('GS3_ROOTTEST_SEQ')), 12351) ON CONFLICT DO NOTHING;
/
/

sql D:\\svn\\depot\\ASSource\\sysapplication\\ssh\\src\\test\\java\\ru\\bitec\\app\\ssh\\shh_sql_exams.txt

log-off all
logout

5.6.5. Выполнение SQL#

Для выполнения sql-скрипта:

  1. Подключитесь к сессии командами login, attach или set sid.

  2. Перейдите в режим ввода скрипта командой sql.

  3. Введите текст скрипта.

  4. Выполните скрипт.
    Для этого введите символ / с новой строки.
  5. Выйдите из режима ввода скрипта.
    Для этого введите символ / с новой строки.

Пример:

login admin/admin@postgres
sql
INSERT INTO gs3_roottest (
    id,
    idClass
  ) VALUES (
  (select
    nextval('GS3_ROOTTEST_SEQ'))
    , 12351
  ) ON CONFLICT DO NOTHING;
/
/

5.6.5.1. Выполнение SQL скрипта из файла#

Для выполнения sql-скрипта из файла:

  • Подключитесь к сессии.

  • Выполните команду sql {file}.
    Где {file} – путь к файлу к файлу на сервере.

    Attention

    Файл должен находится на локальном диске сервера.

Пример:

login admin/admin@postgres
sql D:\\globalerp\\scripts\\my_sql_script.sql

Содержимое файла.

my_sql_script.sql#
INSERT INTO gs3_roottest (id, idClass) VALUES ((select nextval('GS3_ROOTTEST_SEQ')), 12351) ON CONFLICT DO NOTHING;
INSERT INTO gs3_roottest (id, idClass) VALUES ((select nextval('GS3_ROOTTEST_SEQ')), 12351) ON CONFLICT DO NOTHING;
/
INSERT INTO gs3_roottest (id, idClass) VALUES ((select nextval('GS3_ROOTTEST_SEQ')), 12351) ON CONFLICT DO NOTHING;
INSERT INTO gs3_roottest (id, idClass) VALUES ((select nextval('GS3_ROOTTEST_SEQ')), 12351) ON CONFLICT DO NOTHING;
/
/

5.6.6. Jexl скрипты#

Для выполнения Jexl-скрипта необходимо:

  1. Подключитесь к сессии командой login, attach или set sid.

  2. Переключитесь в режим ввода скрипта командой ‘’jexl’’.

  3. Введите текст скрипта.

  4. Выполните скрипт
    Для этого введите символ ‘’/’’ с новой строки.
  5. Выйдите из режима ввода
    Для этого введите символ ‘’/’’ с новой строки.

Пример:

login admin/admin@postgres
jexl
var name = Btk_ClassApi.getCanonicalClassName("Btk_Object");
Btk_ClassApi.getApiByCanonicalClassName(name);
/
/

5.6.6.1. Выполнение Jexl скрипта из файла#

Для выполнения sql-скрипта из файла:

  • Подключитесь к сессии.

  • Выполните команду jexl {file}.
    Где {file} – путь к файлу к файлу на сервере.

    Attention

    Файл должен находится на локальном диске сервера.

Пример:

login admin/admin@postgres
jexl D:\\globalerp\\scripts\\my_jexl_script.sql

Содержимое файла.

my_jexl_script.sql#
var name = Btk_ClassApi.getCanonicalClassName("Btk_Object");
Btk_ClassApi.getApiByCanonicalClassName(name);
/
/

5.6.6.2. Контексты выполнения Jexl скрипта#

Возможны следующие контексты выполнения Jexl-скрипта:

  • jexl - Пользовательская сессия

  • jexldb - База данных

  • jexlsys - Сервер приложений

5.6.6.2.1. Пользовательская сессия#

В данном контексте доступны все Api-классы, присутствующие в решении, соответствующем пользовательской сессии.

login user/password@alias
jexl
{текст скрипта}
/
/

5.6.6.2.2. База данных#

В данном контексте доступны методы управления экземпляром базы данных:

  • initschema()

    Выполняет инициализацию/обновление схемы БД в соответствии с текущей прикладной кодовой базой решения.

attach db {alias}
jexl
{текст скрипта}
/
/

5.6.6.2.3. Сервер приложений#

В данном контексте доступны методы управления решениями. Данный контекст является административным и предназначен для управления сервером приложений. Доступны следующие методы:

  • upgrade({release_path})
    Выполняет обновление кодовой базы решения и схемы БД в соответствии с новой прикладной кодовой базой.
    Где:
    {release_path} – путь к каталогу или zip-архиву, на жёстком диске сервера, с релизом прикладных модулей.
attach db {alias} as sys
jexl
{текст скрипта}
/
/

5.6.7. Логирование#

При выполнении скрипта, по умолчанию, в ssh-консоль выводится результат выполнения команды или сообщение об ошибке со стеком вызова.

Для вывода в ssh-консоль дополнительных логов, необходимо их включить. В консоль можно вывести логи следующих типов.

5.6.7.1. Типы логов#

  • oper

    Логи из классов с namespace ru.bitec.engine.model.operation.

  • sql

    Логи sql-вызовов с уровня jdbc-соединения с базой.

  • script

    Логи из скриптового языка в режиме совместимости с Global 1. При работе со Scala не имеют смысла.

  • app
    Логи из классов прикладной логики с namespace ru.bitec.app.*.
    Пример отправки сообщения:
    Logger.Factory.get(Xxx_XxxApi.class).info("Текст сообщения")
    
  • el

    Логи из инфраструктуры EclipseLink. В основном, это sql-вызовы, в более компактном виде, чем логи jdbc.

  • all

    Все выше перечисленные типы логов.

Для переключения уровней логирования используются команды:

  • log-off

  • log-error

  • log-warn

  • log-info

  • log-debug

  • log-trace

Команды указаны в порядке уменьшения уровня логов.

В результате выполнения этой команды:

log-info app el

В ssh-лог будут попадать сообщения типов app и el для уровней логирования: error, warn, info.

Для отключения вывода сообщений в ssh-лог необходимо вызвать команду:

log-off all

5.6.7.2. Перенаправление ssh-лога Putty в файл#

При выполнении скриптов из командной строки, часто необходимо перенаправить вывод в файл. Для ssh-консоли Putty, это выполняется передачей параметра -sessionlog {имя_файла.txt}

5.6.8. FAQ#

Зависает ssh-терминал на этапе подключения к серверу.

При запуске Putty из скрипта при первом подключении к серверу выдается сообщение PuTTY Security Alert, что может приводить к зависанию скрипта.

Необходимо дополнительно передать подтверждение при запуске:

echo yes | %plink% -ssh localhost -P 2222 -l admin -i ssh_admin_private.ppk

Note

Plink входит в состав дистрибутива PuTTY.