[완료]expect 관련
안녕하세요?
telnet 자동 접속을 위해 expect 를 사용중인데,
이 expect라는 것이 즉 어떤 동작을 기다리는 것만 되나요?
즉, Password:
이렇게 유저의 인풋을 기다르는 문장만 기다릴 수 있는거 같은데
왜냐하면 그냥 화면에 출력되는 문자를 expect()함수에 넣어놓으면 실행을 제대로 하지 못하네요.
아래 스크립트에서는 password 기다리는 부분은 잘 되는데
"security updates." 이 부분은 함수로 호출이 되지 않네요.
해결 방안이 있을까요?
제 스크립트입니다.
#!/usr/bin/perl
use Expect;
my $address = sprintf "telnet -l cho xx.xx.xx.xx %s", @ARGV[0];
my $exp = Expect->spawn($address);
my $timeout = 100;
my $timeout1 = 300;
$retry = 0;
$exp->expect($timeout,
[qr 'Password: $' => \&inputpassword],
[qr 'security updates.$' => \&control],
[qr '[#>\$] $' => \&mount],
[qr 'password for cho:$' => \&inputpassword],
[qr '[#>\$] $' => \&move_host],
[timeout => \&timeouterr],
[qr '[#>\$] $' => \&mount],);
sub control
{
my $lexp = shift;
if ($retry > 0)
{
die "control Error\n";
}
$lexp->send_slow($timeout1, "\cC");
$retry++;
exp_continue;
}
sub timeouterr
{
die "time error\n";
}
sub inputpassword
{
my $lexp = shift;
if ($retry > 0)
{
die "inputpassword Error\n";
}
$lexp->send("*******\n");
$retry++;
exp_continue;
}
sub mount
{
my $lexp = shift;
if ($retry > 0)
{
die "mount Error\n";
}
$lexp->send("sudo mount /host\n");
$retry++;
exp_continue;
}
sub move_host
{
my $lexp = shift;
if ($retry > 0)
{
die "move Error\n";
}
$lexp->send("cd /host/home/cho/benchmark1\n");
$lexp->send("source shrc\n");
$lexp->send("sudo ln -s /host/home/cho/benchmark1 /home/cho/benchmark1\n");
$retry++;
exp_continue;
}
debug를 켜서 원인을 추적해보세요.
my $exp = Expect->spawn($address);
$exp->debug(2);
.
.
.
참고: http://search.cpan.org/perldoc?Expect.pm
해당 스크립트를
해당 스크립트를 추가했는데 디버깅하지 않는 것 보니까 스크립트 문제 인것 같은데,
음...
$exp->expect($timeout,
[qr 'Password: $' => \&inputpassword],
[qr 'security updates.$' => \&control],
[qr '[#>\$] $' => \&mount],
[qr 'password for cho:$' => \&inputpassword],
[qr '[#>\$] $' => \&move_host],
[timeout => \&timeouterr],
[qr '[#>\$] $' => \&mount],);
이 스크립트는 순차적으로 일어나는 건가요?
아님 저기 등록된것 중에 해당 되는 문자열이 나오면 callback함수처럼 계속 호출 되는 건가요??
그리고 가장 궁금한건 해당 문자열이 화면에 출력되는 것도 잡아내는 건가요??
"security updates." 이 부분은 함수로 호출이 되지 않네요. <== 이런걸 잡아내는 방법 없나요??
그리고 exp_continue는 계속 실행을 하는 건가 보네요.
security updates$ 에서
security updates$ 에서 '$'를 빼고 한번 해보시죠.
빼도 안되네요.
빼도 안되네요. 그것도 안되네요. ㅡㅡ;
$ 빼니까 되네요.
$ 빼니까 되네요. ㅡㅡ; 감사합니다.
댓글 달기