JSch не может выполнить команду, это псевдоним и retunr KSH: не найдено - PullRequest
1 голос
/ 24 мая 2019

Я пытаюсь запускать команды через JSch. Я могу запустить стандартные команды, такие как ls. Но если мне нужно выполнить наши команды, скажем, abc <param>, это перезапустит меня

ksh: abc: не найдено

Я пытался использовать ((ChannelExec)channel).setPty(true);, но он все равно не работал.

Мой канал настроен так:

Channel channel=session.openChannel("exec");
((ChannelExec)channel).setPty(true);

((ChannelExec)channel).setCommand(fullCommand);

channel.setInputStream(null);
((ChannelExec)channel).setErrStream(System.err);

InputStream in=channel.getInputStream();
channel.connect();
byte[] tmp=new byte[1024];
while(true){
    while(in.available()>0){
        int i=in.read(tmp, 0, 1024);
        if(i<0)break;
        System.out.print(new String(tmp, 0, i));
    }
    if(channel.isClosed()){
        System.out.println("exit-status: "+channel.getExitStatus());
        break;
    }
    try{Thread.sleep(1000);}catch(Exception ee){}
}

Как мне заставить мои пользовательские команды и псевдонимы работать с JSch?

1 Ответ

2 голосов
/ 24 мая 2019

Самый простой способ - создать собственные сценарии «команд» вместо псевдонимов (или функций). Скрипты работают со всеми режимами оболочки и всеми оболочками, а также с такими вещами, как find xargs nohup nice.

Если у вас должен быть псевдоним и, если вы используете pty, он должен работать для явного запуска ksh в интерактивном режиме. Для (очень) простой команды, как вы показали, вы можете просто использовать "ksh -i -c abc" в качестве команды и убедиться, что псевдоним находится в ~/.kshrc. (ksh позволяет nonlogin rc находиться в другом месте, используя envvar ENV, но передача envvars через ssh часто запрещена или ограничена в целях безопасности.) Однако, если вам нужна более сложная команда с аргументами, особенно если они (должны) содержать пробелы или специальный (ые) символ (ы), такие как кавычки, доллар, обратная кавычка или обратная косая черта, выяснение того, что использовать в качестве аргумента -c, который приводит к ksh выполнению правильной команды, может стать довольно трудным, особенно если вам также необходимо выразить это в Исходный код Java в виде строкового литерала (т.е. не из файла, базы данных, envvar и т. Д.).

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