Используйте 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
Похоже, что Вы ищете '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
Вместо того, чтобы проверить, что отсутствует после того, как завершился первоначальный сценарий загрузки, рассмотрите добавление некоторых проверок к упомянутому сценарию загрузки. Я не протестировал следующее, я просто записал это первое, что пришло на ум:
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
не уверенный, если это поможет, но у меня есть функция для повторения команд, пока они не возвращают успех:
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
Я рекомендовал бы 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
. В целом заключите все расширения параметра в кавычки (это включает переменные), если Вы не знаете наверняка, что хотите, чтобы разделение поля произошло.