Enrola uma string com espaços em branco e caracteres nela? [duplicado]

0

Estou tentando criar um script "simples" que vou usar para criar alguma documentação para máquinas Unix / Mac. Recebi com sucesso a informação de que preciso, mas parece que não posso enviá-la para um servidor da Web que criei com o CURL porque ela fornece alguns espaços em branco e caracteres na saída de informações. Eu tentei com muitos métodos, mas nada parece funcionar corretamente ..

Esta é a saída de URL que o script enviará para curl:

"ip.ip.ip.ip/documentation/index.php?avdelning=XX&user=XXX&hostname=XXX&model=ModelName:MacminiModelIdentifier:Macmini4,1&RAM=Memory:8GB&CPU=ProcessorName:IntelCore2DuoProcessorSpeed:2.4GHzNumberofProcessors:1&CPUCORES=TotalNumberofCores:2&MACADDRESS=etherxx:xx:xx:xx:xx:xx&SERIALNUMBER=SerialNumber(system):XXXXXXXX&LASTLOGGEDIN=XXXXX

Usar somente a seguinte string funcionará se eu fizer isso diretamente com o CURL e não me dará nenhum erro e eu recebo as informações no servidor web.

Mas quando eu uso o script, não funciona. O script:

#!/bin/bash

STR_RAM=$(/usr/sbin/system_profiler SPHardwareDataType | grep Memory: | sed 's/ //g');
STR_MODEL=$(/usr/sbin/system_profiler SPHardwareDataType | grep Model | sed 's/ //g');
STR_CPUNAME=$(/usr/sbin/system_profiler SPHardwareDataType | grep Processor | sed 's/ //g');
STR_CPUCORES=$(/usr/sbin/system_profiler SPHardwareDataType | grep Cores: | sed 's/ //g');
STR_SERIAL=$(/usr/sbin/system_profiler SPHardwareDataType | grep Serial | sed 's/ //g');
STR_MACADDR=$(ifconfig | grep en0 -A3 | grep ether | sed 's/ //g');
STR_LOGGEDIN=$(finger | tail -1 | sed 's/ //g');
STR_HOSTNAME=$(hostname | sed 's/ //g');

STR_URL=ip.ip.ip.ip/documentation/index.php?avdelning=$1\&user=$2\&hostname=$STR_HOSTNAME\&model=$STR_MODEL\&RAM=$STR_RAM\&CPU=$STR_CPUNAME\&CPUCORES=$STR_CPUCORES\&MACADDRESS=$STR_MACADDR\&SERIALNUMBER=$STR_SERIAL\&LASTLOGGEDIN=$STR_LOGGEDIN;


STR_URL2=$(echo $STR_URL | sed 's/ //g' | awk '{printf("\"%s\"\n", $0);}');
curl $STR_URL2;

Como você pode ver, eu adicionei um monte de edição provavelmente desnecessária com sed e awk, mas nada parece funcionar.

Eu recebo estas mensagens de erro: Depois de adicionar o awk para adicionar aspas duplas antes e depois da string da URL, obtenho:

Could not resolve "ip.ip.ip.ip

O que é muito estranho, já que posso executar o comando curl diretamente no terminal sem esse erro. E se eu não remover os espaços etc eu recebo várias linhas que o URL não pode ser resolvido. Eu tentei com urlencoding em perl e bash mas isso não parece corrigir o problema também.

Estou executando isso em um Mac agora. Uso: sudo sh script.sh randomstring randomstring

EDITAR: Saída de novo script

sudo sh script2.sh IT Denniz
curl: (3) Illegal characters found in URL
xx.xx.xx.xx/documentation/index.php?avdelning=XX&user=Denniz&hostname=admins-Mac-mini-2.local&model=ModelName:Macmini
ModelIdentifier:Macmini4,1&RAM=Memory:8GB&CPU=ProcessorName:IntelCore2Duo
ProcessorSpeed:2.4GHz
NumberofProcessors:1&CPUCORES=TotalNumberofCores:2&MACADDRESS=  etherXX:XX:XX:XX:XX&SERIALNUMBER=SerialNumber(system):XXXXXXXXXXX&LASTLOGGEDIN=adminadmins008Jun10:21
    
por Denniz 14.06.2016 / 16:30

1 resposta

0

Você não deseja inserir aspas literais na string. Você só quer colocar aspas ao redor da variável. Eu faria isso:

#!/bin/bash

hw_data=$(/usr/sbin/system_profiler SPHardwareDataType)

ram=$(grep Memory: <<<"$hw_data")
model=$(grep Model <<<"$hw_data")
cpuname=$(grep Processor <<<"$hw_data")
cpucores=$(grep Cores: <<<"$hw_data")
serial=$(grep Serial <<<"$hw_data")

macaddr=$(ifconfig | grep en0 -A3 | grep ether)
loggedin=$(finger | tail -1)
hostname=$(hostname)

avdelning=$1
user=$2

url="ip.ip.ip.ip/documentation/index.php"
url+="?avdelning=${avdelning}"
url+="&user=${user}"
url+="&hostname=${hostname}"
url+="&model=${model}"
url+="&RAM=${ram}"
url+="&CPU=${cpuname}"
url+="&CPUCORES=${cpucores}"
url+="&MACADDRESS=${macaddr}"
url+="&SERIALNUMBER=${serial}"
url+="&LASTLOGGEDIN=${loggedin}"

curl "${url// /}"
#    ^          ^   <- these are the critical quotes

Leia isto para saber mais sobre como a citação crítica é: Implicações de segurança de esquecer de citar uma variável em shells bash / POSIX

    
por 14.06.2016 / 16:55