Pagina 1 di 4

[bash] verifica e inserimento stringa in un file

Inviato: martedì 13 maggio 2014, 11:58
da piccolotauro2
Ciao a tutti,
è la prima volta che scrivo nel forum ed ho proprio bisogno di aiuto.
Deco realizzare uno script bash che verifichi se all'interno di un file c'è una stringa e in caso contrario la inserisca.
Nello specifico devo verificare che:
nel file /conf/context.xml sia presente la seguente direttiva:
<Manager ... randomClass="java.security.SecureRandom" />

potreste darmi qualche dritta su come automatizzare questo?nel senso ciò che dovrei fare è:
1-cercare il file con percorso /conf/context.xml
2-scorrerlo
3-trovare <Manager
4-vedere se al suo interno c'è randomClass="java.security.SecureRandom" />
5-se non c'è inserirla nel file
6-salvare il file

spero tanto in un vostro aiuto
grazie mille

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

Inviato: martedì 13 maggio 2014, 13:38
da 1001001
Ciao! Due domande:
1)
piccolotauro2 ha scritto:4-vedere se al suo interno c'è randomClass="java.security.SecureRandom" />
questa stringa è sempre sulla stessa riga di <Manager o può anche essere in righe successive? E se può essere in righe successive, c'è un limite massimo di righe da guardare o bisogna andare fino alla fine del file/fino a un certo carattere delimitatore?

2)
piccolotauro2 ha scritto:5-se non c'è inserirla nel file
dove? All'inizio, alla fine, in mezzo, a un numero di riga particolare?

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

Inviato: martedì 13 maggio 2014, 13:47
da piccolotauro2
Innanzitutto grazie infinite per la risp
Allora:
Ciao! Due domande:

La stringa non è sempre sulla stessa riga di <Manager e può anche essere in righe successivese, potrebbero anche essere due elementi manager e in questo caso andrebbe aggiunta la scritta in ognuno di questi per cui il file andrebbe fatto scorrere tutto


2dove? All'inizio, alla fine, in mezzo, a un numero di riga particolare?
Andrebbe bene anche nella riga sotto all'elemento manager

Spero tu mi possa aiutare e davvero grazie

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

Inviato: martedì 13 maggio 2014, 15:19
da piccolotauro2
help me please:(

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

Inviato: martedì 13 maggio 2014, 17:16
da 1001001
Scusa, non sono sicuro di avere capito bene come devono essere apportate le modifiche.. potresti postare un (corto) file di esempio in cui mostri il contenuto del file prima e dopo aver effettuato l'inserimento, in modo da vedere tutti i possibili casi?

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

Inviato: martedì 13 maggio 2014, 17:39
da piccolotauro2
Il file è abbastanza lungo ed è un XML quindi lo script dovrebbe verificare se c'è la stringa ed eventualmente inserirla come attributo

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

Inviato: martedì 13 maggio 2014, 22:09
da 1001001
Non sono sparito eh, ci sto pensando...ma bash non mi sembra lo strumento più adatto per farlo, sinceramente...deve proprio essere bash o può essere anche qualcos'altro?
piccolotauro2 ha scritto:Il file è abbastanza lungo ed è un XML quindi lo script dovrebbe verificare se c'è la stringa ed eventualmente inserirla come attributo
Per questo dicevo di postare un file corto :) se è lungo, taglialo e posta solo la parte che mostra un esempio di quello che vorresti fare...

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

Inviato: martedì 13 maggio 2014, 22:37
da piccolotauro2
purtroppo se si può fare (e dicono si possa fare) lo devo fare con bash.
allora immagina il file context.xml così:
............
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/>
<Manager ... />

...........
che dovrebbe fare lo script:
scorrere tutto il file xml, una volta trovato <Manager verificare che non ci sia randomClass="java.security.SecureRandom" /> e nel caso non ci sia inserirlo,
per avere una cosa del genere:

....................
<Manager
randomClass="java.security.SecureRandom" />

forse la cosa migliore sarebbe:
1-cercare randomClass="java.security.SecureRandom" />
2- se non c'è cercare <Manager e se c'è inserire nella riga sotto

tra l'altro più scrivo e più dubbi mi vengono...perche in realtà potrebbe non esserci neanche <Manager e toccherebbe inserire pure quello
che casino:(

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

Inviato: martedì 13 maggio 2014, 23:22
da vaeVictis
Certo che si può fare.
Con "lo devo fare con bash" intendi che puoi o che non puoi usare strumenti (bash) tipo awk, sed e compagnia bella?

Per il resto del messaggio, un paio di chiarimenti.
1) Tu devi sempre e solo controllare la presenza della stringa che inizia con (per separare il codice dal resto del messaggio, usa l'apposito tag dell'editor del forum)

Codice: Seleziona tutto

<Manager
o devi poter controllare la presenza di una stringa che inizi con la apertura di un generico tag che magari vuoi passare al comando, onde avere il tutto più generico?
2) Stessa domanda per la stringa che devi eventualmente inserire. Immagino non sia sempre

Codice: Seleziona tutto

 randomClass="java.security.SecureRandom" />
