Команда (.4gl), выполненная с помощью SSH.NET SshClient.RunCommand, завершается с ошибкой Нет такого файла или каталога

У меня есть веб-служба, которая использует SSH.NET для вызова сценария оболочки в системе Unix.

Если я запускаю скрипт нормально, он работает нормально, корректно работает с БД Informix.

Небольшая предыстория:
я вызываю скрипт, который выполняет .4gl (не могу показать это как бизнес-знание).

g4l возвращает следующую ошибку в журнал, когда я запускаю ее с помощью SSH.NET:

fglgo: ошибка при загрузке общих библиотек: libiffgisql.so: невозможно открыть общий объектный файл: нет такого файла или каталога
file_load завершен: 21 сентября 2017 г., 15:37:01

Код C# для выполнения сценария SSH.NET

sshclients = new SshClient(p, 22, username, password);
sshclients.Connect();
sshclients.KeepAliveInterval = new TimeSpan(0, 0, 1);
sshclients.RunCommand("sh " + Script_dir);

Я добавил KeepAliveInterval, чтобы посмотреть, поможет ли это.

Мой вопрос связан с ошибкой, которую я получаю от Unix/4gl.
Почему это происходит и кто может заставить скрипт выполняться правильно?


person JvD    schedule 21.09.2017    source источник


Ответы (2)


SshClient.RunCommand использует внутренний канал SSH exec. Он по умолчанию (правильно) не выделяет псевдотерминал (PTY) для сеанса. Как следствие, используется (может быть) другой набор сценариев запуска. И/или берутся разные ветки в скриптах, исходя из отсутствия/наличия переменной окружения TERM. Таким образом, среда может отличаться от интерактивного сеанса, который вы используете с вашим SSH-клиентом.

Итак, в вашем случае PATH, вероятно, установлен по-другому; и, следовательно, общий объект не может быть найден.

Чтобы убедиться, что это основная причина, отключите выделение псевдотерминала в вашем SSH-клиенте. Например, в PuTTY это Соединение › SSH › TTY › Не выделять псевдотерминал. Затем перейдите в раздел Подключение › SSH › Удаленная команда и введите команду g4l. Установите флажок Сеанс › Закрывать окно при выходе › Никогда и откройте сеанс. Вы должны получить ту же ошибку Нет такого файла или каталога.


Способы исправить это, в порядке предпочтения:

  1. Исправьте сценарии, чтобы они не зависели от конкретной среды.

  2. Исправьте сценарии запуска, чтобы установить PATH одинаково как для интерактивных, так и для неинтерактивных сеансов.

  3. Если сама команда зависит от конкретной настройки среды и вы не можете исправить сценарии запуска, вы можете изменить среду в самой команде. Синтаксис для этого зависит от удаленной системы и/или оболочки. В обычных системах *nix это работает:

     sshclients.RunCommand("PATH=\"$PATH;/path/to/g4l\" && sh ...");
    
  4. Другой (не рекомендуемый) подход заключается в принудительном выделении псевдотерминала для исполнительного канала.

    Хотя SSH.NET этого не поддерживает. Вам нужно будет изменить его код SendPseudoTerminalRequest запроса в реализации .RunCommand (я не проверял это).

    Вы также можете попробовать использовать канал оболочки, используя метод .CreateShell. Для этого SSH.NET поддерживает выделение псевдотерминала.

    Однако использование псевдотерминала для автоматизации выполнения команды может привести к неприятным побочным эффектам. См., например, Есть ли простой способ избавиться от ненужных значений, которые появляются, когда вы используете SSH с помощью библиотеки Python Paramiko и получаете выходные данные из CLI удаленная машина?


По похожим вопросам см.

person Martin Prikryl    schedule 21.09.2017

Сталкивались с подобными вопросами, которые задавали разработчики Informix-4gl при переходе на FourJs Genero и использовании его функций веб-сервисов. Я задаю им вопрос: «Кому принадлежит процесс fglgo/fglrun, запущенный сервером приложений Genero, откуда он запущен и какова его среда». При необходимости я проиллюстрирую простую программу, которая делает что-то вроде...

MAIN 
    RUN "env > /tmp/myname.txt"
    RUN "who >> /tmp/myname.txt"
    RUN "pwd >> /tmp/myname.txt"
END MAIN   

... и скажем, сравните с запуском программы из командной строки. Обычно это случай, как в предыдущем ответе о настройке, чтобы среда была установлена ​​​​правильно до выполнения программы 4gl.

person fourjs.reuben    schedule 16.10.2017