Примечание: Я записал это несколько часов назад, но я нахожусь в пути Sandy, таким образом, я ушел и забыл нажимать кнопку отправки
Таким образом, существует два способа выполнить это, и оба делают что-то другое. Будет невозможным действительно заблокировать Facebook, поскольку любой мог использовать сайт прокси и обойти Ваши ограничения. Они могли также туннель SSH к серверу, который не ограничивается. Тем не менее, здесь мы идем...
iptables
bash$ sudo iptables -A OUTPUT -p tcp -d 69.171.247.21 --dport 443 -j REJECT
bash$ sudo iptables -A OUTPUT -p tcp -d 66.220.149.88 --dport 443 -j REJECT
bash$ sudo iptables -A OUTPUT -p tcp -d 66.220.152.16 --dport 443 -j REJECT
bash$ sudo iptables -A OUTPUT -p tcp -d 69.171.234.21 --dport 443 -j REJECT
bash$ sudo iptables -A OUTPUT -p tcp -d 69.171.237.16 --dport 443 -j REJECT
Оборотная сторона, это не мешает Facebook добавить новый IP-адрес для facebook.com для разрешения к. Вы могли записать сценарий для постоянного выполнения и получить последнее:
#!/bin/bash
for i in $(host facebook.com | grep "has address " | cut -d' ' -f4)
do iptables -A OUTPUT -p tcp -d $i --dport 443 -j REJECT
done
Примечание: этому действительно нужно немного модификации, поскольку она может произвести ошибки
DNS
Это решение не идеально также. DNS является просто основой системы именования, поражение IP-адреса непосредственно победило бы. При владении Внутренним сервером имен для сети Вы могли бы установить запись для facebook.com для разрешения где-то в другом месте. Я использовал бы это в сочетании с iptables один выше.
sslstrip - не рекомендуемый вообще
Мы могли даже пойти один шаг вперед. При владении всеми машинами в сети, для которой Вы пытаетесь заблокировать Facebook, Вы могли генерировать Корень сертификат CA, установить открытый ключ на всех машинах. Man-in-the-middle весь трафик SSL оставляет все веб-сайты с Вашими сертификатами и активно уничтожает соединения Facebook. Однако это - опасная идея и имеет последствия конфиденциальности (особенно в корпоративной среде).
В bash
вы можете установить параметр nullglob
, чтобы шаблон, который не соответствует ничему, «исчезал», а не обрабатывался как литерал строка:
shopt -s nullglob
for fname in *.zip ; do
echo "current file is ${fname}"
done
В сценарии оболочки POSIX вы просто проверяете, что fname
существует (и одновременно с [-f]
, проверьте, что это обычный файл (или символическая ссылка на обычный файл), а не другие типы, такие как directory / fifo / device ...):
for fname in *.zip; do
[ -f "$fname" ] || continue
printf '%s\n' "current file is $fname"
done
Замените [-f "$ fname"]
на [-e "$ fname"] || [-L "$ fname]
, если вы хотите перебрать все (не скрытые) файлы, имена которых заканчиваются на .zip
, независимо от их типа.
Замените *. zip
с . *. zip .zip * .zip
, если вы также хотите учитывать скрытые файлы, имена которых заканчиваются на .zip
.
Для этого используйте команду find
export -f myshellfunc
find . -mindepth 1 -maxdepth 1 -type f -name '*.zip' -exec bash -c 'myshellfunc "$0"' {} \;
НЕОБХОДИМО экспортировать функцию оболочки с помощью export -f
.
Теперь find
выполняет bash
, который выполняет функцию оболочки, и остается только на текущем уровне dir.
Исправил это некоторое время назад, подумал, что опубликовал это здесь. Все, что мне нужно было сделать, это установить ОС как один раздел, по какой-то причине она отформатировала другие каталоги неправильного размера.
-121--27346-Вместо:
FILES=`ls *.zip`
Попробуйте:
FILES=`ls * | grep *.zip`
В этом пути при сбое ls (что и происходит в вашем случае) он будет возвращен в виде пустой переменной.
current file is <---Blank Here
Можно добавить к этому некоторую логику, чтобы вернуть значение «No File Found»
#!/bin/bash
FILES=`ls * | grep *.zip`
if [[ $? == "0" ]]; then
for fname in "$FILES" ; do
echo current file is $fname
done
else
echo "No Files Found"
fi
Этот путь, если предыдущая команда выполнена успешно (с 0 значением), то она распечатает текущий файл, в противном случае - «No Files Found»
Используйте find
export -f myshellfunc
find . -mindepth 1 -maxdepth 1 -type f -name '*.zip' -exec bash -c 'myshellfunc "$0"' {} \;
Вы ДОЛЖНЫ экспортировать свою функцию оболочки с помощью export -f
, чтобы это сработало.
Теперь find
выполняет bash
, который выполняет вашу функцию оболочки, и остается только на уровне текущего dir.
set ./* #set the arg array to glob results
${2+":"} [ -e "$1" ] && #if more than one result skip the stat "$1"
printf "current file is %s\n" "$@" #print the whole array at once
###or###
${2+":"} [ -e "$1" ] && #same kind of test
for fname #iterate singly on $fname var for array
do printf "file is %s\n" "$fname" #print each $fname for each iteration
done
В одном из комментариев здесь вы упоминаете вызов функции...
file_fn()
if [ -e "$1" ] || #check if first argument exists
[ -L "$1" ] #or else if it is at least a broken link
then for f #if so iterate on "$f"
do : something w/ "$f"
done
else command <"${1-/dev/null}" #only fail w/ error if at least one arg
fi
file_fn *