web-dev-qa-db-fra.com

ajouter une ligne au fichier/etc/hosts avec le script Shell

J'ai un nouveau Ubuntu 12.04 VPS. J'essaie d'écrire un script d'installation qui complète une installation complète de LAMP. Ce qui me pose problème, c’est d’ajouter une ligne au fichier /etc/hosts. Mon fichier d'hôtes actuel ressemble à ceci:

127.0.0.1       localhost Venus

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

Je voudrais qu'il ressemble à ceci:

127.0.0.1       localhost Venus
192.241.xx.xx  venus.example.com venus

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

J'ai essayé diverses commandes sed à l'aide de la commande append (\a). Pour une raison quelconque, Ubuntu fait simplement écho au contenu du fichier hosts du terminal ou ne fait rien. Comment pourrais-je injecter correctement la deuxième ligne dans le fichier avec un script bash?

31
Stephen Howells

Veillez à utiliser l'option -i de sed.

-i[SUFFIX], --in-place[=SUFFIX]
  edit files in place (makes backup if extension supplied)

sed -i "2i192.241.xx.xx  venus.example.com venus" /etc/hosts

Autrement, 

echo "192.241.xx.xx  venus.example.com venus" >> /etc/hosts

ajouterait la ligne à la fin du fichier, ce qui pourrait fonctionner comme prévu.

32
damienfrancois

Insérer/mettre à jour l'entrée

Si vous voulez insérer/mettre à jour par programmation une entrée hosts à l'aide de bash, voici un script que j'ai écrit pour le faire:

#!/bin/bash

# insert/update hosts entry
ip_address="192.168.x.x"
Host_name="my.hostname.example.com"
# find existing instances in the Host file and save the line numbers
matches_in_hosts="$(grep -n $Host_name /etc/hosts | cut -f1 -d:)"
Host_entry="${ip_address} ${Host_name}"

echo "Please enter your password if requested."

if [ ! -z "$matches_in_hosts" ]
then
    echo "Updating existing hosts entry."
    # iterate over the line numbers on which matches were found
    while read -r line_number; do
        # replace the text of each line with the desired Host entry
        Sudo sed -i '' "${line_number}s/.*/${Host_entry} /" /etc/hosts
    done <<< "$matches_in_hosts"
else
    echo "Adding new hosts entry."
    echo "$Host_entry" | Sudo tee -a /etc/hosts > /dev/null
fi

Le script est destiné à être utilisé avec OS X mais fonctionnera également sous linux avec des modifications mineures.

16
brismuth

Si votre in mac ou vous avez besoin de l'autorisation de Sudo, essayez ceci:

Sudo -- sh -c -e "echo '192.34.0.03   subdomain.domain.com' >> /etc/hosts";

Il vous demandera toujours un mot de passe.

manière alternative de @kainjow 

echo '192.34.0.03 subdomain.domain.com' | Sudo tee -a /etc/hosts
8
Jsonras
echo "127.0.0.1 localhost `hostname`">./temp_hosts
echo "192.241.xx.xx  venus.example.com">>./temp_hosts
cat /etc/hosts |tail -n +2 >>./temp_hosts
cat ./temp_hosts > /etc/hosts
rm ./temp_file
3
Vladimir Dimitrov

Je devrais souligner que sed (l'éditeur stream) n'est pas réellement destiné à l'édition de fichiers, bien qu'il puisse être utilisé pour le faire. ( Standard sed n'a pas de mécanisme intégré pour écrire dans une sortie autre que la sortie standard.) Un outil plus approprié serait ed .

Le script ed suivant indique "recherchez la ligne contenant l'expression régulière (certes bâclée)/127.0.0.1/ et ajoutez-la à la ligne suivante". (La seule période indique à ed de cesser d’ajouter).

ed /etc/hosts <<-'EOF'
    /127.0.0.1/a
    192.241.xx.xx  venus.example.com
    .
    wq
EOF

Cela dit, vous pouvez vraiment simplement ajouter cette ligne au end de votre fichier/etc/hosts de manière très simple:

echo '192.241.xx.xx  venus.example.com' >> /etc/hosts
1
kojiro

essayez ceci avec un accès root.

 public void edithost() {
    Sudo("echo " + "192.168.43.1     www.openrap.com openrap" + " >> /etc/hosts");
    Sudo("echo " + "192.168.43.1  openrap.com openrap" + " >> /etc/hosts");
    Sudo("echo " + "192.168.2.144  www.openrap.com openrap" + " >> /etc/hosts");
    Sudo("echo " + "192.168.2.144  openrap.com openrap" + " >> /etc/hosts");
}

Sudo pour l'autorisation de super utilisateur

public static void Sudo(String... strings) {
    try {
        Process su = Runtime.getRuntime().exec("su");
        DataOutputStream outputStream = new DataOutputStream(su.getOutputStream());

        for (String s : strings) {
            outputStream.writeBytes(s + "\n");
            outputStream.flush();
        }

        outputStream.writeBytes("exit\n");
        outputStream.flush();
        try {
            su.waitFor();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        outputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

cela va ajouter les lignes aux hôtes dans Android 

0
sanjay

vous pouvez utiliser sed, comme:

sed '/ Venus/a \
192.241.xx.xx venus.exemple.com vénus '/ etc/hosts

0
crackerjack