Выполнить команду оболочки после события щелчка на веб-странице

11

Есть ли способ выполнить команду bash, когда я нажимаю на текст в браузере?

Веб-страница находится на компьютере A, браузер на компьютере B: я хочу выполнить код на компьютере B, например, hsetrootчтобы изменить обои при нажатии на изображение.

Боб Дилан
источник

Ответы:

5

Не на самом деле нет. Это мать всех дыр в безопасности. Вы спрашиваете, можете ли вы настроить веб-страницу, которая выполняет произвольные команды на компьютере клиента. Что делать, если я настроил веб-страницу, которая запускает эту команду:

rm -rf ~/

Это удалит все файлы в вашем $HOME. Фактически, недавно был шум, когда была обнаружена ошибка, которая позволила этому случиться. Одним из возможных векторов атаки было заставить клиента (компьютер B в вашем случае) запустить команду bash.

Так что нет, вы не можете выполнить произвольный код на своем локальном компьютере через веб-браузер. Не без входа в систему. Вы можете запускать команды JavaScript или аналогичные языковые команды, но они не будут иметь доступа к сеансу вашего пользователя.

Тердон
источник
Спасибо за ответ, я понимаю очевидную проблему там. Я пытаюсь добиться этого с помощью специального браузера: stackoverflow.com/questions/30963508/…
Боб Дилан
@bobdylan Я не думаю, что это возможно. Я, конечно, надеюсь, что это не так или иначе. Кстати, это крутая маленькая программа. Я понятия не имел, что это было так просто сделать! Дело, однако, в том, что я не думаю, что можно инициировать локальный сеанс оболочки из браузера.
Тердон
Хорошо, скажем, я хочу сделать гибридный сайт / программу с некоторыми функциями, связанными с моей ОС. Так что мой браузер не будет обычным "браузером". Так что я не вижу, как это невозможно.
Боб Дилан
Конечно, это возможно для программы. Обратите внимание: в принципе нет никакой разницы между FTP-клиентом и браузером (HTTP-клиентом) - оба взаимодействуют как с локальным пользователем, так и с сервером. Обычно клиент FTP может изменять локальные файлы и выполнять (некоторые) локальные команды. Конечно, это только по запросу пользователя, но это не реальное ограничение. Таким образом, браузер может сделать то же самое. Около десяти лет назад я слышал, что в некоторых основных браузерах настройки безопасности были настолько низкими, что они позволяли это, но я не припоминаю подробностей, и с тех пор ситуация, вероятно, была улучшена.
G-Man говорит: «Восстановите Монику»
@ G-Man Я не знаю, возможно ли передать клик обратно в браузер и запустить сеанс оболочки. FTP сильно отличается, так как это инициирует сеанс по определению. Я не говорю, что это на 100% невозможно, я на самом деле не знаю, я просто думаю, что это невозможно, и, конечно, это невозможно в существующих браузерах.
Тердон
3

Вы не можете сделать это вообще, но в определенной среде, где вы можете управлять клиентским компьютером B, вы можете предложить, чтобы на машине B выполнялась служба setroot, вы можете просто написать самостоятельно с помощью nodejs или golang, например, и поговорить с ним. сервис, когда вы получаете событие. Но в любом случае у вас нет шансов (или, по крайней мере, у вас никогда не должно быть шансов), если вы не установите какой-либо дополнительный сервис на компьютере B.

ikrabbe
источник
Я никогда раньше не использовал NodeJ. Вы имеете в виду я могу использовать простой JavaScript , как: run("whatever command on machine B");?
Боб Дилан
да, nodejs очень прост в использовании для таких уменьшенных потребностей.
Икраббе
@ikrabbe: Поздравляю с достижением 500 репутации. (И, кстати, симпатичный граватар. Только не позволяйте своей супер-белке разваливаться рядом с моими кошками! :-)
G-Man говорит: «Восстановите Монику»
3

Я решаю это с помощью сервера 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.jsans, выполняемый сnodejs 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);
Боб Дилан
источник
Поскольку мой ответ привел вас к методу, который вы использовали, как вы и просили, было бы неплохо просто попросить изменить мой ответ, включая ваш код, и, кроме того, как я описал метод для выполнения команды оболочки, как вы и просили и его общий подход. Написание переносимых сервисов для клиентских машин может сделать много-много вещей. Если бы вы проголосовали за мой ответ, это тоже было бы нормально.
Икраббе
2
@ikrabbe ОП не может голосовать, у них нет представителя. Что касается принятия, да, ваш ответ (который я сделал upvote) действительно дал им указатель, но вы не объяснили, как они могли использовать nodejs, и не привели пример. Ваш ответ был очень полезен, но на самом деле он не решил проблему ОП, он лишь направил их в правильном направлении. Разместить свой ответ и принять его совершенно нормально.
Terdon
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

С помощью цикла while можно выполнять команды из этого текстового файла.

Stefansson
источник
0

Да .. можно с нейтралинойс .

Вы можете использовать Neutralino.os.runCommand(). Но в вашем сценарии можно использовать облачный режим Neutralino.

Шалита Суранга
источник