Баш + ожидаю, работает в фоновом режиме - PullRequest
3 голосов
/ 11 октября 2011

Я использую ожидаемую установку постоянного ssh-соединения.

set stb_ip [lindex $argv 0]

spawn -noecho ssh -o ControlMaster=auto -o ControlPath=/tmp/ssh-master-%r@%h:%p -o ConnectTimeout=1 -O exit root@$stb_ip
spawn -noecho ssh -fN -o ControlMaster=yes -o ControlPath=/tmp/ssh-master-%r@%h:%p -o ControlPersist=360 -o ConnectTimeout=1 root@$stb_ip
expect {
-re ".*password:" {send "\r"; interact}
}

К сожалению, мне не удается перевести это в фоновый режим, я использую ожидаемый_каталог, форк + отключить, но не повезло.Даже запустить его из другого скрипта с

excpect -f script.ex param1 param2 & 

, но безуспешно.Любая помощь?

Ответы [ 4 ]

1 голос
/ 08 ноября 2011

Вот процесс, который вы можете использовать для входа в систему, а затем взаимодействовать. Я не пробовал его со всеми опциями ssh, но не вижу причин, по которым он не будет работать. Так как я использую команду 8.6 "try", это только для 8.6 tcl, но вы можете довольно легко изменить попытку использовать catch для более ранних версий.

#!/bin/sh
 # the next line restarts using wish \
 exec /opt/usr8.6b.5/bin/tclsh8.6  "$0" ${1+"$@"}

if { [ catch {package require Expect } err ] != 0 } {
    puts stderr "Unable to find package Expect ... adjust your auto_path!";
}
proc login { user password cmdline } {
    set pid [spawn  -noecho {*}$cmdline ] 
    set bad 0;
    set done 0;
    exp_internal 0; # set to one for extensive debug
    log_user 0;     # set to one to watch action
    set timeout 10 
    set passwdcount 0
    set errMsg {} 
    # regexp to match prompt after successfull login you may need to change
    set intialpromptregexp {^.*[\$\#>]}
    expect {
        -i $spawn_id
        -re $intialpromptregexp {
        send_user $expect_out(0,string);
        set done 1 
        }
        -re {.*assword:} {
        if { $passwdcount >= 1 } {
            lappend errMsg "Invalid username or password for user $user"
            set bad 1
        } else {
            exp_send -i $spawn_id  "$password\r"
            incr passwdcount
            exp_continue;
        }
        }
        -re {.*Host key verification failed.} {
        lappend errMsg "Host key verification failed."
        set bad 1
        } 
        -re {.*onnection refused} {
        lappend errMsg "Connection Refused"
        set bad 1
        } 
        -re {.*onnection closed by remote host} {
        lappend errMsg "Connection Refused"
        set bad 1
        } 
        -re {.*Could not resolve hostname (.*): Name or service not known}  {
        lappend errMsg "Host  invalid: Could not resolve hostname in $cmdline : Name or service not known"
        set bad 1
        } 
        -re {\(yes/no\)\?} {
        exp_send -i $spawn_id  "yes\r"
        exp_continue;
        }
        timeout { 
        lappend errMsg "timeout \[[expr { [clock seconds] - $start } ]\]" 
        set bad 1
        }
        fullbuffer {
        lappend errMsg " buffer is full"
        exp_continue;
        }
        eof {
        puts "Eof detected "
        set bad 1
        set done 1 ;
        }
    }
    if { $bad } {
        throw CONNECTION_ERROR [join $errMsg \n ] 
    } 
    return $spawn_id
}
# get login information in somehow in this case from command line 
set user [lindex $argv 0]
set passwd [lindex $argv 1]
set host [lindex $argv 2 ]  
try {
    set spawn_id [login $user $passwd "ssh -X $user@$host" ]
} trap CONNECTION_ERROR a {
    puts "CONNECTION ERROR: $a"
    exit 1
} 
interact 
set exitstatus [ exp_wait -i $spawn_id ];
catch { exp_close -i $spawn_id };
# more clean up here if you want 
0 голосов
/ 21 июля 2017

Для выполнения ожидаемого сценария в фоновом режиме используйте expect eof в конце ожидаемого сценария.Если вы определили interact, удалите его из скрипта.

Изменен скрипт OP

set stb_ip [lindex $argv 0]

spawn -noecho ssh -o ControlMaster=auto -o ControlPath=/tmp/ssh-master-%r@%h:%p -o ConnectTimeout=1 -O exit root@$stb_ip
spawn -noecho ssh -fN -o ControlMaster=yes -o ControlPath=/tmp/ssh-master-%r@%h:%p -o ControlPersist=360 -o ConnectTimeout=1 root@$stb_ip
expect {
-re ".*password:" {send "\r"; interact}
}
expect eof

Другой пример [1] .

#!/usr/bin/expect -f

set host "host"
set password "password"

spawn ssh $host

expect {
"(yes/no)?"     {
        send -- "yes\r"
        exp_continue
        }
"*password:*" {
        send -- "$password\r"
        }
}

##Removing this:
#interact 

##And adding this:
expect eof
exit
0 голосов
/ 12 октября 2011

Вот скрипт, который я сделал давным-давно.Он делает то, что вы хотите, но не использует Expect (что я ненавижу).Я больше им не пользуюсь, я не могу гарантировать, что он все еще работает, но он должен помочь вам.

0 голосов
/ 11 октября 2011

Предположим, ваш скрипт работает на "переднем плане" ...

nohup expect -f script.ex param1 param2 & 
...