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

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

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

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

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

fglgo: ошибка при загрузке общих библиотек: libiffgisql.so: не удается открыть общий объектный файл: нет такого файла или каталога
загрузка файла закончилась: 2017-09-21 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.
Почему это происходит, и кто может заставить скрипт работать правильно?

Ответы на вопрос(2)

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

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

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

Решение Вопроса

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

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

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

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

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

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

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

sshclients.RunCommand("PATH=\"$PATH;/path/to/g4l\" && sh ...");

Другой (не рекомендуемый) подход заключается в принудительном выделении псевдотерминала для канала «exec».

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

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

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

По аналогичным вопросам смотрите

Renci SSH.NET - строка результата не возвращается для opmnctlНекоторые команды Unix терпят неудачу с "... not found", когда выполняются через Java с использованием JSchКоманды, выполняемые с использованием JSch, ведут себя иначе, чем в терминале SSH (обходит подтверждение сообщения «да / нет»)JSch: Есть ли способ выставить переменные среды пользователя на канал "exec"?
 Jaco Van Deventer22 сент. 2017 г., 16:09
Спасибо, Мартин получил C # для работы.
 Jaco Van Deventer21 сент. 2017 г., 21:33
Большое спасибо, Мартин. пункт 3 исправил проблему. Этот скрипт взаимодействует через файлы в другом каталоге под названием «CREDIT_LOAD_DIR». Я попытался добавить настройку среды 2de. я добавил это: SshCommand SC = sshclients.CreateCommand ("PATH = \" $ PATH; // usr / dir \ "" + "&& CREDIT_LOAD_DIR = \" $ CREDIT_LOAD_DIR; // usr / dir "+" && sh "+ Script_dir ); но теперь скрипт не выполняется
 Jaco Van Deventer21 сент. 2017 г., 21:38
Можно ли добавить несколько настроек среды в команду, как я?
 Jaco Van Deventer21 сент. 2017 г., 21:40
извините автокоррекция меня в 1-м комментарии перебирает файлы
 Martin Prikryl22 сент. 2017 г., 08:16
Вы пропускаете двойную кавычку после значенияCREDIT_LOAD_DIR, Должно быть какsshclients.CreateCommand("PATH =\"$PATH;//usr/dir\" "+ " && CREDIT_LOAD_DIR=\"$CREDIT_LOAD_DIR;//usr/dir\" " + " && sh " + Script_dir); - Также я не уверен, почему ты удваиваешь передний слеш в//usr/dir (хотя это не должно причинить вреда, это просто сбивает с толку).

Ваш ответ на вопрос