javascriptからシェルスクリプトプログラムを呼び出すことはできません(たとえば、誰かがWebページのボタンをクリックするとスクリプトが実行され、いくつかの出力が発生します)。 ? ?
答え1
subprocess.check_output()
セキュリティ上の理由から、Pythonの特定のプログラムやさまざまなプログラミング言語の他のメカニズムを使用してシェルスクリプトからバイナリプログラムを呼び出すことはできません。
この機能が必要な場合の実行方法は次のとおりです。
- 小規模なWebサーバーをローカルで実行します(つまり、コンピューター上)。
- JavaScriptがこのコンテンツにアクセスできるようにします(一部の最新のブラウザではこの特定の呼び出しをブロックします)。
- ボタンをクリックすると、一部の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
]);
}