Empty jako náhrada za Expect
Pro ssh přihlašování bez klíčů používám standardně expect (jak už jste se mohli dočíst). Dnes jsem potřeboval implementovat novou funkci a vzhledem k tomu, že se mi ji zrovna dvakrát nechtělo vymýšlet, rozhodl jsem se, že požádám o radu strýčka gůgla. Funkci jsem nenašel, ale zato jsem narazil na projekt empty, jenž je „obdobou“ expectu.
Finta Fň je v tom, že emty spoští procesy a apliace pod pseudo terminálem. Co se mi na něm líbí, je jednoduchost. Pro ukázku přikládám 4 scripty z jejich domovské stránky, které se přes telnet přihlásí na stroj a vypíší whoami.
1. script – v Empty
#!/bin/sh
empty -f -i in -o out telnet foo.bar.com
empty -w -i out -o in "ogin:" "luser\n"
empty -w -i out -o in "assword:" "TopSecret\n"
empty -s -o in "who am i\n"
empty -s -o in "exit\n"
2. script – to samé ale v TCL/Expect
#!/usr/bin/expect
spawn telnet foo.bar.com
expect ogin {send luser\r}
expect assword {send TopSecret\r}
send "who am i\r"
send "exit\r"
expect eof
3. script – to samé, ale jako Perl/expect module
#!/usr/bin/perl
use Expect;
my $exp = Expect->spawn("telnet foo.bar.com");
$exp->expect($timeout,
[ 'ogin: $' => sub {
$exp->send("luser\n");
exp_continue; }
],
[ 'assword:$' => sub {
$exp->send("TopSecret\n");
exp_continue; }
],
'-re', qr'[#>:] $'
);
$exp->send("who am i\n");
$exp->send("exit\n");
$exp->soft_close();
4. script – to samé v Python/Pexpect
#!/usr/local/bin/python
import pexpect
child = pexpect.spawn('telnet foo.bar.com');
child.expect('ogin: ');
child.sendline('luser');
child.expect('assword:');
child.sendline('TopSecret');
child.sendline('who am i');
child.sendline('exit');
child.expect(pexpect.EOF);
print child.before;
Tak co – kterou metodu by jste zvolili?