É possível armazenar a conexão ssh no script bash em vez de $ (comando ssh user @ ip) toda vez?

4

Eu acho que o código que eu já tenho não é muito eficiente, pois ele precisa se conectar a cada vez na mesma máquina e executar um comando. Código:

tmp=$(ssh -nq $USER@$IP "$COMMAND" 2>> $LOG)
tmp1=$(ssh -nq $USER@$IP "$COMMAND1" 2>> $LOG)
tmp2=$(ssh -nq $USER@$IP "$COMMAND2" 2>> $LOG)
tmp3=$(ssh -nq $USER@$IP "$COMMAND3" 2>> $LOG)

Onde $COMMAND na maioria dos casos é algum tipo de grep .

Posso de alguma forma armazenar a conexão ssh ou refatorar o código para que ele não se conecte a cada vez na máquina?

    
por Patryk 01.02.2013 / 11:11

2 respostas

5

Se o shell do usuário remoto for ksh93, zsh ou bash (ou sh implementado como qualquer um desses), você poderia fazer:

eval "$(ssh -nq "$user@$host" '
  printf "%s=%q\n" \
    tmp1 "$(command1)" \
    tmp2 "$(command2)" \
    tmp3 "$(command3)"')"

No entanto, observe que você estará ausente no status de saída dos comandos remotos. E isso poderia permitir que o usuário remoto fizesse com que você executasse comandos arbitrários (por exemplo, emitindo algo em seu ~/.bashrc ).

Outra opção é usar o recurso ControlMaster de ssh para compartilhar uma conexão entre várias chamadas de ssh. Você também pode usar o modo auto . Algo como:

mkdir -p -- ~/.ssh/ctl
tmp1=$(ssh -o ControlMaster=auto \
           -o ControlPath="$HOME/.ssh/ctl/%L-%r@%h:%p" \
           -o ControlPersist=5m -nq "$user@$host" cmd1)

(e o mesmo para tmp2 ...). Essa sintaxe reutiliza uma conexão existente, se existir ou cria uma nova, de outra forma. Ele será encerrado após 5 minutos de inatividade ou você pode fechá-lo explicitamente com:

ssh -o ControlPath="$HOME/.ssh/ctl/%L-%r@%h:%p" -O exit "$user@$host"

A primeira chamada levará tempo, porque ela executará a conexão e a autenticação, enquanto as seguintes serão muito mais rápidas.

Claro, se você não precisa das três saídas de comando para ir em três variáveis diferentes, você pode fazer:

tmp=$(ssh -nq "$user@$host" '
   cmd1
   cmd2
   cmd3')

Assim, as 3 saídas de comando aparecerão concatenadas em $tmp .

    
por 01.02.2013 / 12:15
0

Você pode usar um documento aqui:

cat <<EOF | ssh $USER@$IP 2>>$LOG
grep x *
grep -i y *.log
EOF
    
por 01.02.2013 / 11:23