Оба варианта выполняются с помощью команды iptables
.
Во-первых, отключите входящий доступ по умолчанию. Примечание: НЕ вводите это в командной строке, если вы подключены через ssh
или что-то подобное, потому что вы заблокируете себя.
iptables -P INPUT DROP
Затем разрешите уже установленные соединения:
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Наконец, откройте порты, к которым вы хотите разрешить доступ; например, для HTTP:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
повторить для других портов.
Чтобы получить перевод порта, вам нужно использовать таблицу nat
:
iptables -t nat -A prerouting -p tcp --dport 80 -j REDIRECT --to-port 8080
С -I
xargs
получает один аргумент на строку, в отличие от значения по умолчанию, когда один аргумент на (пробел или символ новой строки с разделителями, возможное )слово в кавычках без-I
(и подразумевает-n
). Таким образом, в вашем примере date
вызывается только один раз с {}
, расширенным до всего вывода echo
(, который находится в одной строке ), за вычетом завершающей новой строки.
Здесь вы можете (отметить, что -d
является расширением GNU):
printf '%s\n' {1..12}/01 | xargs -I {} date -d {} +%b | xargs mkdir --
(обратите внимание, что это не будет работать корректно в локалях, где аббревиатуры названий месяцев содержат пробелы или символы кавычек; с GNU xargs
вы можете обойти это, используяxargs -d '\n' mkdir --
)
Теперь, чтобы получить список аббревиатур месяцев в вашей локали, более целесообразно напрямую запрашивать локаль:
(IFS=';'; set -o noglob; mkdir -- $(locale abmon))
(см. также locale -k LC_TIME
, чтобы увидеть все данные локали в категории LC_TIME
).
Или изначально вzsh
:
zmodload zsh/langinfo
mkdir -- ${(v)langinfo[(I)ABMON_*]}
По крайней мере, в системах GNU в некоторых регионах сокращения месяцев дополняются пробелами до фиксированной ширины:
$ LC_ALL=et_EE.UTF-8 locale title abmon
Estonian locale for Estonia
jaan ;veebr;märts;apr ;mai ;juuni;juuli;aug ;sept ;okt ;nov ;dets
$ LC_ALL=zh_TW.UTF-8 locale title abmon
Chinese locale for Taiwan R.O.C.
1月; 2月; 3月; 4月; 5月; 6月; 7月; 8月; 9月;10月;11月;12月
Вы можете удалить этот отступ.
Начальные пробелы будут удалены с помощью xargs -I
, но не конечные. Сzsh
:
zmodload zsh/langinfo
set -o extendedglob
mkdir -- ${${${(v)langinfo[(I)ABMON*]}##[[:space:]]#}%%[[:space:]]#}
Попробовать цикл?
$ for m in {1..12}; do
> date -d "$m"/01 +%b
> done
jan
feb
mar
apr
maj
jun
jul
aug
sep
okt
nov
dec
Если вы хотите создать каталог для каждого месяца, я бы сделал что-то вроде:
for m in {1..12}; do newdir=$(date -d "$m"/01 +%b); mkdir "$newdir"; done
Ваша команда не работает, так как использование -I
изменяет разделитель xargs:
-I replace-str
Replace occurrences of replace-str in the initial-arguments with names read from standard input. Also, unquoted blanks do not terminate input items; instead the separator is the newline character.
Вы можете добавить -d " "
к xargs, чтобы заставить его работать. Но вам даже не нужно -I{}
в вашем случае:
Попробуйте это,
echo {1..12}/01 | xargs -n1 date +%b -d | xargs mkdir
В оболочках с раскрытием скобок и датой, принимающей ввод DATAFILE, попробуйте
echo {01..12}/01$'\n' | date -f- +"mkdir %b"
и передать в оболочку, если результат вас устраивает.
Самый простой и надежный способ сделать это:
mkdir jan feb mar apr maj jun jul aug sep okt nov dec
В конце концов, это статический список месяцев...
Если вы намерены использовать GNUdate
(здесь, предполагая немодифицированный $IFS
и GNU date
, как для вашегоdate -d
):
mkdir $( printf '%s\n' {1..12}/01 | date -f - +%b )
Ты был так близко.
Проблема в том, что echo создает одну строку 1/01 2/01 3/01 4/01 5/01 6/01 7/01 8/01 9/01 10/01 11/01 12/01
, а xargs использует символ новой строки в качестве разделителя полей (, а не пробел ).
Решение :Приказать эхо поставить пробел между каждым полем.
echo -e {1..12}/01\\n | xargs -n 1 -I {} date -d {} +%b
Я вставил только \\n
в конце эха.
Затем, чтобы каталоги добавлялись|xargs mkdir
напр.
echo -e {1..12}/01\\n | xargs -n 1 -I {} date -d {} +%b | xargs mkdir