Проверка существование файлов против списка

Используйте a Match директива в /etc/sshd_config.

PasswordAuthentication No
Match Address 192.168.1.0/24
    PasswordAuthentication yes

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

PasswordAuthentication No
Match Address 192.168.1.0/24 User joe,bob
    PasswordAuthentication yes

2
30.12.2011, 06:03
4 ответа

Похоже, что Вы ищете 'out_fname =', не просто 'out_fname'.

Я или сделал бы это в соединении awk и оболочки или в Python. В awk/shell:

awk '{for(i=0;i<NF;i++) {if (index($i, 'out_fname=')) {split($i,A,/=/);print A[i]}}' "$@" |
    while read filename; do
        if [ ! -f $filename ]; then echo $filename; fi
    done > stillneed.txt

В Python:

import fileinput, os
stillneed = open("stillneed.txt", "w")
for line in fileinput.input():
    for filename in [l.split('=')[1] for l in line.split() if l.find('out_fname=')!=-1]:
        if not os.path.exists(filename):
            print >>stillneed, filename
1
27.01.2020, 22:01

Вместо того, чтобы проверить, что отсутствует после того, как завершился первоначальный сценарий загрузки, рассмотрите добавление некоторых проверок к упомянутому сценарию загрузки. Я не протестировал следующее, я просто записал это первое, что пришло на ум:

cat files_to_download|while read file; 
do
    SUCCESS="False"
    while [[ $SUCCESS == "False" ]];
    do
        wget $file;
        if [[ $? -eq 0 ]];
        then
            SUCCESS="True"
        fi
   done
done
1
27.01.2020, 22:01

не уверенный, если это поможет, но у меня есть функция для повторения команд, пока они не возвращают успех:

retry () {
    local delay=1 n

    if ! [[ $1 = *[^0-9]* ]]; then
        # TODO allow delay=0 (prevents Ctrl-C)
        if (($1 > 0)); then
            delay=${1:1}
        fi
        shift
    fi

    # run command
    while ! "$@"; do
        echo "retrying in ${delay}s"
        for ((n=delay; n>0; n--)); do
            sleep 1 || return
        done
    done
}; export -f retry
1
27.01.2020, 22:01

Я рекомендовал бы echoлуг копия строки, когда загрузка перестала работать, вместо того, чтобы рассмотреть имена файлов путем парсинга каждой строки в файле впоследствии:

[[ -f $1 ]] || { echo "$1 not found" >&2; exit 1; }
while read -r line; do
    $line || echo "$line" >> stillneed
done < "$1"

Это было бы более эффективным, и также означает, что Вы не должны волноваться ни о каких нечетных именах файлов в будущем (например, с пробелами в.)

Если Вы хотите улучшить свой существующий метод, Вы могли бы использовать стандартное расширение параметра:

for f; do
    while read -r line; do
        for item in $line; do
            [[ $item = out_fname=* ]] || continue
            [[ -f ${item#out_fname=} ]] || echo "$line"
            break # assuming one fname per line
        done
    done < "$f"
done > stillneed

.. но рассмотрите то, что происходит с: out_fname='foo bar.ext'. Кроме того, примите во внимание, что это проверяет каждую строку после события, когда мы, возможно, просто проверили, работала ли команда в то время, когда мы выполнили его.

Открытие stillneed однажды для целого цикла более эффективно; я не сделал этого в первом отрывке, поскольку мы, скорее всего, захотим видеть вывод от команд загрузки. Здесь существуют только тесты, никакие внешние команды, работающие, таким образом, имеет смысл открывать файл однажды. (Отметьте использование > усечет файл в запуске; я использовал for f позволить больше чем один входной файл как позиционные параметры: добавление того же выше должно быть легким при необходимости в нем.)

Одна вещь, которую я должен подчеркнуть, заключает в кавычки: echo "$line" очень отличается от echo $line. В целом заключите все расширения параметра в кавычки (это включает переменные), если Вы не знаете наверняка, что хотите, чтобы разделение поля произошло.

1
27.01.2020, 22:01

Теги

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