it-swarm.com.de

zeile an die Datei/etc/hosts mit Shell-Skript anhängen

Ich habe ein neues Ubuntu 12.04 VPS. Ich versuche, ein Setup-Skript zu schreiben, das die gesamte LAMP-Installation abschließt. Wo ich Probleme habe, hängt eine Zeile an die /etc/hosts-Datei an. Meine aktuelle hosts-Datei sieht folgendermaßen aus:

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

Ich möchte, dass es so aussieht:

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

Ich habe verschiedene sed-Befehle mit dem Befehl append (\a) ausprobiert. Aus irgendeinem Grund gibt Ubuntu entweder nur den Inhalt der hosts-Datei im Terminal wieder oder tut gar nichts. Wie würde ich die zweite Zeile mit einem Bash-Skript richtig in die Datei einfügen?

31
Stephen Howells

Stellen Sie sicher, dass Sie die -i-Option von sed verwenden.

-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

Andernfalls, 

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

würde die Zeile am Ende der Datei anhängen, was wie erwartet funktionieren könnte.

32
damienfrancois

Eintrag einfügen/aktualisieren

Wenn Sie einen Hosteintrag mithilfe von bash programmgesteuert einfügen oder aktualisieren möchten, habe ich ein Skript dazu geschrieben:

#!/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

Das Skript ist für die Verwendung mit OS X gedacht, würde aber auch mit geringfügigen Änderungen an Linux funktionieren.

16
brismuth

Wenn Sie in Mac sind oder Sudo-Erlaubnis benötigen, versuchen Sie Folgendes:

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

Sie werden immer noch nach dem Passwort gefragt.

alternativer Weg von @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

Ich möchte darauf hinweisen, dass sed (der Editor stream) eigentlich nicht für die Bearbeitung von Dateien gedacht ist, obwohl dies dazu verwendet werden kann. ( Standard sed hat keinen eingebauten Mechanismus zum Schreiben in eine andere als Standardausgabe.) Ein geeigneteres Werkzeug wäre ed .

Das folgende Ed-Skript sagt: "Suchen Sie die Zeile, die den (zugegebenermaßen nachlässigen) regulären Ausdruck /127.0.0.1/ enthält, und fügen Sie sie an die nächste Zeile an." (Die einsame Periode weist an, das Anhängen zu beenden.)

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

Sie können diese Zeile jedoch ganz einfach an das end Ihrer/etc/hosts-Datei anhängen:

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

versuchen Sie dies mit root-Zugriff.

 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 für Super User Erlaubnis

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();
    }
}

dadurch werden die Zeilen an die Hosts in Android angehängt 

0
sanjay

sie können sed verwenden, wie:

sed '/ Venus/a \
192.241.xx.xx venus.example.com venus '/ etc/hosts

0
crackerjack