Pagina 3 di 4

Re: [bash] verifica e inserimento stringa in un file

Inviato: venerdì 16 maggio 2014, 14:58
da tomm
in questo caso dovrebbe bastare un

Codice: Seleziona tutto

STRING='SSLProtocol - ALL +TLSv1'
FILE=TUO_FILE
grep -w "$STRING" $FILE || echo "$STRING" >> $FILE

Re: [bash] verifica e inserimento stringa in un file

Inviato: lunedì 26 maggio 2014, 10:15
da piccolotauro2
Scusa tomm se approfitto....riguardo il codice sotto che funziona alla grande se volessi fare l'inserimento di due attributi si potrebbe inserire nello stesso comando di xml starlet o dovrei eseguirlo due volte?
nel senso sempre all'interno di Manager oltre al randomClass volessi inserimo un randomClass2=xxxxxx
grazie mille e scusa

Codice: Seleziona tutto

FILE="conf/context.xml"
NODE=$(xmlstarlet el -a $FILE | grep -w "Context/Manager")
if [ "$NODE" = "" ];then
   xmlstarlet  ed -L --subnode "/Context" --type elem -n Manager -v ""  $FILE
fi

ATTRIBUTE=$( xmlstarlet el -a $FILE | grep -w "Context/Manager/@randomClass")

if [ "$ATTRIBUTE" = "" ];then
   # aggiungi attributo
  xmlstarlet ed -L -i '/Context/Manager' -t attr -n randomClass -v java.security.SecureRandom  $FILE
else
   # aggiorna attributo già esistente
  xmlstarlet ed -L -u '/Context/Manager/@randomClass' -v java.security.SecureRandom  $FILE
fi

Re: [bash] verifica e inserimento stringa in un file

Inviato: lunedì 26 maggio 2014, 11:30
da tomm
credo che è meglio farlo due volte, però puoi mettere il codice da ripetere in una funzione:

Codice: Seleziona tutto

#! /bin/bash

function add_or_update_attribute(){
     # input
	ATTR_NAME=$1
	ATTR_VALUE=$2

	ATTRIBUTE=$( xmlstarlet el -a $FILE | grep -w "Context/Manager/@${ATTR_NAME}")

	if [ "$ATTRIBUTE" = "" ];then
	   # aggiungi attributo
	  xmlstarlet ed -L -i '/Context/Manager' -t attr -n $ATTR_NAME -v "$ATTR_VALUE"  $FILE
	else
	   # aggiorna attributo già esistente
	  xmlstarlet ed -L -u "/Context/Manager/@$ATTR_NAME" -v "$ATTR_VALUE"  $FILE
	fi
}



FILE="context.xml"
NODE=$(xmlstarlet el -a $FILE | grep -w "Context/Manager")
if [ "$NODE" = "" ];then
   xmlstarlet  ed -L --subnode "/Context" --type elem -n Manager -v ""  $FILE
fi


add_or_update_attribute "randomClass" "java.security.SecureRandom"
add_or_update_attribute "randomClass2" "xxxxxx"
NOTA: anche per semplici script vale sempre la regola mettere il codice da ripetere in funzioni che poi puoi richiamare tutte le volte che vuoi. Questo riduce il volume del codice e la probabilità di errori e aumenta la leggibilità

Re: [bash] verifica e inserimento stringa in un file

Inviato: mercoledì 28 maggio 2014, 0:20
da piccolotauro2
tomm sto diventando il tuo incubo sto facendo alcuni script sulla base dei tuoi preziosi suggerimenti.
All'interno sempre di tomcat e precisamente nel file server.xml devo verificare che il valore maxTreads di Connector sia impostato a 250
<Connector [..]
maxThreads=”250”
Ho realizzato questo scripr che non provoca effetto...puo essere perche all'interni del file server.xml ci sono piu di un elementoConnector e quiindi lui non sa dove metterlo?
io prenso che questo attributo dovrei inserirlo in ogni attributo Connector presente

grazie

Codice: Seleziona tutto

#!/bin/bash
#


FILE="conf/server.xml"
NODE=$(xmlstarlet el -a $FILE | grep -w "Connector")
if [ "$NODE" = "" ];then
   xmlstarlet  ed -L --type elem -n Connector -v ""  $FILE
fi

ATTRIBUTE1=$( xmlstarlet el -a $FILE | grep -w "Connector/@maxThreads")

if [ "$ATTRIBUTE1" = "" ];then
   # aggiungi attributo
  xmlstarlet ed -L -i '/Connector' -t attr -n maxThread -v 250  $FILE
else
   # aggiorna attributo già esistente
  xmlstarlet ed -L -u '/Connector/@maxThread' -v 250  $FILE
fi

Re: [bash] verifica e inserimento stringa in un file

Inviato: mercoledì 28 maggio 2014, 0:33
da piccolotauro2
in pratica Connecto è un sotto sotto nodo
Server/Service/Connector esiste un -subsubnode?

Re: [bash] verifica e inserimento stringa in un file

