Тестирование C++ кодирует с командами удара

Удостоверьтесь, что Вы сохраняете свой сервер SSH актуальным. OpenSSH имеет хорошую запись безопасности, но Вы не хотите.

Рассмотрите тщательно, необходимо ли позволить аутентификацию по паролю. Обычно необходимо входить в систему только от доверяемых компьютеров (не вводите пароль на компьютере, который может запускать клавиатурный перехватчик), и эти доверяемые компьютеры обычно находятся под контролем и имеют ssh закрытый ключ. Таким образом в большей части аутентификации по паролю обстоятельств не полезно, и необходимо отключить ее. Главная причина запретить аутентификацию по паролю состоит в том, что пользователи бедны в руководящих паролях: они снова используют их (таким образом, пароли пропущены), и они плохи при выборе трудных к предположению паролей (таким образом, пароли вынуждены скотами). Если Вы - единственный пользователь на машине, и Ваш пароль силен, и Вы не используете тот пароль больше нигде, и Вы не имеете и никогда не будете иметь никакого вида тестовой учетной записи с легким к предположению паролем, и Вы никогда не будете открывать счет на друга, то нормально позволять аутентификацию по паролю.

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

Если Вы можете, сохранить вход в систему отдельной машиной или на медиа только для чтения. Обратите внимание, что существует много ботов, которые выполняют попытки "в лоб" войти в систему с предполагаемыми паролями или слабыми ключами. Эти боты безобидны против правильно защищенной установки (сильные пароли, никакой ключ низкой энтропии), но могут генерировать записи в журнале. Способ в основном избавиться от этих попыток "в лоб" состоит в том, чтобы выполнить ssh на порте не по умолчанию. Обратите внимание, что это - только способ подавить объем журналов (и возможно немного уменьшать трафик от зондирования), это не обеспечивает дополнительной безопасности по сути.

См. также этот подобный вопрос на Exchange Стопки безопасности.

1
08.01.2012, 22:26
2 ответа

Лучший способ сравнить текстовые файлы с diff команда:

diff output1.txt output1.txt

Для массового сравнения можно звонить diff в цикле:

for x in input*.txt; do
  slow-program <"$x" >"$x.out-slow"
  fast-program <"$x" >"$x.out-fast"
  diff "$x.out-slow" "$x.out-fast"
done

Если отрывок выше продуктов вывод, Ваша быстрая программа является багги. В bash/ksh/zsh Вы не должны хранить промежуточные файлы на диске. Однако это - не обязательно хорошая вещь, так как, вероятно, будет полезно осмотреть вывод отличия на Вашем досуге.

for x in input*.txt; do
  diff <(slow-program <"$x") <(fast-program <"$x")
done

Может быть более удобно поместить вводы и выводы в отдельные каталоги и выполнить рекурсивное различное.

for x in inputs/*; do slow-program <"$x" >"slow/${x##*/}"; done
for x in inputs/*; do fast-program <"$x" >"fast/${x##*/}"; done
diff -ru slow fast

Моя рекомендация состояла бы в том, чтобы записать make-файл, который запускает тесты и выполняет сравнения (в отдельных целях). (Используйте вкладки, куда я поместил 8 пробелов.)

all_test_inputs = $(wildcard input*.txt)  # relies on GNU make
%.out-slow: %.txt slow-program
        ./slow-program <$< >$@.tmp
        mv $@.tmp $@
%.out-fast: %.txt fast-program
        ./fast-program <$< >$@.tmp
        mv $@.tmp $@
%.diff: %.out-slow %.out-fast
        -diff $*.out-slow $*.out-fast >$@.tmp
        mv $@.tmp $@
# Test that all diff files are empty
test: $(all_test_inputs:%.txt=%.diff)
        for x in $^; do ! test -s "$x"; done
.PHONY: test

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

1
27.01.2020, 23:40

Принятие Вас скомпилировало Ваши программы как prog1 и prog2, и это они производят свой вывод на stdout, Вы могли сделать что-то вроде этого:

#! /bin/bash

for input in input*.txt ; do
  ./prog1 $input > $input.out1
  ./prog2 $input > $input.out2
  if cmp $input.out1 $input.out2 > /dev/null ; then
     echo Programs disagreed on $input
  else
     echo Programs agreed on $input
  fi
done

Это сравнивает байт выходных файлов для байта. Вы могли также использовать diff для сравнения.
Вывод всех выполнений будет в названных файлах inputX.txt.out1 или .out2, таким образом, можно осмотреть случаи, где они не соответствуют.

1
27.01.2020, 23:40

Теги

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