Usando o argumento do script de shell?

0

Eu tenho o seguinte script:

#!/bin/bash
if [ "$1" == "" ]
then
        echo "To start monitor, please provide the server ip:"
        read STRIP
else
        STRIP=$1
fi

ssh 192.168.5.209 ssh root@$STRIP "df -khP | column -t  | awk '{print $5 " " $1 " " $2}'"

então, se eu digitar isso no terminal:

./my_script.sh 192.168.5.210

Ele deve SSH para meu portal 209 e, em seguida, SSH para 210 e obter suas informações do disco rígido. O problema é que ele não está funcionando como esperado, em vez disso, apenas gera 5 linhas como esta:

192.1680.50.21
192.1680.50.21
192.1680.50.21
192.1680.50.21
192.1680.50.21

Eu tentei definir manualmente o IP como variável no script ou ecoar o valor do argumento e ele funciona bem?

por exemplo, isso funciona bem:

STRIP=192.168.5.210
ssh 192.168.5.209 ssh root@$STRIP "df -khP | column -t  | awk '{print $5 " " $1 " " $2}'"

Mas se eu passar um argumento sem usá-lo, recebo 5 linhas em branco

    
por Lim SY 23.12.2016 / 03:59

1 resposta

1

As citações não são aninhadas. Você está tentando passar ssh o comando remoto como uma cadeia de aspas duplas contendo um argumento de aspas simples para awk e, dentro desse argumento, várias cadeias de caracteres com aspas duplas. Mas o shell vê cada uma dessas aspas duplas como o início ou o fim de uma cadeia de caracteres com aspas duplas, o que faz uma grande bagunça.

Especificamente, quando você usa "df -khP | column -t | awk '{print $5 " " $1 " " $2}'" na lista de argumentos para ssh , ele é analisado em várias cadeias de caracteres separadas entre aspas. O primeiro é "df -khP | column -t | awk '{print $5 " , e como $variable de substituição é feito dentro de strings com aspas duplas, e o script não recebeu 5 argumentos, a parte $5 é substituída por nada, fornecendo "df -khP | column -t | awk '{print ". O próximo é " $1 " , que é expandido para "192.168.5.210" (porque esse é o primeiro argumento do script). Finalmente, há " $2}'" , que se expande em "}" porque não há segundo argumento. ssh , em seguida, cola-os juntamente com espaços entre, dando 'df -khP | coluna -t | awk '{print 192.168.5.210}' como o comando sendo executado. Não o que você queria.

Para fazer com que funcione corretamente, você precisa escapar (com barras invertidas) de certos caracteres dentro do que supostamente é uma única string longa com aspas duplas. Especificamente, todas as aspas duplas (para evitar que terminem a sequência entre aspas) e cifrões (para evitar que sejam expandidas como parâmetros ou qualquer outro). Qualquer backquote ou barra invertida também precisaria ser escapado se houvesse algum. Assim, este é o comando que você quer:

ssh 192.168.5.209 ssh root@$STRIP "df -khP | column -t  | awk '{print \ \" \" \ \" \" \}'"

BTW, se eu entendi direito, a razão awk imprime o que ele faz é analisar 192.168.5.210 como três números reais, 192.168, .5 e .210, e imprimi-los (com zeros à esquerda adicionados onde zeros necessários e deixados como irrelevantes) como "192.168", "0.5" e "0.21". Mas ele não imprime espaços entre eles, então ele aparece como "192.1680.50.21".

    
por 23.12.2016 / 06:54