информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Сетевые кракеры и правда о деле ЛевинаГде водятся OGRыСтрашный баг в Windows
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Шелл должен быть именно ksh? 04.10.06 13:10  Число просмотров: 2103
Автор: fly4life <Александр Кузнецов> Статус: Elderman
<"чистая" ссылка>
<programming>
[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 слушать на нужном порту и уже в той сессии по умолчанию запустить некий шелл-скрипт воспринимающий стандартный инпут и выдающий на стандартный аутпут... получится, что это все дело на порту слушает и обратно че-то выдает. Че скажете?
не уверен, но попробуй вместо этого запускать скрипт через inetd 04.10.06 18:17  
Автор: ZaDNiCa <indeed ZaDNiCa> Статус: Elderman
<"чистая" ссылка>
inetd тоже не пойдет, к сожалению =( 04.10.06 18:47  
Автор: whiletrue <Роман> Статус: Elderman
Отредактировано 04.10.06 19:07  Количество правок: 1
<"чистая" ссылка>
Ладно расскажу задачу подробно, а то че-то вопросов много возникает...

Значит есть такая Информиксовая штука - 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();

##
## send the results : execution is finished
##
if (defined(%results)) { # convert results vector back
undef($stagedResults);
while (($name, $value) = each(%results)) {
$stagedResults .= $name . "=" . $value . "&";
}
chop($stagedResults);
$results = length($stagedResults) . ":" . $stagedResults . ":";
} else {
$results = '0::';
}
print SOCK "$results\n";
$results = length($bodyResult) . ":" . $bodyResult;
print SOCK "$results\n";
} # end of infinite loop.

close(LOG);
close(SOCK);

# end of child code.

1;

#
# The support routines
#

sub executeCommand {
my $fileName = shift; # shift off of @_
my $attr = shift;
my $cmd = shift; #
%vec = split /&/, $attr; # variable to hash
foreach (%vec) {
($name,$value) = /()=(./;
$attributes{$name}=$value;
}
my $fileCreate = "+>".$fileName; # create the file
open(TMPFIL,$fileCreate)|die "open failed $fileName";
my $oldHandle = select(TMPFIL);#
$|=1;
eval " $cmd \n";# executes command use quotes # execute
select($oldHandle);
seek(TMPFIL,0, 0)|die "seek failed";
TMPFIL;
}

sub REAPER {
$waitedpid = wait;
$SIG{CHLD} = \&REAPER;
}

# processRequest
# INPUT :
# %attributes : variables/attributes passed in
# $body : the body of the tag
# OUTPUT :
# %results : variables to return
# $body : bodyResutl
# NOTE : input and output are going through global name space.
sub processRequest {
$_ = $attributes{"REQUEST"};
undef($bodyResult);
SWITCH: {
/^UPPER/ && do {
$bodyResult = uc($execute);
last SWITCH;
};
/^RAWPERL/ && do {
$fileName = '/tmp/' . $port . '.tmp';
$execute .= "\n";
undef(%results);# $execute string may create results
$fileHandle = &executeCommand($fileName, $attributes,
$execute);
while ( <$fileHandle> ) { # # send back results
$bodyResult .= $_;
}
close $fileHandle;
last SWITCH;
};
$bodyResult = " REQUEST \"$_\" is unknown";
}
}
Шелл должен быть именно ksh? 04.10.06 13:10  
Автор: fly4life <Александр Кузнецов> Статус: Elderman
<"чистая" ссылка>
Вообще да... но предлагай если можно другой какой... 04.10.06 14:30  
Автор: whiletrue <Роман> Статус: Elderman
<"чистая" ссылка>
zsh. В его модуле 'zsh/net/tcp' есть команда 'ztcp', которая умеет открывать порт. 04.10.06 15:05  
Автор: fly4life <Александр Кузнецов> Статус: Elderman
Отредактировано 04.10.06 15:23  Количество правок: 2
<"чистая" ссылка>
Всё остальное, требуемое тобой, думаю, тоже выполнимо в zsh.

Глянул в гугле, вроде как zsh под HP-UX есть.
re: zsh 04.10.06 15:29  
Автор: whiletrue <Роман> Статус: Elderman
<"чистая" ссылка>
> Всё остальное, требуемое тобой, тоже выполнимо (думаю, как
> и в любом другом шелле).
>
> Глянул в гугле, вроде как zsh под HP-UX есть.

Спасибо, но наверное не выйдет =((( Не стоит zsh по умолчанию на Чпуксе =(((

Там задача такая тупая, блин! Вобщем, нужно пользоваться только тем, что по умолчанию стоит и не больше! Если интересно, то могу, конечно, подробно изложить, но суть задачи не изменится...

Т.е. если не стоит zsh, то его установка равносильна установке перла, awk и т.д.

У меня пока 2 варианта выхода из ситуации:
1. Писать прогу на сях (чем щас и занимаюсь уже)
2. Закачать неткат (но это менее предпочтительный вариант)

А вот если бы можно было на стандартном Чпуксовом шелле сделать... было бы вообще классно!
не знаток HP-UX, но в *bsd и linux это нереализуемо без nc 04.10.06 11:55  
Автор: ZaDNiCa <indeed ZaDNiCa> Статус: Elderman
<"чистая" ссылка>
По-моему /dev/tcp не предназначен для слушания. Он... 03.10.06 21:19  
Автор: NKritsky <Nickolay A. Kritsky> Статус: Elderman
<"чистая" ссылка>
> Вобщем сабж.
>
> Реализуема ли следующая задача без написания чего либо на
> сях, перлах и т.д., только ksh:
>
> 1. При запуске шелл скрипт читает из параметров номер порта
> на котором слушать (ну это понятно)
> 2. Остается висеть слушать порт
> 3. При посылке на этот порт этого хоста некоей текстовой
> строки отдает, ну... например, ту же строку но в uppercase
>
> Заранее спасибо
>
> ---- upd ---
> да, кстати нужно без нетката, через /dev/tcp - видимо, но
> никак не соображу как это написать


По-моему /dev/tcp не предназначен для слушания. Он имплементирует только tcp/connect и udp/send
Я бы рекомендовал неткат всё таки
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach