2011-10-11 12 views
3
私は

bashが+背景

set stb_ip [lindex $argv 0] 

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

は、残念ながら私は背景にこれを入れて管理することはできません永続的なSSH接続を確立することを期待して使用してい

で実行して、期待して、私はexpect_background、フォーク+ disconectが、運をtriend 。 はさえtriend

excpect -f script.ex param1 param2 & 

でなく、運を別のスクリプトからこれを実行しています。どんな助け?あなたのスクリプトは、「フォアグラウンド」で働くと仮定すると、

答えて

0

...

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

残念ながら、これは期待どおりには再生されません。実行後、sshプロセスは実行されません。 –

+1

2つの質問...まず、これをバックグラウンドに置いているときに "相互作用する"のポイントは何ですか?二番目...これはフォアグラウンドで触れることなく機能しますか? –

+0

良い点は、私が期待していただけでなく、私がコピーしたスクリプトのインタラクションを解除することに新しいことです。 ;-)そして、はい、これは手で実行すると正常に動作します。 –

0

ここで私は長い時間前に作られたスクリプトです。あなたが欲しいものをやっているが、Expectを使っていない(私は嫌だ)。私はそれ以上使用しません、それはまだ動作することを保証することはできませんが、それはあなたを得る必要があります。

#!/bin/sh 
# 
# Persistent ssh: Automatically create persistent ssh connections using OpenSSH 4.0 

[ -z "$USER" ] && USER=`whoami` 
MASTERSOCKDIR="/tmp/pssh-$USER" 
MASTERSOCK="$MASTERSOCKDIR/%r-%h-%p" 

# Check if master is running 
output=`ssh -o ControlPath="$MASTERSOCK" -O check "[email protected]" 2>&1` 
if [ $? -ne 0 ]; then 
     case "$output" in 
     Control*) 
       # Master not running, SSH supports master 

       # Figure out socket filename 
       socket=`echo "$output" | sed -n -e 's/[^(]*(\([^)]*\)).*/\1/p' -e '1q'` 

       # Clean old socket if valid filename 
       case "$socket" in 
       "$MASTERSOCKDIR"/*) rm -f "$socket" >/dev/null 2>&1 ;; 
       esac 

       # Start persistent master connection 
       if [ ! -d "$MASTERSOCKDIR" ]; then 
         mkdir "$MASTERSOCKDIR" 
         chmod 700 "$MASTERSOCKDIR" 
       fi 
       ssh -o ControlPath="$MASTERSOCK" -MNf "[email protected]" 
       if [ $? -ne 0 ]; then 
         echo "$0: Can't create master SSH connection, falling back to regular SSH" >&2 
       fi 
       ;; 
     *) 
       # SSH doesn't support master or bad command line parameters 
       ERRCODE=$? 
       echo "$output" >&2 
       echo "$0: SSH doesn't support persistent connections or bad parameters" >&2 
       exit $ERRCODE 
       ;; 
     esac 
fi 
exec ssh -o ControlPath="$MASTERSOCK" -o ControlMaster=no "[email protected]" 
1

ログインしてからやりとりすることができます。私はすべてのsshオプションでそれを試していないが、私はそれが動作しない理由が表示されません。私が8.6のコマンドを使っているので、これは8.6のtclのみですが、以前のバージョンのキャッチをかなり簡単に修正することができます。あなたの期待スクリプトの末尾にバックグラウンドを使用expect eofに期待するスクリプトを実行する

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

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 [email protected]$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

interactを定義した場合は、スクリプトから削除してください。 OP

set stb_ip [lindex $argv 0] 

spawn -noecho ssh -o ControlMaster=auto -o ControlPath=/tmp/ssh-master-%[email protected]%h:%p -o ConnectTimeout=1 -O exit [email protected]$stb_ip 
spawn -noecho ssh -fN -o ControlMaster=yes -o ControlPath=/tmp/ssh-master-%[email protected]%h:%p -o ControlPersist=360 -o ConnectTimeout=1 [email protected]$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