> Всё остальное, требуемое тобой, тоже выполнимо (думаю, как > и в любом другом шелле). > > Глянул в гугле, вроде как zsh под HP-UX есть.
Спасибо, но наверное не выйдет =((( Не стоит zsh по умолчанию на Чпуксе =(((
Там задача такая тупая, блин! Вобщем, нужно пользоваться только тем, что по умолчанию стоит и не больше! Если интересно, то могу, конечно, подробно изложить, но суть задачи не изменится...
Т.е. если не стоит zsh, то его установка равносильна установке перла, awk и т.д.
У меня пока 2 варианта выхода из ситуации:
1. Писать прогу на сях (чем щас и занимаюсь уже)
2. Закачать неткат (но это менее предпочтительный вариант)
А вот если бы можно было на стандартном Чпуксовом шелле сделать... было бы вообще классно!
[HP-UX, ksh] Возможна ли работа с сокетами прямо из шелла?03.10.06 17:01 Автор: whiletrue <Роман> Статус: Elderman Отредактировано 03.10.06 17:24 Количество правок: 1
Реализуема ли следующая задача без написания чего либо на сях, перлах и т.д., только ksh:
1. При запуске шелл скрипт читает из параметров номер порта на котором слушать (ну это понятно)
2. Остается висеть слушать порт
3. При посылке на этот порт этого хоста некоей текстовой строки отдает, ну... например, ту же строку но в uppercase
Заранее спасибо
---- upd ---
да, кстати нужно без нетката, через /dev/tcp - видимо, но никак не соображу как это написать
Во! А может как-то так...04.10.06 16:17 Автор: whiletrue <Роман> Статус: Elderman
Запустить telnetd слушать на нужном порту и уже в той сессии по умолчанию запустить некий шелл-скрипт воспринимающий стандартный инпут и выдающий на стандартный аутпут... получится, что это все дело на порту слушает и обратно че-то выдает. Че скажете?
не уверен, но попробуй вместо этого запускать скрипт через inetd04.10.06 18:17 Автор: ZaDNiCa <indeed ZaDNiCa> Статус: Elderman
Ладно расскажу задачу подробно, а то че-то вопросов много возникает...
Значит есть такая Информиксовая штука - DataBlade. На самом деле это модуль прикручиваемый к Апачу, который анализирует в хтмл-нике свои специфичные тэги и подставляет вместо них че там нужно... очень похоже на SSI.
Задача вобщем-то просто запустить некую прогу на серваке (шелл-скрипт), где запущен Апач с этим ДейтаБлейдом и ее аутпут положить в страничку, вот и все... =)
Сам SSI тоже юзать нельзя, т.к он не срабатывает после ДейтаБлейда.
Ну вот, есть там такой тэг MIEXEC, для которого написано:
The MIEXEC tag enables you to execute a Perl program in your AppPage.
Однако ж он не просто запущает эту перловую прогу и выкладывает ее аутпут, как было бы логичнее всего, а делает это через задницу, т.е. как все в информиксе =) Он запущает некую [перловую] прогу, которая должна задемонизироваться и начать слушать на порту, который ей передаст MIEXEC, а вот после этого он передаст ей некие параметры по этому порту и получит от нее ответ, который таки выложит. ГЫ!
Перл юзать нельзя, т.к. потом будет сложнее обслуживание сервака...
Однако ниже есть приписка:
Important: All the examples in the description of the MIEXEC tag use Perl. However,
any program that can communicate via sockets can be used, including Python and
Rexx.
А пример его использования такой:
<?MIVAR NAME=SRVC>cd /local/perlscripts ;
/usr/local/bin/perl ./SERVE.pl<?/MIVAR>
<?MIEXEC SERVICE=$SRVC REQUEST=UPPER>
This text, when part of the MIEXEC tag, is in MiXeD cAsE.
<?/MIEXEC>
а SERVE.pl вот такая:
#
# This is a SAMPLE perl program that fields requests generated
# within the Web DataBlade module using the MIEXEC tag.
# To run on NT, comment out the line: $UNIX_OS = 1;
#
require 5.002;
BEGIN { $ENV{PATH} = '/usr/ucb:/bin'} ;
#
# Specify modules
use Socket;
use Carp;
use FileHandle;
use English;
#
#
# Forward references
sub REAPER;
sub executeCommand;
sub processRequest;
#
# Comment out the next line to run correctly on NT
$UNIX_OS = 1;
# Setup exit handler
$SIG{CHLD} = \&REAPER;# set exit handler
#
# Declare and
my ($iaddr,$paddr,$proto,$line);
my $port = shift|@ARGV;
# note: Had one system where this value
# had to be hardwired to the node name.
my $remote = shift|'localhost';
if ($port =~ /\D/) {
$port = getservbyname($port,'tcp');
}
if (!$port) {
print "NO PORT : To use as service use :\n\t\tSERVE.pl <portNum>\n";
die "No port" ;
}
#
# Time to fork for the parent can return to database
# server and processing can continue.
#
if (defined($UNIX_OS)) {
my $pid ;
if (!defined($pid = fork)) {
exit;
} elsif ($pid) {
exit; # # parent must leave
}
}
# this is the child
$iaddr = inet_aton($remote);
$paddr = sockaddr_in($port, $iaddr);
#$proto = getprotobyname('name');
$proto = getprotobyname('tcp');
socket(SOCK,PF_INET,SOCK_STREAM,$proto) or die "socket: $!";
connect(SOCK,$paddr) or die "connect: $!";
SOCK->autoflush();
print SOCK "This is the first message from the child client\n";
SOCK->autoflush();
$continue = 1;
#
# Main processing loop
# Fetch Request :
# - get length of request attributes
# - get request attributes
# - get length of body
# - get body
# Process Request :
# - do someing based upon $attributes{'REQUEST'}
# - Put value we want to appear as variables into %results
# a hash type.
# - Put the value that we want in appear in the 'body'
# in the variable ($bodyResult).
# Generate Response :
# - convert the %result hash to string -> $stagedResults
# The hash is converted to name value pairs
# - send length($stageResults) + ':' + $stagedResults
# - send length($bodyResult) : ':' + $bodyResult
#
while ($continue) {
undef($results);
undef(%results);
$attrHead=<SOCK>; # get length of input
defined($attrHead)|die "Connection to server dropped";
$attrHead =~ /([0-9]*):/| print "Could not derive length from header : $attrHead\n" ;
$attrLen = $1; # put length in a reasonible place
my $attr;
while (<SOCK> ) {
$attr .= $_;
if (length($attr) >= $attrLen) {
last;
}
}
$attributes = $attr;
$bodyHead=<SOCK>;
defined($bodyHead)|die "Connection to server dropped";
$bodyHead =~ /([0-9]*):/| die "Could not derive length from header : $bodyHeader" ;
$bodyLen = $1; # put lenght in a reasonible place
my $body;
while (<SOCK> ) {
$body .= $_;
if (length($body) >= $bodyLen) {
last;
}
}
chop($body); # remove terminating CR sender added
$execute = $body;
%vec = split /&/, $attributes;
foreach (%vec) {
($name,$value) = /()=(./;
$attributes{$name}=$value;
}
undef($results); # clear out return data region
##
## got the request : execute the request
##
processRequest();
zsh. В его модуле 'zsh/net/tcp' есть команда 'ztcp', которая умеет открывать порт.04.10.06 15:05 Автор: fly4life <Александр Кузнецов> Статус: Elderman Отредактировано 04.10.06 15:23 Количество правок: 2
> Всё остальное, требуемое тобой, тоже выполнимо (думаю, как > и в любом другом шелле). > > Глянул в гугле, вроде как zsh под HP-UX есть.
Спасибо, но наверное не выйдет =((( Не стоит zsh по умолчанию на Чпуксе =(((
Там задача такая тупая, блин! Вобщем, нужно пользоваться только тем, что по умолчанию стоит и не больше! Если интересно, то могу, конечно, подробно изложить, но суть задачи не изменится...
Т.е. если не стоит zsh, то его установка равносильна установке перла, awk и т.д.
У меня пока 2 варианта выхода из ситуации:
1. Писать прогу на сях (чем щас и занимаюсь уже)
2. Закачать неткат (но это менее предпочтительный вариант)
А вот если бы можно было на стандартном Чпуксовом шелле сделать... было бы вообще классно!
не знаток HP-UX, но в *bsd и linux это нереализуемо без nc04.10.06 11:55 Автор: ZaDNiCa <indeed ZaDNiCa> Статус: Elderman
> Вобщем сабж. > > Реализуема ли следующая задача без написания чего либо на > сях, перлах и т.д., только ksh: > > 1. При запуске шелл скрипт читает из параметров номер порта > на котором слушать (ну это понятно) > 2. Остается висеть слушать порт > 3. При посылке на этот порт этого хоста некоей текстовой > строки отдает, ну... например, ту же строку но в uppercase > > Заранее спасибо > > ---- upd --- > да, кстати нужно без нетката, через /dev/tcp - видимо, но > никак не соображу как это написать
По-моему /dev/tcp не предназначен для слушания. Он имплементирует только tcp/connect и udp/send
Я бы рекомендовал неткат всё таки