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?
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.
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.
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
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
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
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
vous pouvez utiliser sed, comme:
sed '/ Venus/a \
192.241.xx.xx venus.exemple.com vénus '/ etc/hosts