bash script para executar um comando, mas com dados diferentes armazenados no arquivo

0

Eu tenho um script bash que se conecta a um servidor remoto e copia um arquivo de log para o meu servidor local com scp. Em servidores remotos não consigo copiar chaves ou instalar. Eu tenho direitos limitados. Eu tenho alguns logs de despejo que eu preciso analisar, então eu quero copiá-los no servidor local. Isso é um pouco complicado porque eu uso esperar comando por senha. Esse script é chamado de scp.sh e parece:

#!/bin/bash

expect -c "
    spawn scp "[email protected]:~/path/dir/some.log" /home/some.log

expect \"Password\"
send \"password\r\"
interact .

Agora eu tenho 2 servidores (TEST e LIVE) e 2 usuários e eu quero fazer com que seja assim: ./scp.sh TEST ou ./scp.sh LIVE

    
por blackowl 05.01.2017 / 16:01

2 respostas

3

Você está tornando as coisas mais complicadas para si mesmo escrevendo isso como um script bash que chama expect em vez de escrever isso como um script expect (ou até mesmo um script env ). Isso significa que você precisa obter dois esquemas de cotação diferentes para cooperar. Em tcl você acessa os parâmetros da linha de comando através da lista $argv

#!/usr/bin/env expect
set arg1 [lindex $argv 0]
if {$arg1 == "TEST"} {
    set user "xxx"
    set host "host1"
    set pass "testpass"
} elseif {$arg1 == "LIVE"} {
    set user "yyy"
    set host "host2"
    set pass "livepass"
} else {
    send_user "First parameter is not TEST or LIVE"
    exit 1
}

spawn scp "$user@$host:~/path/dir/some.log" /home/some.log

expect "yes/no)? " {send "yes\r" ; exp_continue} "Password"
send "$pass\r"

Ter senhas em scripts não é ótimo, mas provavelmente é melhor do que passá-las na linha de comando.

    
por 05.01.2017 / 16:55
1

Então você tem que passar o nome do host, usuário e senha como argumentos ao fazer o scp :

expect -c " spawn scp "$1@$2:~/path/dir/some.log" /home/some.log
expect \"Password\" send \"$3\r\"

$ 1 significa o primeiro argumento que você colocou após a execução do script ($ 2 o segundo e assim por diante), então se você escrever:

./scp.sh username test password

Depois, você enviará para o seu script:

expect -c " spawn scp "username@test:~/path/dir/some.log" /home/some.log
expect \"Password\" send \"password\r\"
    
por 05.01.2017 / 16:05