Inviato: mercoledì 28 maggio 2014, 1:27
da piccolotauro2

Codice: Seleziona tutto

FILE="conf/context.xml"
NODE=$(xmlstarlet el -a $FILE | grep -w "Server/Service/Connector")
if [ "$NODE" = "" ];then
   xmlstarlet  ed -L  --subnode "/Service" --type elem -n Connector -v "" $FILE
fi

ATTRIBUTE=$( xmlstarlet el -a $FILE | grep -w "Server/Service/Connector/@maxThread")

if [ "$ATTRIBUTE" = "" ];then
   # aggiungi attributo
  xmlstarlet ed -L -i '/Server/Service/Connector' -t attr -n maxThread -v 250  $FILE
else
   # aggiorna attributo già esistente
  xmlstarlet ed -L -u '/Server/Service/Connector/@maxThread' -v 250  $FILE
fi
Questo ero convinto funzionasse e invece non va e non capisco proprio il motivo

Re: [bash] verifica e inserimento stringa in un file

Inviato: mercoledì 28 maggio 2014, 7:53
da tomm
funziona benissimo, hai solo sbagliato il file. Il nodo Connector sta in server.xml e non in context.xml. Correggi la prima riga così:

Codice: Seleziona tutto

FILE="conf/server.xml"

Re: [bash] verifica e inserimento stringa in un file

Inviato: mercoledì 28 maggio 2014, 10:46
da piccolotauro2
nooooo...mi sono proprio rinco......
grazie...
cmq un dubbio mi resta lo stesso...nel senso quando ho piu di un sotto nodo?
nel caso di prima quel sotto sotto nodo esiste per cui in quel if non entra ma nel caso non esisteva l'istruzione è corretta?
ad esempio ora sto facendo uno script per questo

Verificare che nel file /webapps/manager/WEB-INF/web.xml sia presente un certo testo:
<security-constraint>
<user-data-constraint>
<transport-guarantee>TESTO</transport-guarantee>
<user-data-constraint>
</security-constraint>

qui ho parecchi sotto nodi

Re: [bash] verifica e inserimento stringa in un file

Inviato: mercoledì 28 maggio 2014, 11:09
da piccolotauro2

Codice: Seleziona tutto

 xmlstarlet  ed -L  --subnode "/Service" --type elem -n Connector -v "" $FILE
lo sai che non sono convinto che questa istruzione è giusta?a me non lo crea mai un sotto nodo con quell'attirbuto

Re: [bash] verifica e inserimento stringa in un file

Inviato: mercoledì 28 maggio 2014, 11:25
da piccolotauro2
ho capito il probelma:
<security-constraint>
<user-data-constraint>
<transport-guarantee>TESTO</transport-guarantee>
<user-data-constraint>
</security-constraint>

in questo caso io dovrei creare:

<user-data-constraint>
<transport-guarantee>

perche esiste solo <security-constraint>

devo fare due volte xmlstarlet ed -L

Re: [bash] verifica e inserimento stringa in un file

Inviato: mercoledì 28 maggio 2014, 12:52
da tomm
piccolotauro2 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4589963#p4589963][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:

Codice: Seleziona tutto

 xmlstarlet  ed -L  --subnode "/Service" --type elem -n Connector -v "" $FILE
lo sai che non sono convinto che questa istruzione è giusta?a me non lo crea mai un sotto nodo con quell'attirbuto
Purtroppo se il nodo non è presente non viene creato. (Sarebbe comodo, ma xmlstarlet è un programma spartano :) )

Re: [bash] verifica e inserimento stringa in un file

Inviato: mercoledì 28 maggio 2014, 13:00
da piccolotauro2

Codice: Seleziona tutto

FILE="webapps/manager/WEB-INF/web.xml"
NODE=$(xmlstarlet el -a $FILE | grep -w "web-app/security-constraint")
if [ "$NODE" = "" ];then
   xmlstarlet  ed -L --subnode "/web-app" --type elem -n security-constraint -v ""  $FILE
   
fi
NODE2=$(xmlstarlet el -a $FILE | grep -w "web-app/security-constraint/user-data-constraint")

if [ "$NODE2" = "" ];then
   xmlstarlet  ed -L --subnode "/web-app/security-constraint" --type elem -n user-data-constraint -v ""  $FILE
fi

NODE3=$(xmlstarlet el -a $FILE | grep -w "web-app/security-constraint/user-data-constraint/transport-guarantee")

if [ "$NODE3" = "" ];then
   xmlstarlet  ed -L --subnode "/web-app/security-constraint/user-data-constraint" --type elem -n transport-guarantee -v "CONFIDENTIAL"  $FILE
fi
una cosa del genere pero dovrebbe funzionare...la cosa bella è che in un file di prova funziona:)nel fil in cui serve a me no...fantastico...anchio mi sento spartano:)

Re: [bash] verifica e inserimento stringa in un file

Inviato: mercoledì 28 maggio 2014, 15:33
da piccolotauro2
piu che spratnao è proprio paranormale

