На самом деле это очень короткая команда diff. Она предписывает удалить строку //#define DEBUG
и заменить ее на #define DEBUG
.
В этом формате diff строки, начинающиеся с одиночных -
, удаляются, а строки с +
добавляются. Остальные строки служат для контекста, а @@
указывает смещение в файле и количество строк, на которые ссылаются. (А тройные строки +++
---
говорят о том, какой файл был изменен)
Две распространенные причины, по которым патч не применяется:
В этом случае, вероятно, проще всего посмотреть на участок кода вручную (в файле linux-user/flatload.c
, как видно из первой строки), и посмотреть, нет ли где-нибудь закомментированного #define DEBUG
, а затем удалить символы комментария //
.
Глядя на код, я вижу, что проблема, вероятно, на самом деле причина №3 - патч искажен, потому что он был отрисован так, как не должен был. Видите ту строчку, где просто написано #include
? В исходном тексте говорится #include
. Программа блога, в котором вы нашли патч, вероятно, решила, что
- подозрительный HTML-тег, и тихо удалила его, а автор не заметил.
test -w
он же [ -w
не проверяет режим файла. Он проверяет, доступен ли он для записи. Для рута это так.
$ help test | grep '\-w'
-w FILE True if the file is writable by you.
Способ, который я бы проверил, состоял в том, чтобы выполнить побитовое сравнение с выводомstat(1)
("%a
Права доступа в восьмеричном виде" ).
(( 0$(stat -c %a somefile) & 0200 )) && echo rw || echo ro
Обратите внимание, что подоболочка $(...)
нуждается в префиксе 0
, чтобы вывод stat
интерпретировался как восьмеричный с помощью ((... ))
.
Я думаю, вы неправильно поняли, что делает -w
. Он не проверяет, есть ли у файла «права на запись», он проверяет, доступен ли для записи файл пользователю , вызвавшему .
Более конкретно, он вызывает access(2)
или аналогичный.
например, если скрипт имеет if [ -w /etc/shadow ]
, то если вы запустите strace
в скрипте, вы можете увидеть строку, похожую на
faccessat(AT_FDCWD, "/etc/shadow", W_OK)
Поскольку root
может записывать в файл, он возвращает 0.
например, как обычный пользователь:
faccessat(AT_FDCWD, "/etc/shadow", W_OK) = -1 EACCES (Permission denied)
Как root
faccessat(AT_FDCWD, "/etc/shadow", W_OK) = 0
И это несмотря на то, что /etc/shadow
имеет разрешение 000
на моей машине.
---------- 1 root root 4599 Jan 29 20:08 /etc/shadow
Теперь то, что вы хотите сделать, становится интересным и не таким простым.
Если вы хотите проверить простые разрешения, проверьте вывод ls
или вызовите stat
или что-то подобное. Но имейте в виду, что ACL могут превышать -эти разрешения.Тот факт, что файл имеет разрешение 400, не мешает ему быть доступным для записи...
Пользователь root может делать все, что ему заблагорассудится, «обычные» права доступа к файлам не являются ограничениями. Он не будет напрямую запускать простой файл без каких-либо разрешений на выполнение, просто для небольшой страховки от практики использования мишени.