¿Cómo evitar la solicitud de contraseña en la terminal?

Entonces, a veces, mi Mac pierde la conexión a Internet.

Cuando estoy frente a él físicamente, puedo usar la terminal y hacer lo siguiente para repararlo:

networksetup -setnetworkserviceenabled ethernet off

escriba mi contraseña entonces:

networksetup -setnetworkserviceenabled ethernet on

y escriba mi contraseña de nuevo.

El problema es que la máquina aloja varios servidores y necesito que se ejecuten incluso cuando no estoy físicamente presente. Así que quería ejecutar un script diario que hiciera esto cuando no estoy presente y asegurarme de que la conexión se restablezca al menos una vez al día. Pero como no he descubierto una forma de incluir mi contraseña en la línea de comandos, no puedo hacerlo.

Entonces mi pregunta es: ¿es posible hacer lo que describí?

Sin embargo, ¿por qué la computadora usa su conexión? ¿No sería mejor solucionar ese problema? ¿Problema XY? meta.stackexchange.com/questions/66377/cuál-es-el-problema-xy
¿No puedes ejecutar esto desde el lanzamiento automáticamente?
Lo que quise decir cuando dije que la computadora alojaba varios servidores es esto: ejecuta 2 servidores de Minecraft y un servidor Plex, también uso Teamviewer para acceder a mi computadora cuando estoy fuera para ver cómo está mi gato (sí...). El problema es que si la opción DLNA está marcada en el servidor Plex, mi computadora podría perder la conexión en algún momento y no puedo predecir por qué o cuándo podría suceder. Mi problema parece estar relacionado con el propio servidor DLNA ya que tuve el mismo problema con otro servidor DLNA (Firestream) pero todo lo que encontré ya está hecho así que tengo que estar listo para X resolviendo Y…

Respuestas (2)

Ok, gracias Batman por sugerir editar el archivo sudoer. En lugar de crontab o launchd para programarlo una vez al día (que de todos modos no fue lo suficientemente bueno), en su lugar escribí ese applescript para hacerlo más regularmente y hasta ahora parece estar funcionando:

repeat
    repeat
        try
            do shell script "ping -t 15 8.8.8.8"
            exit repeat
        on error
            display notification "Reconnection attempt"
            do shell script "sudo networksetup -setnetworkserviceenabled ethernet off"
            do shell script "sudo networksetup -setnetworkserviceenabled ethernet on"
            delay 9
            display notification "Connection should be established"
        end try
    end repeat
    delay 5
end repeat

Estoy agregando más detalles: lo exporté como .app y luego edité el .plist con las líneas:

<key>LSBackgroundOnly</key>
<string>1</string>

Para hacerlo invisible cuando se ejecuta (sin icono de base) y finalmente lo hice ejecutar al iniciar sesión.

sudo le permite ejecutar un comando con un nivel de permiso elevado. Puede editar el archivo sudoers ejecutando

sudo visudo

Una forma de hacer esto es agregar primero una línea a su archivo sudoers que permita que los comandos enumerados se ejecuten sin contraseña. Al agregar el comando específico a su archivo sudoers, puede permitir que los comandos deseados se ejecuten sin contraseña. Puede hacerlo ingresando las siguientes 2 líneas en su archivo sudoers (el archivo que se abre cuando ejecuta "sudo visudo"):

usuario TODOS=(TODOS) NOPASSWD: /usr/sbin/networksetup -setnetworkserviceenabled ethernet encendido usuario TODOS=(TODOS) NOPASSWD: /usr/sbin/networksetup -setnetworkserviceenabled ethernet apagado

con "usuario" reemplazado por su nombre de usuario.

Luego, como su usuario, para ejecutar algo en un horario regular, puede usar crontab

crontab -e

y anexar las lineas:

0 1 * * * sudo networksetup -setnetworkserviceenabled ethernet off && sudo networksetup -setnetworkserviceenabled ethernet on

que aplicará este reinicio a la 1 AM todos los días.

Otra solución: agregue los comandos directamente al crontab de root:

sudo-s

crontab -e

Luego ingrese la línea

0 1 * * * networksetup -setnetworkserviceenabled ethernet off && networksetup -setnetworkserviceenabled ethernet on

y guardar y salir.

Es posible que desee poner esto en algún tipo de secuencia de comandos que le notifique que la red se ha reiniciado con éxito (por ejemplo, con un correo electrónico o algo así) para que esté seguro de que funcionó.

Alternativamente, puede usar un script de lanzamiento.

Esas deberían ser 2 respuestas: el sudo que no cumple con los requisitos y el cron que podría cumplir
Se enumeran dos enfoques basados ​​en cron: uno usa sudo+ un usuario sin privilegios en un crontab, mientras que el otro usa crontab para root. No creo que tenga sentido dividirlos en dos respuestas, ya que la mayor parte de la idea es la misma.