Como passar parâmetros para EXPECT usando a opção '-c'?

1

Estou usando expect dentro do meu script bash usando expect -c , mas como eu passo parâmetros para ele?

Isso é o que eu tentei:

FILE="myFile"
HOST="myhostname" 

/usr/bin/expect -c $FILE $HOST '
        set FILE [lindex $argv 0];
        set HOST [lindex $argv 1];
        send_user "$FILE $HOST"
        spawn scp -r -o StrictHostKeyChecking=no  $FILE root@$HOST:/tmp/
        expect "assword:"
        send "password\r"
        interact'

Se eu criar um script de espera separado com o mesmo conteúdo, mas chamá-lo no bash assim:

myScript.expect $FILE $HOST

Funciona, mas como faço a mesma coisa, mas usando a opção expect -c ?

Atualização:

Também tentei:

/usr/bin/expect -c '
        set FILE [lindex $argv 0];
        set HOST [lindex $argv 1];
        send_user "$FILE $HOST"
        spawn scp -r -o StrictHostKeyChecking=no  $FILE root@$HOST:/tmp/
        expect "assword:"
        send "password\r"
        interact' $FILE $HOST
    
por Katie S 02.03.2018 / 01:37

1 resposta

3

Você não pode. No código-fonte para expect-5.45.4 , encontramos em exp_main_sub.c na linha 711

            case 'c': /* command */
                    exp_cmdlinecmds = TRUE;
                    rc = Tcl_Eval(interp,optarg);
                    ...

que manipula o código -c . $argv e amigos são criados somente depois que o -c eval termina na linha 850 em diante

    /* collect remaining args and make into argc, argv0, and argv */
    sprintf(argc_rep,"%d",argc-optind);
    Tcl_SetVar(interp,"argc",argc_rep,0);
    expDiagLog("set argc %s\r\n",argc_rep);

    ...
    Tcl_SetVar(interp,"argv",args,0);

então $argv absolutamente não existe quando o código -c é executado.

Uma solução alternativa é Executar uma script de espera local em um servidor remoto? que implica passar o código TCL para entrada padrão e depois ler em expect o arquivo /dev/stdin

$ echo puts \[lindex \$argv 1\] | expect /dev/stdin blee bla blu
bla

Outra solução é jogar o shell e escrever tudo no TCL

#!/usr/bin/env expect
set FILE [lindex $argv 0]
set HOST [lindex $argv 1]
...

e, em seguida, chmod +x e executá-lo

./whatyoucalledtheabove somefile somehost

Ele precisaria conter o que quer que seu script atual faça acima da chamada expect ...

    
por 02.03.2018 / 03:29