Почему, когда цикл работает из терминала, если у ld-2.17.so нет разрешения на исполнение?

Решение оболочки:

#!/bin/bash

IFS=
before=
read -r current

while read -r after
do
  [[ "$before" < "$current" || "$before" = "$current"  ]] &&
    [[ "$current" < "$after" || "$current" = "$after"  ]] &&
    printf '%s\n' "$current" &&
    before="$current"

  current="$after"
done

[[ "$before" < "$current" || "$before" = "$current"  ]] &&
  printf '%s\n' "$current"

Использование: ./ script

Обратите внимание, что с bash вы можете использовать [[..]] сравнения, чтобы лексические сравнения зависели от локали и были менее наивными (должны работать с ä, ö, à и т. д.).

Что касается точки зрения Стефана о том, как решить для последнего примера в вопросе, это отдает предпочтение более позднему случаю. Таким образом, он фактически удалит C .

2
29.08.2018, 10:48
1 ответ
while IFS= read -d '' -r line; do 
    printf "%s\0" "$line"
done > executable-file < /lib64/ld-2.17.so

использует только встроенные в оболочку -ins, поэтому ему не нужно запускать новые процессы. Сценарий восстановления предполагает, что у вас уже запущена оболочка; поскольку он уже запущен, его права доступа к диску и его библиотекам больше не имеют значения.

При таких обстоятельствах вы не сможете запустить новую оболочку, но измененные разрешения не влияют ни на что, работающее в данный момент.

Если файл, который вы пытаетесь прочитать, не имеет разрешений , это будет работать, только если вы находитесь в корневой оболочке; в противном случае перенаправление с ld-2.17.soне удастся, так как вы не сможете читать из нечитаемого файла, если вы не являетесь пользователем root. (Здесь я игнорирую SELinux и т. д.)

4
27.01.2020, 21:58

Теги

Похожие вопросы