Порождение интерактивной сессии telnet из сценария оболочки

Когда вы сталкиваетесь с «странным» исключением, указывающим на то, что классы / методы / файлы / компоненты / теги отсутствуют или различаются, хотя они явно включены в веб-приложение, такое как приведенные ниже,

java.lang.ClassFormatError: Отсутствует атрибут кода в методе, который не является родным или абстрактным в файле класса javax / faces / webapp / FacesServlet

blockquote>

java.util.MissingResourceException: Не удается найти javax.faces.LogStrings bundle

blockquote>

com.sun.faces.vendor.WebContainerInjectionProvider не может быть cast to com.sun.faces.spi.InjectionProvider

blockquote>

com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED

blockquote>

Тег с именем inputFile из пространства имен http: & # x2f; /xmlns.jcp.org/jsf/html имеет нулевой класс обработчика.

java.lang.NullPoint erException в javax.faces.CurrentThreadToServletContext.getFallbackFactory

blockquote>

java.lang.AbstractMethodError в javax.faces.application.ViewHandlerWrapper.getWebsocketURL

или когда вы сталкиваетесь с «странным» временем выполнения, таким как сломанные сеансы HTTP (jsessionid отображается в URL-адресах по всему месту) и / или сломанная область видимости JSF (она ведет себя как область запроса) и / или сломанные ресурсы CSS / JS / image, тогда вероятность велика, что путь к классу среды выполнения Webapp загрязнен дублированными разными версиями JAR-файлов.

В вашем конкретном случае с ClassFormatError на FacesServlet, это означает, что файл JAR, содержащий упомянутый класс, был найден в первый раз, фактически является «файлом JAR-файла API», предназначенным для поставщиков решений (таких как разработчики, работающие в Mojarra и MyFaces). Он содержит файлы классов с только сигнатурами классов и методов, без каких-либо структур кода и файлов ресурсов. Именно это означает «отсутствующий атрибут кода».

Всегда отмечайте серверные библиотеки как provided

Все зависимости, помеченные как « Спецификации Java » в Maven и имеющие -api суффикс в идентификаторе артефакта - эти API-интерфейсы. Их не должно быть в пуле классов. Вы должны всегда отмечать их provided, если вам действительно нужно иметь его в своем пом. Известным примером является API-интерфейс Java EE (Web) :


    javax
    javaee-web-api
    
    provided

