Executar um comando shell em um evento de clique em uma página da web

11

Existe uma maneira de executar um comando bash quando clico em um texto em um navegador?

A página da web está no computador A, o navegador está no computador B: desejo executar o código no computador B, por exemplo, hsetrootpara alterar o papel de parede ao clicar em uma imagem.

bob dylan
fonte

Respostas:

5

Não, realmente não. Essa é a mãe de todas as falhas de segurança. Você está perguntando se pode configurar uma página da Web que execute comandos arbitrários na máquina do cliente. E se eu configurar uma página da Web que execute este comando:

rm -rf ~/

Isso excluiria todos os arquivos no seu $HOME. De fato, houve recentemente um alvoroço quando um bug foi descoberto, permitindo que isso acontecesse. Um dos possíveis vetores de ataque foi enganar o cliente (computador B no seu caso) para executar um comando bash.

Portanto, não, você não pode executar código arbitrário em sua máquina local por meio de um navegador da web. Não sem, de alguma forma, fazer login primeiro. Você pode executar comandos JavaScript ou idioma semelhante, mas eles não terão acesso à sessão do usuário.

terdon
fonte
Obrigado pela resposta, eu entendo a questão óbvia lá. Estou tentando conseguir isso com um navegador personalizado: stackoverflow.com/questions/30963508/...
bob dylan
@obdylan Eu não acho que isso é possível. Eu certamente espero que não seja assim. A propósito, esse é um pequeno programa interessante. Eu não tinha ideia de que era tão simples de fazer! O ponto, no entanto, é que não acho possível iniciar uma sessão local do shell a partir do navegador.
terdon
Bem, digamos que eu queira criar um site / programa híbrido com alguma funcionalidade vinculada ao meu sistema operacional. Portanto, meu navegador não será um "navegador" normal. Então eu não vejo como isso não é possível.
bob dylan
Certamente, é possível que um programa faça. Considere: não há diferença, em princípio, entre um cliente FTP e um navegador (um cliente HTTP) - ambos interagem com um usuário local e com um servidor. Trivialmente, o cliente FTP pode modificar arquivos locais e executar (alguns) comandos locais. Claro, é apenas a pedido do usuário, mas isso não é uma restrição real. Portanto, um navegador pode fazer o mesmo. Ouvi, cerca de dez anos atrás, que alguns dos principais navegadores tinham uma configuração de segurança tão baixa que permitiam isso, mas não me lembro de detalhes, e as coisas provavelmente foram reforçadas desde então.
G-Man diz 'Reinstate Monica'
@ G-Man Não sei se é possível transmitir um clique de volta ao navegador e iniciar uma sessão de shell. O FTP é muito diferente, pois inicia uma sessão por definição. Não estou dizendo que é 100% impossível, realmente não sei, apenas acho que é impossível e certamente não é possível com os navegadores existentes.
terdon
3

Você não pode fazer isso em geral, mas em um ambiente definido, onde você pode controlar a máquina cliente B, pode propor que a máquina B execute um serviço setroot, basta escrever por conta própria com nodejs ou golang, por exemplo, e conversar com isso serviço ao receber o evento. Mas, de qualquer forma, você não tem chance (ou pelo menos nunca deve ter uma chance) se não instalar algum serviço extra na máquina B.

ikrabbe
fonte
Eu nunca usei NodeJs antes. Você quer dizer que eu posso usar um javascript simples como run("whatever command on machine B");:?
bob dylan
Sim, o nodejs é muito simples de usar para essas necessidades reduzidas.
ikrabbe
@ikrabbe: Parabéns por atingir 500 reputação. (E, BTW, gravatar fofo. Só não deixe seu super esquilo se soltar perto dos meus gatos! :-)
G-Man diz 'Reinstate Monica'
3

Eu resolvo isso usando um servidor nodeJS. (código não limpo / final, mas está funcionando)

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

Computador B: arquivo (cliente) chamado server.jsans executado comnodejs 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
fonte
como minha resposta o levou ao método a ser usado, você pediu, seria bom pedir apenas uma edição para minha resposta, incluindo seu código, exceto quando eu descrevo um método para executar um comando shell, como você pediu para e é uma abordagem geral. Escrever serviços portáteis para máquinas clientes pode fazer muitas coisas. Se você votasse na minha resposta, tudo bem também.
ikrabbe
2
@ikrabbe o OP não pode votar, eles não têm o representante. Quanto à aceitação, sim, sua resposta (que eu votei anteriormente) realmente deu a eles um ponteiro, mas você não explicou como eles poderiam usar o nodejs, nem deu um exemplo. Sua resposta foi muito útil, mas realmente não resolveu o problema do OP, apenas as apontou na direção certa. Postar sua própria resposta e aceitá-la é perfeitamente aceitável.
terdon
0

O PHP pode alterar o conteúdo dos arquivos de texto no navegador, por exemplo, em /var/www/.../folder/mytextfie.txt. .

um cronjob pode ser executado para verificar se o arquivo de texto contém qualquer executável.

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

Com o loop te while é possível executar comandos a partir desse arquivo de texto.

stefansson
fonte
0

Sim .. é possível com neutralinojs .

Você pode usar Neutralino.os.runCommand(). Mas no seu cenário, o modo de nuvem Neutralino pode ser usado.

Shalitha Suranga
fonte