Me costó mucho la solución de Matthieu ya que me causó dos problemas en mi Mac OS X 10.9.2:
- Trabajos en el
LaunchAgents
se ejecutan con el usuario actual. Sin embargo, arp
debe ejecutarse con root
.
- El
arp
-El comando se ejecuta demasiado pronto, cuando la red no está activa. Pero la red es necesaria para el arp
-comando.
El primer problema se puede resolver almacenando el .plist
archivo en LaunchDaemons
en lugar de LaunchAgents
. Esto asegurará que el comando se ejecute como Root.
El segundo problema es un poco complicado. Dado que launchd
no maneja las dependencias, tenemos que escribir nuestro propio shell script que primero espera hasta que la red esté lista y luego ejecuta el arp
comando. (Ver aquí )
Así que aquí está mi solución:
Primero cree/abra el archivo plist usando un editor de texto:
sudo nano /Library/LaunchDaemons/local.arpentries.plist
A continuación, pegue el siguiente contenido:
<?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>
El propietario del conjunto, etc:
sudo chown root:wheel /Library/LaunchDaemons/local.arpentries.plist
sudo chmod 0644 /Library/LaunchDaemons/local.arpentries.plist
Ahora crea/abre el shell script utilizando un editor de texto
sudo nano /usr/local/bin/arpentries
Pega lo siguiente:
#!/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
Y los derechos:
sudo chmod 0744 /usr/local/bin/arpentries