Modifica di un file tramite script bash

Sono un principiante nello script bash. Vorrei creare uno script bash per installare e configurare le cose sulla mia casella Linux in modo automatizzato.

Supponi che voglio modificare

  • Come posso dire chi / cosa spegne il mio CentOS VPS?
  • Dare la password di root per la manutenzione
  • Come automaticamente uccidere le query MySQL lente dopo N secondi?
  • Backup di Mac OS X in aziende
  • Come disabilitare la modalità passiva nel command ftp linux
  • Determinare in quale momento è stata creata una connessione TCP attualmente aperta?
  • /etc/yum.repos.d/epel.repo 

    dallo script bash

    Quello che voglio fare è come segue

    1. Apri il file /etc/yum.repos.d/epel.repo
    2. Trova la sezione [epel]
    3. Aggiungere una priorità di linea = 10 subito dopo la linea abilitata = 1 nella sezione epel

    Per la prima parte ho aggiunto

     yum install nano nano /etc/yum.repos.d/epel.repo 

    La mia domanda è come fare la 2 e la terza parte con lo script bash usando il nano (se ansible, nel caso in cui non sia ansible quindi mostrarmi con sed)

    Anche in alcuni punti dovrò modificare le variables nei file Per esempio

    1. abilitare = 0 per abilitare = 1
    2. Test = "1" per il test = "0"
    3. Aggiungi text in una row. funzioni = per funzionare = "text1", "text2"
    4. Aggiungere un text a un file e salvarlo (con nano)

    So che è esigente, ma ho bisogno di creare questo per un amico che è noob nella gestione del server. Purtroppo non ho tempo per studiare bash scripting dall'inizio come i miei esami come vicino. Utilizzo i tuoi esempi per scrivere lo script.


    Grazie ragazzi per tutte le risposte che ho fatto con successo la maggior parte dello script bash

    Tuttavia ho un altro problema Suppongo che voglio modificare nginx.conf usando sed Ci occupiamo di worker_processes
    Ora voglio utilizzare sed per eseguire le seguenti operazioni 1.Find la prima occorrenza di worker_processes in quel conf e sostituire il text con worker_processes 4;

    Nota speciale qui: questo è solo un esempio. Può accadere che il conf contenga worker_processes 1; . Questa è una parte difficile. Voglio un command sed che trovi il primo caso di match di WHOLE della parola worker_processes , elimina la row di text where viene trovata la parola e incolla worker_processes 4; lì e poi salva il file. Questo è il metodo più affidabile per quanto riguarda la modifica dei file (senza rischio di rottura di qualsiasi conf

    Un ultimo suggerimento che ho usato sed -i '/ enabled = 0 / enabled = 1 / g' /etc/yum.repos.d/remi.repo per cambiare abilitato = 0 in abilitato = 1 nella sezione [remi] in remi .repo. Tuttavia, ho la sensazione che possa modificare tutti i file enabled = 0 in quel file, che farà scorrere il server. Qualcuno può suggerire un codice migliore.


    Un'altra roba non sono sicuro di: PI desidera modificare un file che ha questo come Test di text = "0" (Sì ha citazioni e devo mantenerlo) Dovrebbe essere modificato da Testing = "0" a Testing = " 1 "(con virgolette)

    Inoltre ho bisogno di aggiungere un text con le citazioni alla fine di un file con sed Come "Grazie Quanta" (con citazione) Per php hai messo un \ con echoing citazioni, non so come si fa per bash

    Un'altra cosa
    Devo modificare una linea in conf, ma non mi ricordo di che cosa sia l'integer text da sostituire

    Come il suo ascolto qualcosa; , voglio modificarlo per ascoltare = /tmp/php5-fpm.sock;

    Grandi pollici in su per i quanti

    Grazie per i ragazzi fantastici di sostegno

    3 Solutions collect form web for “Modifica di un file tramite script bash”

     sed '/enabled=1/a\priority=10' /etc/yum.repos.d/epel.repo 

    Specificare un'opzione di editing in-place ( -i ) se si desidera (fa il backup con l'estensione .bak ):

     sed -i.bak '/enabled=1/a\priority=10' /etc/yum.repos.d/epel.repo 

    Ora voglio utilizzare sed per eseguire le seguenti operazioni 1.Find la prima occorrenza di worker_processes in quel conf e sostituire il text con worker_processes 4;

     sed '0,/worker_processes [0-9]*;/s//worker_processes 4;/' /etc/nginx/nginx.conf 

    Un ultimo suggerimento che ho usato sed -i 's/enabled=0/enabled=1/g' /etc/yum.repos.d/remi.repo per cambiare enabled=0 in enabled=1 nella sezione [remi] in remi.repo . Tuttavia ho la sensazione che possa modificare tutti i file enabled=0 in quel file, che causerà il server. Qualcuno può suggerire un codice migliore

    Qui per te:

     sed '/\[remi\]/,/enabled=0/ { s/enabled=0/enabled=1/ }' remi.repo 

    Un'altra roba non sono sicuro di: PI desidera modificare un file che ha questo come Test di text = "0" (Sì ha citazioni e devo mantenerlo) Dovrebbe essere modificato da Testing = "0" a Testing = " 1 "(con virgolette)

     sed 's/Testing = "0"/Testing = "1"/g' 

    Inoltre ho bisogno di aggiungere un text con le citazioni alla fine di un file con sed Come "Grazie Quanta" (con citazione) Per php hai messo un \ con echoing citazioni, non so come si fa per bash

     sed '$a"Werulz, you are welcome"\' 

    Un'altra cosa che ho bisogno di modificare una linea in un conf, ma non mi ricordo di che cosa è l'integer text da sostituire

    Come il suo ascolto qualcosa; , voglio modificarlo per ascoltare = /tmp/php5-fpm.sock;

     sed 's/listen = .*/listen = \/tmp\/php5-fpm.sock;/' 

    Come ha detto ptman, Augeas ti può salvare dall'utilizzo di sed / awk :

     $ augtool -s set /files/etc/yum.repos.d/epel.repo/epel/priority 10 

    imposterà la priorità del repository epel su 10. Se la chiave di priority esiste già, imposta il suo valore, altrimenti aggiungerà una voce di priority dopo l'ultima voce della sezione.

    Lo stesso vale per altri valori che si desidera modificare.

    Se si desidera modificare diversi valori, è ansible anche utilizzare augtool come interpnetworking:

     $ cat epel.augtool #!/usr/bin/augtool -sf # Make a variable defvar epel /files/etc/yum.repos.d/epel.repo/epel # Set values set $epel/enable 1 set $epel/priority 10 set $epel/Testing 0 $ chmod +x epel.augtool $ ./epel.augtool Saved 1 file(s) 

    Se vuoi mantenerlo nel tuo script bash, puoi augtool i comandi in augtool :

     cat <<EOF | augtool # Make a variable defvar epel /files/etc/yum.repos.d/epel.repo/epel # Set values set $epel/enable 1 set $epel/priority 10 set $epel/Testing 0 save EOF 

    Vedi l' man augtool per ulteriori opzioni.

    Ci sono diversi vantaggi per utilizzare Augeas vs sed / awk :

    • Augeas ha parser che conoscono la syntax del file (in questo caso, la syntax yum.repo ). Non si rischia di rompere la syntax del file se la tua regex è sbagliata;
    • il parser Augeas yum.repo conosce le sezioni yum.repo , in modo da sapere che stai modificando la sezione giusta;
    • Augeas è idempotente. Apporterà solo modifiche al file se ci sono modifiche da effettuare. Se tutti i valori sono già impostati, non modificherà il file;
    • Augeas ha un fornitore di Puppet, in modo da poter automatizzare questo in un'infrastruttura Puppet;
    • se i parametri non esistono ancora, Augeas li creerà per voi. Se la sezione non esiste ancora, Augeas lo creerà anche con la giusta syntax.

    Potresti anche verificare Augeas , strumento per modificare in modo programmato i file di configuration. È molto potente in combinazione con Puppet (un sistema di gestione delle configurazioni), ma può anche essere utilizzato da solo.

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.