如何从 Javascript 代码调用 shell 脚本?

如何从 Javascript 代码调用 shell 脚本?

我无法从 javascript 调用 shell 脚本程序(例如,如果有人单击网页中的按钮,则脚本将运行并抛出一些输出)???

答案1

出于安全考虑,您不能像从 shell 脚本中调用二进制程序、使用 Python 中的某些程序subprocess.check_output()或各种编程语言中的任何其他机制那样调用二进制程序。

如果你想要这种功能,方法是:

  1. 在本地运行一个小型网络服务器,即在机器上
  2. 允许 javascript 访问此内容(某些较新版本的浏览器会阻止像这样的某些调用)
  3. 单击按钮会调用一些 JavaScript,然后访问本地 Web 服务器来执行您需要的功能。

我已使用此机制允许在本地计算机上打印多个选定的 Word 文档。文档列表的提交被重定向到本地 Web 服务器(使用 XML-RPC),然后检索文档,并以批处理模式启动 Word 来打印所有文档。

答案2

这是一个使用 Javascript 和 PHP 的(未经测试的)示例以及 Anthon 解释的方法。不要关注语法或它是否有效,您可以稍后修复它。请注意这位老师非常强调数据验证。

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

}

一个基本的 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
           ]);

   }

相关内容