Можно ли вообще правильно обрабатывать все возможные имена файлов? [closed]

Вы не изменили переменные eth_* в сценарии bridge-start, чтобы они соответствовали вашему реальному сценарию. В результате, когда вы запускаете свой скрипт, IP-адрес меняется с 111.111.111.111 на 192.168.8.4, и вы теряете подключение.

Даже если вы исправили это, вам, вероятно, потребуется заново создать таблицу маршрутизации (в частности, маршрут по умолчанию).

Если возможно, настройте и запустите мост (br0 и eth0), прежде чем продолжать работу с openvpn. В идеале вы должны запустить мост во время загрузки, а затем вы можете добавить интерфейс tap0, когда начнете тестировать openvpn.

Успешно изменить конфигурацию сети удаленно непросто. Если у вас есть какой-либо способ подключить KVM, пока вы работаете, я бы порекомендовал вам воспользоваться этим шансом.


Появляется комментарий с запросом на руководство. Вместо того, чтобы указывать за пределами сайта, вот как я настроил мост в одной из своих систем. Он не использует NetworkManager, это конфигурация в /etc/network/interfaces. Если вы ошибетесь, вы не сможете войти в систему, поэтому я бы посоветовал вам использовать KVM или попробовать его на локальном компьютере, чтобы убедиться, что процесс работает.

allow-hotplug eth0
iface eth0 inet manual

auto br0
iface br0 inet static              ← ASSUMES STATIC IP ADDR
        address 111.111.111.111
        netmask 255.255.255.0
        gateway 111.111.111.254    ← FIX ME BEFORE TRYING THIS
        bridge_ports eth0
        bridge_fd 0
        bridge_maxwait 0
0
13.04.2018, 13:32
2 ответа

В именах файлов можно использовать любые символы, кроме нулевого символа(\0)и косой черты, которая является разделителем пути. Переменные могут содержать любые данные (, за исключением нулевых символов в большинстве оболочек ). При правильном заключении в кавычки имена файлов можно безопасно хранить в переменных и использовать с утилитами.

О ваших баллах:

Для перебора набора файлов (обычных файлов или каталогов )вы можете использовать простой цикл оболочки, например

for name in./*; do
    # some code that uses "$name"
done

Для перебора файлов при выборе определенных файлов с использованием определенных критериев findявляется лучшим выбором. например, чтобы выбрать все обычные файлы в текущем каталоге (или ниже ), которые старше Nдней, (имеют дату изменения не менее Nдней назад):

find. -type f -mtime +N

Точно так же -sizeиспользуется для выбора файлов по размеру и -nameдля сопоставления имени файла с шаблоном подстановки.

Например, чтобы выбрать обычные файлы, имена которых соответствуют *.movи которые были изменены за последнюю неделю:

find. -type f -name '*.mov' -mtime -7

Затем, чтобы на самом деле сделать что-то с этими файлами, например переместить их в каталог $HOME/Movies:

find. -type f -name '*.mov' -mtime -7 -exec mv {} "$HOME/Movies" ';'

{}будет заменено путем к файлу при вызове mv. Вам не нужно заключать{}(в кавычки, это ничего не изменит, если вы сделаете ), так как findне будет вызывать разбиение слов оболочки или расширение имени файла в имени пути.

Дальнейшим улучшением этого будет обнаружение конфликтов имен файлов в целевом каталоге. Для этого мы используем короткий вспомогательный скрипт, который будет принимать несколько имен файлов в своей командной строке:

destdir="$HOME/Movies"
for name do
    if [ -f "$destdir/${name##*/}" ]; then
        printf "%s already exists in %s, not overwriting it!\n" "${name##*/}" "$destdir" >&2
    else
        mv "$name" "$destdir"
    fi
done

или сокращенно:

destdir="$HOME/Movies"
for name do
    [ -f "$destdir/${name##*/}" ] && printf "skipping %s\n" "$name" >&2 && continue
    mv "$name" "$destdir"
done

Подключаем это к нашей команде find:

find. -type f -name '*.mov' -mtime -7 -exec sh -c '
    destdir="$HOME/Movies"
    for name do
        [ -f "$destdir/${name##*/}" ] && printf "skipping %s\n" "$name" >&2 && continue
        mv "$name" "$destdir"
    done' sh {} +

Нигде на этом пути мы не позволяем оболочке выполнять разбиение на слова или подстановку имени файла для пути или имени файла, которые мы в данный момент обрабатываем.

Для получения дополнительной информации:

4
28.01.2020, 02:13

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

.
shopt -s nullglob
for file in./*.txt; do
    do_something_with "$file"
done

Вот и все.

Подробнее:


Обновление :подстановка не отвечает за эффект разделения слов, который вы видите. Отсутствие кавычек переменной.

Вы можете получить информацию о файле для ваших условий с помощьюstat

read size mtime < <(stat -c "%s %Y" "$file")
[[ $size -gt 1000 ]] && echo "too big"
[[ $mtime -lt $(date -d yesterday +%s) ]] && echo "too old"

Обновление 2 :Создание имени файла с большим количеством специальных символов требует смешивания различных механизмов цитирования, но с этим файлом по-прежнему можно делать что угодно.

$ filename='~ASDFzxcv!@#$%^&*()_+[]\{}|;:",.<>?`'"'"$' \a\t\n\r\f'".txt"
#          ^^ single quoted part ^^^^^^^^^^^^^^^^   
#                             double quoted part ^^^
#                                ANSI-C quoted part ^^^^^^^^^^^^^^

$ echo "$filename"
~ASDFzxcv!@#$%^&*()_+[]\{}|;:",.<>?`'   

.txt

$ printf "%q\n" "$filename"
$'~ASDFzxcv!@#$%^&*()_+[]\\{}|;:",.<>?`\' \a\t\n\r\f.txt'

$ date > "$filename"

$ cat "$filename"
Thu Apr 12 15:14:29 EDT 2018

$ ls -lt
total 3836
-rw-rw-r-- 1 jackman jackman      29 Apr 12 15:14 ~ASDFzxcv!@#$%^&*()_+[]\{}|;:",.<>?`' ?????.txt
                ︙

$ ls -lt --show-control-chars
total 3836
-rw-rw-r-- 1 jackman jackman      29 Apr 12 15:14 ~ASDFzxcv!@#$%^&*()_+[]\{}|;:",.<>?`'     

.txt
                ︙

Если вывод lsперенаправляется на что-либо, кроме терминала (например, файл или канал ), по умолчанию будет использоваться стиль --show-control-chars. Вы можете увидеть это, запустив ls -lt | cat. lsимеет другие параметры отображения; например, --quoting-style=WORD.

8
28.01.2020, 02:13

Теги

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