Если область provided отсутствует, то этот JAR окажется в файле /WEB-INF/lib webapp [ , вызывая все проблемы, с которыми вы сталкиваетесь сейчас. В этом конкретном случае у вас есть ненужная зависимость JSF API :


    javax.faces
    javax.faces-api

вызывает проблему, потому что в ней содержится класс чертежа FacesServlet. Удалите его и опираясь на API-интерфейс provided Java EE (Web), как показано выше, должны решить его.

Tomcat как баскетбольный контейнер JSP / Servlet уже предоставляет JSP, Servlet и EL (а также 8 WebSocket). Поэтому вы должны отмечать как минимум jsp-api, servlet-api и el-api как provided. Tomcat не предоставляет JSF (и JSTL ). Таким образом, вам нужно будет установить его через webapp.

Полноценные серверы Java EE, такие как WildFly, TomEE, GlassFish, Payara, WebSphere и т. Д., Уже предоставляют весь API Java EE, включая JSF , Поэтому вам абсолютно не нужно устанавливать JSF через webapp. Это приведет только к конфликтам, если сервер уже предоставит другую версию и / или версию из коробки. Единственная зависимость, в которой вы нуждаетесь, - это javaee-web-api, как показано выше.

Установка JSF на Tomcat

. Правильный способ установки JSF в Tomcat упоминается в нашей JSF wiki - Установка JSF . Существует 2 реализации JSF, Mojarra и MyFaces . Вы должны выбрать один из них и, следовательно, не оба.

Установка Mojarra на Tomcat:


    org.glassfish
    javax.faces
    

Вы также можете проверить org.glassfish:javax.faces репозиторий для текущей последней версии (которая в настоящее время 2.2.13). См. Также собственные инструкции по установке Mojarra .

Установка MyFaces на Tomcat:


    org.apache.myfaces.core
    myfaces-api
    


    org.apache.myfaces.core
    myfaces-impl
    

Вы также можете проверить репозиторий org.apache.myfaces.core:myfaces-bundle для текущей версии последней версии (в настоящее время 2.2.10).

Обратите внимание, что Tomcat 6 как контейнер Servlet 2.5 поддерживает максимальный JSF 2.1. Не забудьте также установить JSTL. См. Также наш JSF wiki - Установка JSF .

См. Также:

11
задан Murali Suriar 19 September 2008 в 09:53
поделиться

8 ответов

Необходимо перенаправить Терминальный вход к telnet процесс. Это должно быть /dev/tty. Таким образом, Ваш сценарий посмотрит что-то как:

#!/bin/bash

for HOST in `cat`
do
  echo Connecting to $HOST...
  telnet $HOST </dev/tty
done
7
ответ дан 3 December 2019 в 08:31
поделиться

Я думаю, что необходимо посмотреть на, ожидают программу. Это присутствует во всех современных дистрибутивах Linux. Вот некоторый сценарий экс-клена:

#!/usr/bin/expect -f
spawn telnet $host_name
expect {
   "T0>"                {}
   -re "Connection refused|No route to host|Invalid argument|lookup failure"
                        {send_user "\r******* connection error, bye.\n";exit}
   default              {send_user "\r******* connection error (telnet timeout),
 bye.\n";exit}
}
send "command\n"
expect -timeout 1 "something"

команда икры запускает программу удаленного входа в систему (telnet, ssh, netcat и т.д.)

команда expext, привыкшая к... гм.. ожидайте что-то от удаленного сеанса

отправьте - передающие команды

send_user - распечатать комментарии к stdout

5
ответ дан 3 December 2019 в 08:31
поделиться

Возможно, Вы могли попробовать удар-i, чтобы вынудить сессию быть в интерактивном режиме.

0
ответ дан 3 December 2019 в 08:31
поделиться

Спасибо Dave - это было перенаправление TTY, которое я пропускал.

Полное решение, которое я использовал для тех, кому интересно:

#!/bin/bash

TTY=`tty` # Find out what tty we have been invoked from.
for i in `cat hostnames.csv` # List of hosts/ports
do
        # Separate port/host into separate variables
        host=`echo $i | awk -F, '{ print $1 }'`
        port=`echo $i | awk -F, '{ print $2 }'`
        telnet $host $port < $TTY # Connect to the current device
done
1
ответ дан 3 December 2019 в 08:31
поделиться

@muz у меня есть установка с ssh, никаким telnet, таким образом, я не могу протестировать, если Вашей проблемой является связанный telnet, но выполнение следующего сценария, регистрирует меня последовательно к различным машинам, просящим пароль.

for i in adele betty
do
ssh all@$i
done
0
ответ дан 3 December 2019 в 08:31
поделиться

Проблема в Вашем примере состоит в том, что Вы связываете вход своего сценария (и косвенно telnet) к выводу echo. Таким образом после echo сделан и telnet запускается, там больше не вводится для чтения. Простая фиксация могла быть должна заменить echo "testhost" { echo "testhost"; cat; }.

Править: telnet кажется, не любит брать, вводят от канала. Однако netcat делает и вероятно просто подходит в этом случае.

0
ответ дан 3 December 2019 в 08:31
поделиться

Telnet к серверу с использованием сценария оболочки Пример:

Test3.sh Файл:

#!/bin/sh

#SSG_details is file from which script will read ip adress and uname/password
#to telnet.

SSG_detail=/opt/Telnet/SSG_detail.txt

cat $SSG_detail | while read ssg_det ; do

   ssg_ip=`echo $ssg_det|awk '{print $1}'`
   ssg_user=`echo $ssg_det|awk '{print $2}'`
   ssg_pwd=`echo $ssg_det|awk '{print $3}'`


   echo " IP to telnet:" $ssg_ip
   echo " ssg_user:" $ssg_user
   echo " ssg_pwd:" $ssg_pwd

   sh /opt/Telnet/Call_Telenet.sh $ssg_ip $ssg_user $ssg_pwd 

done


exit 0

Сценарий Call_Telenet.sh выглядит следующим образом:

#!/bin/sh

DELAY=1 
COMM1='config t'                 #/* 1st commands to be run*/
COMM2='show run'
COMM3=''
COMM4=''
COMM5='exit'
COMM6='wr'
COMM7='ssg service-cache refresh all'
COMM8='exit'                     #/* 8th command to be run */


telnet $1 >> $logfile 2>> $logfile |&
sleep $DELAY
echo -p $2 >> $logfile 2>> $logfile
sleep $DELAY
echo -p $3 >> $logfile 2>> $logfile
sleep $DELAY
echo -p $4 >> $logfile 2>> $logfile
sleep $DELAY
echo -p $5 >> $logfile 2>> $logfile
sleep $DELAY

sleep $DELAY
sleep $DELAY
sleep $DELAY
echo -p $COMM7 >> $logfile 2>> $logfile
sleep $DELAY
echo -p $COMM8 >> $logfile 2>> $logfile
sleep $DELAY

exit 0

Запустите указанный выше файл следующим образом:

$> ./test3.sh 
1
ответ дан 3 December 2019 в 08:31
поделиться

Если ваша среда основана на X11, есть возможность открыть xterm с запущенным telnet:

xterm -e telnet $host $port

Операции в xterm являются интерактивными, и сценарий оболочки останавливается до завершения работы xterm.

0
ответ дан 3 December 2019 в 08:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: