Ho faticato molto con la soluzione di Matthieu poiché causava due problemi al mio Mac OS X 10.9.2:
- I lavori nella cartella
LaunchAgents
vengono eseguiti utilizzando l'utente corrente. Tuttavia arp
deve essere eseguito utilizzando root
.
- Il comando
arp
viene eseguito troppo presto, quando la rete non è attiva. Ma la rete è necessaria per il arp
-comando.
Il primo problema può essere risolto memorizzando il file .plist
in LaunchDaemons
anziché LaunchAgents
. Ciò assicurerà che il comando sia eseguito come root.
Il secondo problema è un po 'complicato. Poiché launchd
non gestisce le dipendenze, dobbiamo scrivere il nostro script di shell che prima attende fino a quando la rete è su e poi esegue il comando arp
. (Vedi here )
Quindi ecco la mia soluzione:
Prima crea / apri il file plist usando un editor di testo:
sudo nano /Library/LaunchDaemons/local.arpentries.plist
Quindi incolla il seguente contenuto:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>local.arpentries</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/arpentries</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<false/>
</dict>
</plist>
Imposta proprietario ecc.:
sudo chown root:wheel /Library/LaunchDaemons/local.arpentries.plist
sudo chmod 0644 /Library/LaunchDaemons/local.arpentries.plist
Ora crea / apri lo script della shell usando un editor di testo
sudo nano /usr/local/bin/arpentries
Incolla quanto segue:
#!/bin/bash
# max number of retries
retries=10
# include Startup commons
. /etc/rc.common
# wait for network to become available
CheckForNetwork
while [ "$NETWORKUP" != "-YES-" ]
do
retries=$((retries - 1))
if [ $retries -le 0 ] ; then
exit 1
fi
sleep 2
NETWORKUP=
CheckForNetwork
done
# set the static arp entries
arp -s 192.168.1.111 xx:xx:xx:xx:xx:xx
exit 0
E i diritti:
sudo chmod 0744 /usr/local/bin/arpentries