Объяснение SSH
Может быть, кто-то может вмешаться, если я неправильно понял, но я так понял, что это работает.
Вы создаете прослушивающий порт на удаленном хосте и перенаправляете его локально. Это устраняет вашу машину из уравнения принятия решения о том, куда должен направляться трафик, поэтому вам не нужно впоследствии настраивать маршруты. Таким образом, удаленный хост принимает решение о том, куда его направить, на основе полученного трафика.
proxychains отправляет трафик на 8080 -> Отправка трафика на порт прослушивания 2222 на удаленной жертве, который возвращается к петле 22 на этом хосте. Теперь этот хост контролирует, куда идет трафик. Вот почему вам нужно развернуться таким образом.
При использовании этого метода ответственность за маршрутизацию ложится на хост-жертву, именно так работает сводная точка.
[ЗАКАТЕЛЬ]8080 < --> 2222[ЖЕРТВА]< -->22[ЖЕРТВА :]
Если вы пропустите первый шаг, ваша машина в конечном итоге решит, какой маршрут выбрать, и даст вам нежелательные результаты, отправив трафик по любому сетевому маршруту, который она может получить для этого... обычно вместо этого маршрутизируется через сеть вашего интернет-провайдера или какой-либо общедоступный сервер. сегментированной сети на другой стороне хоста.
[Атакующий]8080 < --> 22[ЖЕРТВА :]
find. -type f \( -name "*.txt" -o -name "*.data" -o -name "*.conf" \) -exec sh -c '
for file in "$@"; do
if grep -qF "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" "$file"; then
mv -- "$file" "${file%.*}.xml"
fi
done
' findshell {} +
Я думаю, что find
более адекватен в данном контексте. Он рекурсивно ищет обычные файлы с расширениями .txt
, .data
и .conf
и проверяет, присутствует ли указанная вами строка в каждом из них. Если да, то он изменит расширение на .xml
командой mv
.
Если вы не уверены, будет ли код работать должным образом, вы можете добавить echo
перед mv
, чтобы посмотреть, что он делает.
Я также должен упомянуть, что этот сценарий не зависит от не -POSIX-утилит.
Вы можете попробовать это:
for file in *.{txt,conf}; do
[[ $(grep "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" "$file") ]] && \
mv "$file" "${file%.*}.xml" || echo "$file" " does not match"
done
Использованиеbash
:
shopt -s globstar dotglob nullglob extglob
string='<?xml version="1.0" encoding="UTF-8"?>'
for pathname in./**/*.@(txt|data|conf); do
if [[ -f $pathname ]] && grep -q -F "$string" "$pathname"; then
mv -i "$pathname" "${pathname%.*}.xml"
fi
done
Я начинаю с установки ряда опций оболочки, которые обычно не устанавливаются в bash
по умолчанию:
globstar
включает шаблон подстановки **
, который рекурсивно сопоставляется с подкаталогами. dotglob
заставляет шаблоны подстановки соответствовать скрытым именам. nullglob
заставляет несоответствующий шаблон -полностью исчезнуть вместо того, чтобы оставаться нераскрытым. Это гарантирует, что наш цикл позже вообще не запустится, если не будет совпадения. extglob
включает расширенные шаблоны подстановки, например @(txt|data|conf)
, который соответствует одной из строк внутри круглых скобок. Затем мы перебираем имена-кандидаты в цикле и проверяем каждое из них на заданную строку. Если строка найдена, файл переименовывается путем замены суффикса имени файла после последней точки на xml
.
Если вам нужно сделать это с grep
и for
, то, возможно, что-то вроде этого?
grep -RlZ '<?xml version="1.0" encoding="UTF-8"?>' --include "*.txt" --include "*.data" --include "*.conf" |
xargs -0 sh -c 'for f; do echo mv -- "$f" "${f%.*}.xml"; done' sh
(удалите echo
после того, как убедитесь, что все работает правильно ).
grep -RlZ
выводит нулевой -список имен файлов с разделителями, в которых найдены совпадения
xargs -0
передает этот нулевой -разделенный список вsh -c
for f
перебирает имена файлов как позиционные параметры
или (, если вам разрешено использовать while
вместо for
), вы можете пропустить xargs
и дополнительный сценарий оболочки, например
grep -RlZ '<?xml version="1.0" encoding="UTF-8"?>' --include "*.txt" --include "*.data" --include "*.conf" |
while IFS= read -r -d '' f; do echo mv -- "$f" "${f%.*}.xml"; done