[bash] verifica e inserimento stringa in un file

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
tomm
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 796
Iscrizione: lunedì 15 ottobre 2007, 10:16
Desktop: Gnome
Distribuzione: Ubuntu 16.04

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

Messaggio 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
piccolotauro2
Prode Principiante
Messaggi: 40
Iscrizione: martedì 13 maggio 2014, 11:52

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

Messaggio 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
Avatar utente
tomm
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 796
Iscrizione: lunedì 15 ottobre 2007, 10:16
Desktop: Gnome
Distribuzione: Ubuntu 16.04

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

Messaggio 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à
piccolotauro2
Prode Principiante
Messaggi: 40
Iscrizione: martedì 13 maggio 2014, 11:52

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

Messaggio 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
piccolotauro2
Prode Principiante
Messaggi: 40
Iscrizione: martedì 13 maggio 2014, 11:52

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

Messaggio da piccolotauro2 »

in pratica Connecto è un sotto sotto nodo
Server/Service/Connector esiste un -subsubnode?
piccolotauro2
Prode Principiante
Messaggi: 40
Iscrizione: martedì 13 maggio 2014, 11:52

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

Messaggio 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
Avatar utente
tomm
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 796
Iscrizione: lunedì 15 ottobre 2007, 10:16
Desktop: Gnome
Distribuzione: Ubuntu 16.04

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

Messaggio 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"
piccolotauro2
Prode Principiante
Messaggi: 40
Iscrizione: martedì 13 maggio 2014, 11:52

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

Messaggio 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
piccolotauro2
Prode Principiante
Messaggi: 40
Iscrizione: martedì 13 maggio 2014, 11:52

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

Messaggio 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
piccolotauro2
Prode Principiante
Messaggi: 40
Iscrizione: martedì 13 maggio 2014, 11:52

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

Messaggio 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
Avatar utente
tomm
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 796
Iscrizione: lunedì 15 ottobre 2007, 10:16
Desktop: Gnome
Distribuzione: Ubuntu 16.04

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

Messaggio 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 :) )
piccolotauro2
Prode Principiante
Messaggi: 40
Iscrizione: martedì 13 maggio 2014, 11:52

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

Messaggio 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:)
piccolotauro2
Prode Principiante
Messaggi: 40
Iscrizione: martedì 13 maggio 2014, 11:52

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

Messaggio 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?:)
Avatar utente
tomm
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 796
Iscrizione: lunedì 15 ottobre 2007, 10:16
Desktop: Gnome
Distribuzione: Ubuntu 16.04

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

Messaggio 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
piccolotauro2
Prode Principiante
Messaggi: 40
Iscrizione: martedì 13 maggio 2014, 11:52

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

Messaggio 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:)
Ultima modifica di piccolotauro2 il mercoledì 28 maggio 2014, 22:55, modificato 1 volta in totale.
piccolotauro2
Prode Principiante
Messaggi: 40
Iscrizione: martedì 13 maggio 2014, 11:52

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

Messaggio 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
piccolotauro2
Prode Principiante
Messaggi: 40
Iscrizione: martedì 13 maggio 2014, 11:52

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

Messaggio 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
Avatar utente
tomm
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 796
Iscrizione: lunedì 15 ottobre 2007, 10:16
Desktop: Gnome
Distribuzione: Ubuntu 16.04

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

Messaggio 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
piccolotauro2
Prode Principiante
Messaggi: 40
Iscrizione: martedì 13 maggio 2014, 11:52

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

Messaggio 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]# 
piccolotauro2
Prode Principiante
Messaggi: 40
Iscrizione: martedì 13 maggio 2014, 11:52

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

Messaggio 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
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti