Правильно заключайте массив в кавычки, который передается косвенно через другую команду

эта команда должна работать. Вам следует посмотреть ИЛИ взглянуть на / var / log / secure (или /var/log/auth.log в некоторых дистрибутивах). Посмотрите, были ли неудачные попытки войти в Oracle.

Если ваш сервер открыт для публики, несомненно, он подвергся атаке методом грубой силы.

проверьте sshd и убедитесь, что у вас установлено MaxAuthTries ; это заблокировало бы пользователя, если будет много попыток ssh.

вы можете захотеть полностью отключить oracle ssh / etc / ssh / sshd_config :

Match User oracle
    PasswordAuthentication no
2
09.05.2019, 18:14
3 ответа
$ foo=(1 2 '3 4' 4 5)
$ printf "'%s'\n" "${foo[@]}"
'1'
'2'
'3 4'
'4'
'5'
$ subcommand() { printf "'%s'\n" "$@"; }
$ subcommand "${foo[@]}"
'1'
'2'
'3 4'
'4'
'5'

Итак, давайте адаптируем это к вашему конкретному -случаю использования:

git filter-branch --index-filter \
    'git rm -rf --cached file1 file2 […]' \
    HEAD

В вашем случае нам нужно проявить немного изобретательности и разбить все на более мелкие части.

git filter-branch --index-filter  \
    'git rm -rf --cached [MAGIC]' \
    HEAD

Создаваемый нами список файлов — это место, где вам нужно, чтобы произошло «волшебство». Остальное все статично, да? И так как вы пишете это, вам не нужно чтобы он был на трех строках, что упрощает:

git filter-branch --index-filter 'git rm -rf --cached [MAGIC]' HEAD

Так:

prefix="git filter-branch --index-filter 'git rm -rf --cached "
postfix="' HEAD"
magic="$(printf '"%s" ' "${file[@]}"'

И тогда, если мы выполним:

${prefix}${magic}${postfix}

Таким образом, мы собрали вашу команду -, хотя и использовали "для заключения ваших имен файлов, а не 's, поскольку команда filter-branchуже находится в 's.

0
27.01.2020, 21:53
  1. Вместо массива используйте set -- file1 file2...для заполнения списка параметров, затем используйтеbashпреобразование параметров с операторомQuote :

    set -- 'a "b' c "d 'e" "f 'g "'"h' ; (set -x; printf 'cmd %s\n' "${*@Q}")
    

    Выход:

    + printf 'cmd %s\n' ''\''a "b'\'' '\''c'\'' '\''d '\''\'\'''\''e'\'' '\''f '\''\'\'''\''g "h'\'''
    cmd 'a "b' 'c' 'd '\''e' 'f '\''g "h'
    

    Или, если мы удалим часть set -x;, вывод станет:

    cmd 'a "b' 'c' 'd '\''e' 'f '\''g "h'
    
  2. Комментарий от LL3предлагает лучший способ, который не требуетset --...:

    export x; n=(a "b 'c"); x="${n[@]@Q}"
    ( n=($x); printf 'cmd %s\n' "${n[*]}"; )
    

    Выход:

    cmd 'a' 'b '\''c'
    
  3. Еще один метод заключается в использованииbashпреобразования параметров с операторAssignment , (которому также требуетсяeval):

    export x;n=(a b 'c d');x="${n[@]@A}"; (eval "$x";printf '%s\n' "${n[@]}")
    

    Вывод, показывающий, что видит printf:

    a
    b
    c d
    
3
27.01.2020, 21:53

git filter-branchзапускает /bin/sh /usr/lib/git-core/git-filter-branch, и этот скрипт оценивает аргумент --index-filterс помощьюeval.

Таким образом, этот аргумент оценивается как /bin/shкод.

В большинстве систем /bin/shбудет в той или иной степени интерпретатором языка POSIX sh, хотя в некоторых, таких как Solaris 10 и старше, это все еще может быть древний язык Bourne sh.

Когда дело доходит до синтаксиса цитирования, это мало что меняет.

В любом случае нельзя использовать ни один из расширенных операторов кавычек ksh/bash/zsh, например $'...'.Это означает, что вы не можете использовать оператор GNU/bash/zsh/ksh printf %qилиmksh/bash${var@Q}или трассировку xtraceдля создания цитирования, поскольку в некоторых случаях прибегают к $'...'. Они также используют некоторые формы цитирования, которые -небезопасны для локализации (, например\).

Один из встроенных операторов цитирования, который вы можете использовать, — это zshфлаг раскрытия параметра qq, так как он использует одинарные кавычки:

files=(foo 'a b c' $'a\nb\nc' --foo-- "a'b")
git filter-branch --index-filter "git rm -rf --cached -- ${${(@qq)files}}" HEAD

Чтобы увидеть, как zshцитирует эти:

$ printf '<%s>\n' "${${(@qq)files}}"
<'foo' 'a b c' 'a
b
c' '--foo--' 'a'\''b'>

С помощью bash/ksh/yash/zsh вы можете сделать то же самое цитирование, используя такую ​​функцию, как:

shquote() {
  LC_ALL=C awk -v q=\' '
    BEGIN{
      for (i=1; i<ARGC; i++) {
        gsub(q, q "\\" q q, ARGV[i])
        printf "%s ", q ARGV[i] q
      }
      print ""
    }' "$@"
}

А потом:

git filter-branch --index-filter "git rm -rf --cached -- $(shquote "${files[@]}")" HEAD
3
27.01.2020, 21:53

Теги

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