Установка переменных окружения в jsch ChannelExec - PullRequest
3 голосов
/ 20 февраля 2012

Я хочу запустить удаленную команду в ChannelExec (не ChannelShell) в jsch.Очевидно, что переменные окружения не загружены, но моей команде они нужны:

_channel.setCommand("source /etc/bash.bashrc; source ~/.bashrc; echo $LD_LIBRARY_PATH");
_channel.connect();

ничего не возвращает, хотя LD_LIBRARY_PATH установлено в моем ~/.bashrc.

_channel.setEnv("LD_LIBRARY_PATH", "/my/add/path:$LD_LIBRARY_PATH");
_channel.setCommand("echo $LD_LIBRARY_PATH");
_channel.connect();

тоже не работает - по-прежнему нет вывода команды echo.

Есть идеи, что не так?Когда именно мне нужно позвонить setEnv?До того, как я сделаю connect() или после?И почему неявное решение через source не работает?

Ответы [ 5 ]

3 голосов
/ 21 февраля 2012

Я нашел обходной путь сейчас, но это не решение.Я предполагаю, что setEnv() глючит, либо в JSch, либо в Open SSH сервере.

Обходной путь:

_channel.setCommand("export LD_LIBRARY_PATH=\"foo\" && echo $LD_LIBRARY_PATH");
3 голосов
/ 21 февраля 2012

Для второго способа это, я полагаю, нормально, что это не работает.Хотя SSH-клиент может отправлять любую переменную среды, которую он хочет, сервер решает, какие из них передаются целевому процессу, а какие просто игнорируются.Часто серверы настроены на использование только LC_*, TERM и подобных переменных.Для OpenSSH sshd вы можете настроить это в sshd_config с параметром AcceptEnv.(В текущих системах Ubuntu по умолчанию используется значение AcceptEnv LANG LC_*.)

Кроме того, передача значения $LD_LIBRARY_PATH в значение переменной не будет работать, поскольку сервер, скорее всего, не будет интерпретировать значение как оболочку.выражение.

Во-первых, я понятия не имею, почему это не работает.Может быть, в ваших скриптах bashrc есть несколько программ для немедленного выхода, если они не в интерактивном режиме или не подключены к терминалу?Здесь может помочь полный воспроизводимый пример.

0 голосов
/ 05 апреля 2017

Вы пробовали

_channel.setCommand("echo \\$LD_LIBRARY_PATH");

ПРИМЕЧАНИЕ «двойная косая черта» (\\) перед знаком «доллар» ($).

0 голосов
/ 25 июня 2014

Согласно SSH RFC, переменная TERM устанавливается при инициализации соединения SSH. Это установлено изначально, независимо от AcceptEnv. https://tools.ietf.org/html/rfc4254#section-6.2

Как и другие говорили, чтобы вызвать _channel.setEnv (), вам нужно изменить AcceptEnv. Jcraft по умолчанию отправляет vt100.

в RequestPtyReq.java:

   class RequestPtyReq extends Request{
      private String ttype="vt100";
      private int tcol=80;
      private int trow=24;
      private int twp=640;
      private int thp=480;
0 голосов
/ 13 марта 2012

Установка Acceptenv для имени или шаблона переменной среды, которая должна быть унаследована, работала для меня. Файл находится в /etc/ssh/sshd_config.

В RFC для использования setEnv упоминается, что настройки сервера должны утверждать настройку переменных среды.

AcceptEnv PATH
AcceptENV ORA*
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...