web-dev-qa-db-ja.com

Webページのクリックイベント時にシェルコマンドを実行する

ブラウザでテキストをクリックしたときにbashコマンドを実行する方法はありますか?

WebページはコンピューターAにあり、ブラウザーはコンピューターBにあります。コンピューターBでコードを実行します。例:hsetroot画像をクリックすると壁紙が変更されます。

11
bob dylan

NodeJSサーバーを使用して解決します。 (クリーン/最終的なコードではなく、その機能)

コンピューターA:(サーバー)

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

コンピューターB:server.jsで実行されたnodejs server.js ansと呼ばれる(クライアント)ファイル

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);
3
bob dylan

いいえ、違います。それはすべてのセキュリティホールの母です。クライアントのマシンで任意のコマンドを実行するWebページを設定できるかどうかを尋ねています。このコマンドを実行するWebページを設定するとどうなりますか。

rm -rf ~/

これにより、$HOME内のすべてのファイルが削除されます。実際、最近 バグが発見された のときに大騒ぎがあり、これがこれを可能にしました。 考えられる攻撃ベクトルの1つ は、クライアント(あなたの場合はコンピューターB)をだましてbashコマンドを実行させていました。

ですから、ローカルマシン上でWebブラウザを介して任意のコードを実行することはできません。どういうわけか最初にログインせずにはいられません。 JavaScriptまたは同様の言語のコマンドを実行できますが、ユーザーのセッションにアクセスすることはできません。

5
terdon

一般的にはできませんが、クライアントマシンBを制御できる定義された環境では、マシンBがsetrootサービスを実行することを提案できます。たとえば、nodejsまたはgolangを使用して独自に書き込み、それと対話できます。あなたがイベントを受け取ったときにサービス。しかし、いずれにしても、マシンBに追加のサービスをインストールしなければ、チャンスはありません(または、少なくともチャンスはありません)。

3
ikrabbe

はい.. neutralinojs で可能です。

Neutralino.os.runCommand()を使用できます。ただし、シナリオではNeutralinoクラウドモードを使用できます。

0

PHPは、たとえば/var/www/.../folder/mytextfie.txtのように、ブラウザーを介してテキストファイルの内容を変更できます。そのファイルから文字列を取得するだけで、スクリプトを開始するコマンドまたはコマンドにすることができます。 。

cronjobを実行して、テキストファイルに実行可能ファイルが含まれているかどうかを確認できます。

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

そのテキストファイルのコンテキスト:

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

Te whileループを使用すると、そのテキストファイルからコマンドを実行できます。

0
stefansson