新しいUbuntu 12.04 VPSがあります。 LAMPのインストール全体を完了するセットアップスクリプトを記述しようとしています。問題があるのは、/etc/hosts
ファイルに行を追加することです。現在のホストファイルは次のようになります。
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
次のようになりたいです。
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
Append(\a
)コマンドを使用して、さまざまなsed
コマンドを試しました。何らかの理由で、Ubuntuはターミナルでhosts
ファイルの内容をエコーするか、まったく何もしません。 bashスクリプトを使用して、2行目をファイルに適切に挿入するにはどうすればよいですか?
sed
の-i
オプションを必ず使用してください。
-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
そうでなければ、
echo "192.241.xx.xx venus.example.com venus" >> /etc/hosts
ファイルの最後に行を追加します。これは期待どおりに機能します。
Bashを使用してプログラムでホストエントリを挿入/更新する場合、これを行うために記述したスクリプトを次に示します。
#!/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
このスクリプトはOS Xでの使用を目的としていますが、Linuxでも微調整を加えて動作します。
Macの場合、またはこれに対するSudo許可が必要な場合は、これを試してください。
Sudo -- sh -c -e "echo '192.34.0.03 subdomain.domain.com' >> /etc/hosts";
パスワードの入力を求められます。
@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
sed
(streamエディター)は実際にはファイルを編集することを意図したものではありませんが、それを使用することはできますが、 。 ( 標準sed には、標準出力以外に書き込むための組み込みメカニズムがありません。)より適切なツールは ed
です。
次のedスクリプトは、「(明らかにずさんな)正規表現/127.0.0.1/を含む行を見つけて、次の行に追加します」と記述しています。 (孤立期間はedに追加を停止するよう指示します。)
ed /etc/hosts <<-'EOF'
/127.0.0.1/a
192.241.xx.xx venus.example.com
.
wq
EOF
そうは言っても、実際にはこの行を/ etc/hostsファイルのendに非常に簡単に追加できます。
echo '192.241.xx.xx venus.example.com' >> /etc/hosts
ルートアクセスでこれを試してください。
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
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();
}
}
これにより、Androidのホストに行が追加されます
次のようにsedを使用できます。
sed '/ Venus/a \
192.241.xx.xx venus.example.com venus '/ etc/hosts