ОС может и действительно добавлять запись в журнале каждый раз, когда кто-то входит в систему как корень. Но это не приносит пользы против ошибок расширения полномочий по многим причинам.
После того как взломщик является корнем, они могут удалить записи в журнале. Единственный способ избежать этого состоит в том, чтобы записать журналы в некоторое место, к которому взломщик не может получить доступ, такой как неперезаписываемые медиа или удаленная машина.
Логины или процессы, запущенные как корень, являются нормальным событием. Вы не хотите быть, просыпаются каждый день в 6:00, потому что ежедневные задания крона работают. Обнаруживание подозрительных процессов, сетевого трафика и другого поведения является сложным заданием на основе эвристики; инструмент, делающий это задание, называют IDS (система обнаружения проникновения).
Ошибка расширения полномочий не вовлекает взломщика, входящего в систему, ни даже обязательно выполняющего новые процессы. Взломщик использует ошибку в под управлением программе и заставляет ее выполнить любой код, который он вводит. В то время как часто удобно для взломщика назвать другие программы, которые уже присутствуют в системе, это редко необходимо.
Вы можете создать скрипт узла, который также является действительным скриптом оболочков для этого:
#!/bin/sh
//usr/bin/env node --harmony_arrow_functions "$0" "$@"; exit $?
console.log("Hello world")
Экономия это как File.js
создает сценарий, который можно запускать везде. Это зависит от //
, который эквивалентен /
; Я не проверил это в Windows ...
РЕДАКТИРОВАТЬ: (Исходный ответ по-прежнему отвечает на заданный вопрос, но действительно делает file.js недопустимым файлом JS). Чтобы обеспечить желаемое поведение, следует shebang + комбинация 1-й строки
, которая будет передавать file.js через узел
, пропуская две первые строки, таким образом подавая его только с Код JS:
#!/bin/sh
sed '1,2d' $0 |node --harmony_arrow_functions; exit $?
/* Your JS code begins here */
--- Ниже исходного ответа ---
Если вы можете считать, что ваш интерпретатор будет находиться в том же каталоге, что и интерпретируемый файл (это заявленный вопрос), вы можете использовать $ (dirname $ 0)
, чтобы получить его путь.
Пример:
#!/bin/sh
exec $(dirname $0)/nodeharmony.sh "$0" "$@"
В этом случае при выполнении
$ cd ..
$ ./subfolder/file.js
$ (dirname $ 0)
преобразуется в ./ подпапку
, поэтому exec будет использовать . /subfolder/nodeharmony.sh
в качестве интерпретатора.