Luché mucho con la solución de Matthieu porque causó dos problemas en mi Mac OS X 10.9.2:
- Los trabajos en la carpeta
LaunchAgents
se ejecutan usando el usuario actual. Sin embargo, arp
debe ejecutarse utilizando root
.
- El comando
arp
se ejecuta demasiado pronto, cuando la red no está activa. Pero la red es necesaria por el comando arp
.
El primer problema se puede resolver almacenando el archivo .plist
en LaunchDaemons
en lugar de LaunchAgents
. Esto asegurará que el comando se ejecute como root.
El segundo problema es un poco complicado. Como launchd
no maneja las dependencias, tenemos que escribir nuestro propio script de shell que primero espera hasta que la red esté funcionando y luego ejecute el comando arp
. (Vea aquí )
Así que aquí está mi solución:
Primero crea / abre el archivo plist usando un editor de texto:
sudo nano /Library/LaunchDaemons/local.arpentries.plist
Luego pega 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>
Establecer propietario, etc .:
sudo chown root:wheel /Library/LaunchDaemons/local.arpentries.plist
sudo chmod 0644 /Library/LaunchDaemons/local.arpentries.plist
Ahora cree / abra el script de shell con un editor de texto
sudo nano /usr/local/bin/arpentries
Pegue 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