Ejecute un comando de shell en un evento click en una página web

11

¿Hay alguna manera de ejecutar un comando bash cuando hago clic en un texto en un navegador?

La página web está en la computadora A, el navegador está en la computadora B: Quiero ejecutar el código en la computadora B, por ejemplo, hsetrootpara cambiar el fondo de pantalla al hacer clic en una imagen.

Bob Dylan
fuente

Respuestas:

5

No, realmente no. Esa es la madre de todos los agujeros de seguridad. Pregunta si puede configurar una página web que ejecute comandos arbitrarios en la máquina del cliente. ¿Qué sucede si configuro una página web que ejecuta este comando?

rm -rf ~/

Eso eliminaría todos los archivos en su $HOME. De hecho, recientemente hubo un alboroto cuando se descubrió un error que permitió que esto sucediera. Uno de los posibles vectores de ataque fue engañar al cliente (computadora B en su caso) para que ejecutara un comando bash.

Entonces no, no puede ejecutar código arbitrario en su máquina local a través de un navegador web. No sin iniciar sesión de alguna manera primero. Puede ejecutar JavaScript o comandos de lenguaje similares, pero no tendrán acceso a la sesión de su usuario.

terdon
fuente
Gracias por la respuesta, entiendo el problema obvio allí. Estoy tratando de lograr eso con un navegador personalizado: stackoverflow.com/questions/30963508/…
bob dylan
@bobdylan No creo que sea posible. Ciertamente espero que no sea de todos modos. Ese es un pequeño programa genial, por cierto. ¡No tenía idea de que era así de simple! El punto, sin embargo, es que no creo que sea posible iniciar una sesión de shell local desde el navegador.
terdon
Bueno, digamos que quiero hacer un sitio web / programa híbrido con alguna funcionalidad vinculada a mi sistema operativo. Entonces mi navegador no será un "navegador" normal. Entonces no veo cómo no es posible.
bob dylan
Ciertamente es posible que un programa lo haga. Considere: no hay diferencia, en principio, entre un cliente FTP y un navegador (un cliente HTTP), ambos interactúan con un usuario local y con un servidor. Trivialmente, el cliente FTP puede modificar archivos locales y ejecutar (algunos) comandos locales. Claro, es solo a petición del usuario, pero eso no es una restricción real. Entonces un navegador puede hacer lo mismo. Hace unos diez años, escuché que algunos de los principales navegadores tenían una configuración de seguridad tan baja que permitieron esto, pero no recuerdo detalles, y las cosas probablemente se han endurecido desde entonces.
G-Man dice 'reinstalar a Monica' el
@ G-Man No sé si es posible devolver un clic al navegador y provocar que se inicie una sesión de shell. FTP es muy diferente ya que inicia una sesión por definición. No digo que sea 100% imposible, realmente no lo sé, solo creo que es imposible y ciertamente no es posible con los navegadores existentes.
terdon
3

No puede hacer eso en general, pero en un entorno definido, donde puede controlar la máquina B del cliente, puede proponer que la máquina B ejecute un servicio setroot, simplemente puede escribir solo con nodejs o golang, por ejemplo, y hablar con eso servicio cuando reciba el evento. Pero, en cualquier caso, no tiene ninguna posibilidad (o al menos nunca debería tenerla) si no instala algún servicio adicional en la máquina B.

ikrabbe
fuente
Nunca he usado NodeJs antes. ¿Quiere decir que puedo usar un javascript simple como run("whatever command on machine B");:?
bob dylan
sí, nodejs es muy simple de usar para necesidades tan reducidas.
ikrabbe
@ikrabbe: Felicitaciones por alcanzar 500 reputación. (Y, por cierto, lindo gravatar. ¡Simplemente no dejes que tu súper ardilla se suelte cerca de mis gatos! :-)
G-Man dice 'Reinstate Monica' el
3

Lo resuelvo usando un servidor nodeJS. (no es un código limpio / final pero funciona)

Computadora A: (servidor)

function change_wallpaper(image){
    var objReq = new XMLHttpRequest();
    objReq.open("GET", "http://localhost:8888" + "?image=" + image, false);
    objReq.send(null);
}
<img src="./img/1.jpeg" onclick="change_wallpaper(this.src);" />
<img src="./img/2.jpeg" onclick="change_wallpaper(this.src);" />

Computadora B: archivo (cliente) llamado server.jsy ejecutado connodejs server.js

var http = require("http");
var sys = require('sys')
var exec = require('child_process').exec;
var url = require("url");

function onRequest(request, response) {
    var params = url.parse(request.url,true).query;
    function puts(error, stdout, stderr) {sys.puts(stdout)}
    exec("/usr/bin/feh --bg-center " + params.image, puts);
    response.writeHead(200, {'Content-Type': 'text/plain'});
    response.end('Wallpaper');
}

http.createServer(onRequest).listen(8888);
Bob Dylan
fuente
como mi respuesta lo condujo al método que debe usar, usted solicitó, hubiera sido bueno simplemente solicitar una edición para mi respuesta, incluido su código y excepto que describo un método para ejecutar un comando de shell, como usted solicitó para y es un enfoque general. Escribir servicios portátiles para máquinas cliente puede hacer muchas, muchas cosas. Si votaras por mi respuesta, también estaría bien.
ikrabbe
2
@ikrabbe el OP no puede votar, no tienen el representante. En cuanto a aceptar, sí, su respuesta (que voté positivamente) realmente les dio un puntero, pero usted no explicó cómo podrían usar nodejs ni dio un ejemplo. Su respuesta fue muy útil, pero en realidad no resolvió el problema del OP, solo los apuntó en la dirección correcta. Publicar su propia respuesta y aceptarla está perfectamente bien.
terdon
0

PHP puede cambiar el contenido de los archivos de texto cruzando el navegador, por ejemplo en /var/www/.../folder/mytextfie.txt. Solo tiene que obtener la cadena de ese archivo, que puede ser un comando o incluso un comando para iniciar un archivo de script .

Se puede ejecutar un cronjob para verificar si el archivo de texto contiene algún ejecutable.

#!/usr/bin/env bash
echo $(cat /var/www/.../folder/commandsperline.txt)
#or 
while read line
    do
    echo "$(${line})"
done< "/var/www/.../folder/commandsperline.txt"

contexto de ese archivo de texto:

#!/bin bash
#you need to declare absolute path
# chmod 755 /home/user/*.sh -to make executabble all scripts there
/home/user/backup.sh
/home/user/anyscript.sh

Con el bucle te while es posible ejecutar comandos desde ese archivo de texto.

Stefansson
fuente
0

Sí .. es posible con neutralinojs .

Puedes usar Neutralino.os.runCommand(). Pero en su escenario se puede utilizar el modo de nube Neutralino.

Shalitha Suranga
fuente