Exécuter une commande shell lors d'un événement de clic dans une page Web

11

Existe-t-il un moyen d'exécuter une commande bash lorsque je clique sur un texte dans un navigateur?

La page Web est sur l'ordinateur A, le navigateur est sur l'ordinateur B: je veux exécuter le code sur l'ordinateur B, par exemple hsetrootpour changer le fond d'écran en cliquant sur une image.

Bob Dylan
la source

Réponses:

5

Non, pas vraiment. C'est la mère de tous les trous de sécurité. Vous demandez si vous pouvez configurer une page Web qui exécute des commandes arbitraires sur la machine du client. Et si je configure une page Web qui exécute cette commande:

rm -rf ~/

Cela supprimerait tous les fichiers de votre fichier $HOME. En fait, il y a eu récemment un tollé lorsqu'un bug a été découvert qui a permis que cela se produise. L'un des vecteurs d'attaque possibles incitait le client (l'ordinateur B dans votre cas) à exécuter une commande bash.

Donc non, vous ne pouvez pas exécuter de code arbitraire sur votre machine locale via un navigateur Web. Pas sans vous être d'abord connecté. Vous pouvez exécuter JavaScript ou des commandes de langage similaires, mais ils n'auront pas accès à la session de votre utilisateur.

terdon
la source
Merci pour la réponse, je comprends le problème évident là-bas. J'essaie d'y parvenir avec un navigateur personnalisé: stackoverflow.com/questions/30963508/…
bob dylan
@bobdylan Je ne pense pas que ce soit possible. J'espère certainement que ce n'est pas de toute façon. C'est un petit programme sympa, au fait. Je ne savais pas que c'était aussi simple à faire! Le fait est cependant que je ne pense pas qu'il soit possible de lancer une session shell locale à partir du navigateur.
terdon
Disons que je veux créer un site Web / programme hybride avec des fonctionnalités liées à mon système d'exploitation. Mon navigateur ne sera donc pas un "navigateur" normal. Je ne vois donc pas comment ce n'est pas possible.
bob dylan
C'est certainement possible pour un programme. Considérez: il n'y a pas de différence, en principe, entre un client FTP et un navigateur (un client HTTP) - les deux interagissent avec un utilisateur local et avec un serveur. Curieusement, le client FTP peut modifier des fichiers locaux et exécuter (certaines) commandes locales. Bien sûr, ce n'est qu'à la demande de l'utilisateur, mais ce n'est pas une vraie contrainte. Un navigateur peut donc faire de même. Il y a une dizaine d'années, j'ai entendu dire que certains des principaux navigateurs avaient un paramètre de sécurité si bas qu'ils permettaient cela, mais je ne me souviens pas des détails, et les choses ont probablement été resserrées depuis lors.
G-Man dit `` Réintègre Monica '' le
@ G-Man Je ne sais pas s'il est possible qu'un clic soit renvoyé au navigateur et provoque le démarrage d'une session shell. FTP est très différent car cela initie une session par définition. Je ne dis pas que c'est 100% impossible, je ne sais pas vraiment, je pense juste que c'est impossible et ce n'est certainement pas possible avec les navigateurs existants.
terdon
3

Vous ne pouvez pas le faire en général, mais dans un environnement défini, où vous pouvez contrôler la machine cliente B, vous pouvez proposer que la machine B exécute un service setroot, vous pouvez simplement écrire par vous-même avec nodejs ou golang par exemple et parler à cela service lorsque vous recevez l'événement. Mais dans tous les cas, vous n'avez aucune chance (ou du moins vous ne devriez jamais avoir de chance) si vous n'installez pas de service supplémentaire sur la machine B.

ikrabbe
la source
Je n'ai jamais utilisé de NodeJ auparavant. Vous voulez dire que je peux utiliser un javascript simple comme: run("whatever command on machine B");?
bob dylan
oui, nodejs est très simple à utiliser pour de tels besoins réduits.
ikrabbe
@ikrabbe: Félicitations pour avoir atteint 500 points de réputation. (Et, BTW, mignon gravatar. Ne laissez pas votre super-écureuil se lâcher près de mes chats! :-)
G-Man dit 'Reinstate Monica'
3

Je le résous en utilisant un serveur nodeJS. (pas de code propre / final mais son fonctionnement)

Ordinateur A: (serveur)

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

Ordinateur B: fichier (client) appelé server.jset exécuté avecnodejs 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
la source
comme ma réponse vous a amené à la méthode à utiliser, vous avez demandé, il aurait été bien de demander une modification pour ma réponse, y compris votre code et sauf que je décris une méthode pour exécuter une commande shell, comme vous l'avez demandé et c'est une approche générale. L'écriture de services portables pour les machines clientes peut faire beaucoup, beaucoup de choses. Si vous votiez pour ma réponse, ce serait bien aussi.
ikrabbe
2
@ikrabbe le PO ne peut pas voter, il n'a pas de représentant. En ce qui concerne l'acceptation, oui, votre réponse (que j'ai votée positivement) leur a effectivement donné un pointeur, mais vous n'avez pas expliqué comment ils pouvaient utiliser nodejs ni donné d'exemple. Votre réponse a été très utile, mais elle n'a pas vraiment résolu le problème du PO, elle ne faisait que les orienter dans la bonne direction. Publier sa propre réponse et l'accepter est parfaitement OK.
terdon
0

PHP peut changer le contenu des fichiers texte traverser le navigateur par exemple dans /var/www/.../folder/mytextfie.txt Vous n'avez qu'à récupérer la chaîne de ce fichier, qui peut être une commande ou même une commande pour démarrer un fichier de script .

un cronjob peut être exécuté pour vérifier si le fichier texte contient un exécutable.

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

contexte de ce fichier texte:

#!/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

Avec la boucle while, il est possible d'exécuter des commandes à partir de ce fichier texte.

Stefansson
la source
0

Oui .. c'est possible avec neutralinojs .

Vous pouvez utiliser Neutralino.os.runCommand(). Mais dans votre scénario, le mode cloud Neutralino peut être utilisé.

Shalitha Suranga
la source