javascript에서 쉘 스크립트 프로그램을 호출할 수 없습니다(예를 들어, 누군가가 웹 페이지에서 버튼을 클릭하면 스크립트가 실행되고 일부 출력이 발생합니다). ? ?
답변1
subprocess.check_output()
보안상의 이유로 Python의 특정 프로그램 이나 다양한 프로그래밍 언어의 다른 메커니즘을 사용하여 쉘 스크립트에서 바이너리 프로그램을 호출할 수 없습니다 .
이 기능을 원하는 경우 수행 방법은 다음과 같습니다.
- 소규모 웹 서버를 로컬로 실행합니다(즉, 컴퓨터에서).
- 자바스크립트가 이 콘텐츠에 액세스하도록 허용합니다(일부 최신 브라우저에서는 이와 같은 특정 호출을 차단함).
- 버튼을 클릭하면 일부 JavaScript가 호출되어 로컬 웹 서버에 액세스하여 필요한 기능을 수행합니다.
나는 이 메커니즘을 사용하여 선택한 여러 Word 문서를 로컬 컴퓨터에서 인쇄할 수 있게 했습니다. 문서 목록에 대한 제출은 로컬 웹 서버(XML-RPC 사용)로 리디렉션된 다음 문서를 검색하고 Word를 일괄 모드로 시작하여 모든 문서를 인쇄합니다.
답변2
다음은 Javascript와 PHP를 사용한 (테스트되지 않은) 예와 Anthon이 설명하는 방법입니다. 구문이나 작동 여부에 집중하지 마세요. 나중에 수정할 수 있습니다. 이 교사는 데이터 검증을 매우 강조합니다.
자바스크립트:
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
]);
}