Eseguire un comando shell su un evento clic in una pagina Web


11

C'è un modo per eseguire un comando bash quando faccio clic su un testo in un browser?

La pagina web è sul computer A, il browser è sul computer B: Voglio eseguire il codice sul computer B, ad esempio hsetrootper cambiare lo sfondo quando si fa clic su un'immagine.

Risposte:


5

Non proprio no. Questa è la madre di tutti i buchi di sicurezza. Si sta chiedendo se è possibile impostare una pagina Web che esegue comandi arbitrari sulla macchina del client. Cosa succede se imposto una pagina Web che esegue questo comando:

rm -rf ~/

Ciò eliminerebbe tutti i file nel tuo $HOME. In effetti, recentemente c'è stato un tumulto quando è stato scoperto un bug che ha permesso che ciò accadesse. Uno dei possibili vettori di attacco stava ingannando il client (computer B nel tuo caso) per eseguire un comando bash.

Quindi no, non puoi eseguire codice arbitrario sul tuo computer locale attraverso un browser web. Non senza prima accedere in qualche modo. Puoi eseguire comandi JavaScript o di linguaggio simile ma non avranno accesso alla sessione del tuo utente.


Grazie per la risposta, capisco l'ovvio problema lì. Sto cercando di raggiungere questo obiettivo con un browser personalizzato: stackoverflow.com/questions/30963508/…
bob dylan,

@bobdylan Non credo sia possibile. Spero sicuramente che non lo sia. Questo è un piccolo programma interessante, comunque. Non avevo idea che fosse così semplice! Il punto, tuttavia, è che non credo sia possibile avviare una sessione di shell locale dal browser.
terdon

Bene, diciamo che voglio creare un sito Web / programma ibrido con alcune funzionalità collegate al mio sistema operativo. Quindi il mio browser non sarà un normale "browser". Quindi non vedo come non sia possibile.
Bob Dylan,

Certamente è possibile che un programma lo faccia. Considera: in linea di principio, non esiste alcuna differenza tra un client FTP e un browser (un client HTTP): entrambi interagiscono con un utente locale e con un server. In sostanza, il client FTP può modificare i file locali ed eseguire (alcuni) comandi locali. Certo, è solo su richiesta dell'utente, ma non è un vero vincolo. Quindi un browser può fare lo stesso. Ho sentito, circa dieci anni fa, che alcuni dei principali browser avevano un'impostazione di sicurezza così bassa da permetterlo, ma non ricordo i dettagli e da allora le cose sono state probabilmente rafforzate.
G-Man dice 'Reinstate Monica' il

@ G-Man Non so se è possibile che un clic venga restituito al browser e causi l'avvio di una sessione di shell. FTP è molto diverso dal momento che avvia una sessione per definizione. Non sto dicendo che sia impossibile al 100%, non lo so davvero, penso solo che sia impossibile e certamente non è possibile con i browser esistenti.
terdon

3

Non puoi farlo in generale, ma in un ambiente definito, dove puoi controllare la macchina client B, puoi proporre che la macchina B esegue un servizio di setroot, puoi semplicemente scrivere da solo con nodejs o golang per esempio e parlare con quello servizio quando si riceve l'evento. Ma in ogni caso non hai alcuna possibilità (o almeno non dovresti mai avere una possibilità) se non installi alcun servizio aggiuntivo sulla macchina B.


Non ho mai usato NodeJs prima. Vuoi dire che posso utilizzare un semplice javascript come: run("whatever command on machine B");?
Bob Dylan,

sì, nodejs è molto semplice da usare per esigenze così ridotte.
Ikrabbe,

@ikrabbe: congratulazioni per aver raggiunto la reputazione di 500. (E, a proposito, grazioso gravatar. Solo, non lasciare che il tuo super-scoiattolo si perda vicino ai miei gatti! :-)
G-Man dice 'Reinstate Monica' il

3

Lo risolvo usando un server nodeJS. (codice non pulito / finale ma funzionante)

Computer A: (server)

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);" />

Computer B: file (client) chiamato server.jsans eseguito 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);

poiché la mia risposta ti ha portato al metodo da utilizzare, hai chiesto, sarebbe stato carino chiedere una modifica per la mia risposta, incluso il tuo codice e tranne che mentre descrivo un metodo per eseguire un comando shell, come hai chiesto per ed è un approccio generale. Scrivere servizi portatili per macchine client può fare molte, molte cose. Se votassi per la mia risposta, andrebbe anche bene.
Ikrabbe,

2
@ikrabbe l'OP non può votare, non hanno il rappresentante. Per quanto riguarda l'accettazione, sì, la tua risposta (che ho fatto voto) in effetti ha dato loro un puntatore ma non hai spiegato come potevano usare nodejs né hai fatto un esempio. La tua risposta è stata molto utile, ma in realtà non ha risolto il problema del PO, ma li ha solo indicati nella giusta direzione. Pubblicare la propria risposta e accettarla è perfettamente OK.
terdon

0

PHP può cambiare il contenuto dei file di testo attraverso il browser, ad esempio in /var/www/.../folder/mytextfie.txt Devi solo ottenere la stringa da quel file, che può essere un comando o addirittura un comando per avviare un file di script .

un cronjob può essere eseguito per verificare se il file di testo contiene qualsiasi eseguibile.

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

contesto di quel file di testo:

#!/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 te while loop è possibile eseguire comandi da quel file di testo.


0

Sì .. è possibile con neutralinojs .

È possibile utilizzare Neutralino.os.runCommand(). Ma nel tuo scenario può essere utilizzata la modalità cloud Neutralino.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.