Como chamar um script de shell do código Javascript?

3

Não consigo chamar um programa de script de shell do javascript (por exemplo, se alguém clicar em um botão na página da Web, um script será executado e lançará alguma saída)

    
por Asutosh 29.10.2014 / 07:10

2 respostas

2

Por motivos de segurança, você não pode fazer isso como, por exemplo, chame um programa binário a partir de um script shell, algum programa do Python usando subprocess.check_output() ou qualquer outro mecanismo em várias linguagens de programação.

Se você quiser esse tipo de funcionalidade, o caminho a seguir é:

  1. executar um pequeno servidor da Web local, ou seja, na máquina
  2. permite que o javascript acesse isso (algumas versões mais recentes dos navegadores bloqueiam determinadas chamadas como essa)
  3. faça o clique do botão invocar algum javascript que acesse o servidor local para executar a função de que você precisa.

Eu usei esse mecanismo para permitir a impressão, na máquina local, de vários documentos do Word selecionados. O envio da lista de documentos é redirecionado para o servidor da Web local (usando XML-RPC), que recupera os documentos e inicia o Word no modo em lote para imprimi-los.

    
por 29.10.2014 / 09:23
0

Aqui está um exemplo (não testado) usando Javascript e PHP e a metodologia explicada pelo Anthon. Não se concentre na sintaxe ou se funciona ou não, você pode consertar isso mais tarde. Observe o pater com strong ênfase na validação de dados.

Javascript:

if (validate()) { // Preliminary data check to preven unecessary request
   $.ajax(
      '/path/to/your-script', { // the URL where the php script is hosted
         'action': 'update', // variables passed to the server
         'id': '123',
         'value': 'New Value'
      }, function (response) { // server response
       if (typeof(response.success) == 'number' && response.success) {
         }
      }, 'json' // data format
   );

}

Um modelo rudimentar de PHP:

 // Make sure that the POST is done via ajax
 if (isset($_SERVER['HTTP_X_REQUESTED_WITH'])
       && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'
   ) {
      // Template for multiple commands.
      switch ($_POST['action']) { // Catch all commands
          case 'update':
             // Make sure to clean up the value. Lookup tutorials on Google
             $id = sanitize($_POST['id'];
             $value = sanitize($_POST['value'];

             // Although sanitized make sure that the values pass certain
             // criteria such as duplicates, data type, user privileges etc
             if (validate($id, $value) {
                shell_exec("your '" . $id . "' '" . $value . "'";
             }
             break;
          // If we do not know what this is we can throw an exception
          default:
             throw new Exception ('Unknown Request');
      }
      // This is just an acknowledgement that the command executed. 
      // More validation and try catch constructs are highly recommended.
      echo json_encode([
              'success' => 1
           ]);

   }
    
por 14.01.2016 / 15:24