... in cui presumo che il token di chiusura del tag magari non lo inserisci, nel caso in cui ci sia già il tag di apertura (e quindi presumo già anche quello di chiusura).
3) Qualora non trovassi la riga cercata e la dovessi inserire, ti interessa una particolare posizione (sia per siga sia per riferimento a qualche tag che venga prima o dopo la riga in cui viene scritta l'apertura dal tuo comando)?
Se ti interessa, si può impostare, ma il programma deve rileggere il file e quindi rallenta.
Se non ti interessa la metti direttamente alla fine del file.

Infine, tornando all'uso di bash... ma l'uso di qualche libreria per il parsing xml?
No?

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

Inviato: mercoledì 14 maggio 2014, 9:29
da tomm
ti consiglio di usare xmlstarlet.
Ad esempio, con questo comando puoi verificare la presenza dell'attributo randomClass nell'elemento /Context/Manager:

Codice: Seleziona tutto

xmlstarlet sel -t -m "/Context/Manager" -v "@randomClass" conf/context.xml

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

Inviato: mercoledì 14 maggio 2014, 9:47
da piccolotauro2
Grazie a tutti per l'aiuto...
1) Tu devi sempre e solo controllare la presenza della stringa che inizia con (per separare il codice dal resto del messaggio, usa l'apposito tag dell'editor del forum)
Codice: Seleziona tutto
<Manager
o devi poter controllare la presenza di una stringa che inizi con la apertura di un generico tag che magari vuoi passare al comando, onde avere il tutto più generico?

non ho ben capito la domanda comunque devo verificare che ci sia l'attributo <Manager se c'è devo verificare se c'è randomClass e se non c'è inserirlo...potrebbe anche non esserci <Manager e quindi dovrei inserire sia <Manager che random class.Potrebbero anche esserci due o tre <Manager e quindi dovrei inserire random class per ogni <Manager
2) Stessa domanda per la stringa che devi eventualmente inserire. Immagino non sia sempre
Codice: Seleziona tutto
randomClass="java.security.SecureRandom" />

... in cui presumo che il token di chiusura del tag magari non lo inserisci, nel caso in cui ci sia già il tag di apertura (e quindi presumo già anche quello di chiusura).
esattamente il tag di chiusura si dovrebbe verificare se c'è gia.
3) Qualora non trovassi la riga cercata e la dovessi inserire, ti interessa una particolare posizione (sia per siga sia per riferimento a qualche tag che venga prima o dopo la riga in cui viene scritta l'apertura dal tuo comando)?
Se ti interessa, si può impostare, ma il programma deve rileggere il file e quindi rallenta.
Se non ti interessa la metti direttamente alla fine del file.

puo anche essere messa alla fine l'importante è che si rispetti la sintassi del file xml

Infine, tornando all'uso di bash... ma l'uso di qualche libreria per il parsing xml?
No?

si potrebbe usare anche il parse se semplifica le cose...tu che dici?

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

Inviato: mercoledì 14 maggio 2014, 9:49
da piccolotauro2
tomm [url=http://forum.ubuntu-it.org/viewtopic.php?p=4582316#p4582316][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:ti consiglio di usare xmlstarlet.
Ad esempio, con questo comando puoi verificare la presenza dell'attributo randomClass nell'elemento /Context/Manager:

Codice: Seleziona tutto

xmlstarlet sel -t -m "/Context/Manager" -v "@randomClass" conf/context.xml
nel mio caso l'elemento è solo Manager quindi /Context/Manger andrebbe sostituito con solo /Manager giusto?

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

Inviato: mercoledì 14 maggio 2014, 10:01
da tomm
si certo, ma quindi non si tratta del conf/context.xml di apache tomcat?

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

Inviato: mercoledì 14 maggio 2014, 10:02
da vaeVictis
Il parser semplifica, altrimenti non avrebbero scritto i parser :)
Detto questo, ti lascio alle cure di tomm, che di sicuro conosce l'argomento meglio di me.

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

Inviato: mercoledì 14 maggio 2014, 10:27
da piccolotauro2
si si si tratta del /conf/context.xml di apache tomcat....

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

Inviato: mercoledì 14 maggio 2014, 10:28
da piccolotauro2
in pratica io dovrei realizzare degli script di hardening per tomcat....e molte di queste regole prevedono la modifica/integrazione del file context.xml e server.xml

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

Inviato: mercoledì 14 maggio 2014, 10:29
da piccolotauro2
confido in tuo aiuto....molti controlli sono simili...se riuscissi a fare questo gli altri si potrebbero più o meno adattare.....
grazie mille

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

Inviato: mercoledì 14 maggio 2014, 10:48
da tomm
allora il percorso esatto dovrebbe essere proprio /Context/Manager perché devi tenere conto anche del nodo principale
http://svn.apache.org/repos/asf/tomcat/ ... ontext.xml

Con questo comando puoi inserire il nodo Manager con l'attributo randomClass:

Codice: Seleziona tutto

xmlstarlet ed -s /Context -t elem -n Manager -v "" -i /Context/Manager -t attr -n randomClass -v java.security.SecureRandom conf/context.xml

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

Inviato: mercoledì 14 maggio 2014, 11:01
da piccolotauro2
ma xmlstarlet prevede qualche libreria?perche lanciandolo da linea di comando mi da comando non presente...

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

Inviato: mercoledì 14 maggio 2014, 11:10
da vaeVictis
Ti suggerisce anche come installarlo

Codice: Seleziona tutto

vaevictis@vaevictis-HAL:~$ xmlstarlet
Il programma "xmlstarlet" non è attualmente installato. È possibile installarlo digitando:
sudo apt-get install xmlstarlet