Codice: Seleziona tutto

xmlstarlet  ed -L --subnode "/web-app/security-constraint" --type elem -n ciao -v ""  web.xml
lanciando questo comando secco all'interno della cartella webapps/manager/WEB-INF
non succede niente....assurdo:)

Codice: Seleziona tutto

xmlstarlet el -a web.xml | grep -w "web-app/security-constraint"
se lancio questo mi da risultato ma il nuovo elemento ciao non lo inserisce
paranormale?:)

Re: [bash] verifica e inserimento stringa in un file

Inviato: mercoledì 28 maggio 2014, 22:20
da tomm
il problema è che in web.xml è definito un namespace. Per matchare una espressione xpath del default namespace devi usare il prefisso '_:' per ogni nodo

Codice: Seleziona tutto

xmlstarlet  ed -L --subnode "/_:web-app/_:security-constraint" --type elem -n ciao -v ""  web.xml

Re: [bash] verifica e inserimento stringa in un file

Inviato: mercoledì 28 maggio 2014, 22:30
da piccolotauro2
adesso provo...
grazie:)
senti ti prometto che cerchero di non romperti piu...cercherò:)
sto lavorando ad un altro script in cui devo fare un grep per cercare non solo gli elementi ma anche un valorre preciso

Codice: Seleziona tutto

ATTRIBUTE=$( xmlstarlet el -v $FILE | grep -w "Server/Service/Engine/Realm/@className='org.apache.catalina.realm.UserDatabaseRealm'")
una cosa del benere all'interno del server.xml
in cui devo vedere proprio se c'e un <Realm> e se className è proprio 'org.apache.catalina.realm.UserDatabaseRealm'
perche?perche all'interno del server xml ho altri realm con altri className
questo perche per un <Realm className=1...voglio inserire ad esempio attr=1
mentre per un Realm className=2....voglio inserire un atrr=2

cose assurde:)

Re: [bash] verifica e inserimento stringa in un file

Inviato: mercoledì 28 maggio 2014, 22:32
da piccolotauro2

Codice: Seleziona tutto

[root@localhost WEB-INF]# xmlstarlet  ed -L --subnode "/_:web-app/_:security-constraint" --type elem -n ciao -v ""  web.xml
Undefined namespace prefix: /_:web-app/_:security-constraint
Invalid expression: /_:web-app/_:security-constraint
non gli è piaciuto

Re: [bash] verifica e inserimento stringa in un file

Inviato: giovedì 29 maggio 2014, 14:49
da piccolotauro2
tomm è un assedio:)
aldila delle cose di prima ora ho un dubbio atroce....
se all'interno di un xml con gia presente un <Realm className=testo1>
io volessi aggiungere un <Realm className=testo2 elemento3=attributo3>

questa è tosta...perche dovrei verificare l'esistena del className=testo2 in caso inserirla o aggiornarla e poi inserire gli altri elementi...in qeusto caso lo script perfetto di prima misa che non va.... perche tra l'altro non risco a usare il grep all'interno di xmlstarlet el -v

Re: [bash] verifica e inserimento stringa in un file

Inviato: venerdì 30 maggio 2014, 8:09
da tomm
piccolotauro2 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4590370#p4590370][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:

Codice: Seleziona tutto

[root@localhost WEB-INF]# xmlstarlet  ed -L --subnode "/_:web-app/_:security-constraint" --type elem -n ciao -v ""  web.xml
Undefined namespace prefix: /_:web-app/_:security-constraint
Invalid expression: /_:web-app/_:security-constraint
non gli è piaciuto
forse hai una version vecchia di xmlstarlet? posta il risultato di

Codice: Seleziona tutto

xmlstarlet --version

Re: [bash] verifica e inserimento stringa in un file

Inviato: venerdì 30 maggio 2014, 9:54
da piccolotauro2

Codice: Seleziona tutto

[root@localhost apache-tomcat-6.0.39]# xmlstarlet --version
1.3.1
compiled against libxml2 2.7.6, linked with 20706
compiled against libxslt 1.1.26, linked with 10126
[root@localhost apache-tomcat-6.0.39]# 

Re: [bash] verifica e inserimento stringa in un file

Inviato: venerdì 30 maggio 2014, 10:01
da piccolotauro2
Comunque il mio problema ora è:
se all'interno di un xml con gia presente un <Realm className=testo1>
io volessi aggiungere un <Realm className=testo2 elemento3=attributo3>

questa è tosta...perche dovrei verificare l'esistena del className=testo2 in caso inserirla o aggiornarla e poi inserire gli altri elementi...in qeusto caso lo script perfetto di prima misa che non va.... perche tra l'altro non risco a usare il grep all'interno di xmlstarlet el -v

il mio obiettivo è dato un xml con:

<Realm className=testo1>

ottenere un xml con:

<Realm className=testo1>
<Realm className=testo attributo2=testo2>

ho provato in tutti modi ma niente...perche xmlstarlet mi aggiorna il primo realm