Изменение значений sysctl внутри контейнера lxc

Перезапись теперь удаленного ответ [1 164] VonC. глоток>

сжатый ответ Robert Gamble имеет дело непосредственно с вопросом. Этот распространяется о некоторых проблемах с именами файлов, содержащими пробелы.

См. также: $ {1: $ +" "} в/bin/sh

Основной тезис: "$@" корректно, и $* (закрывший кавычки) является почти всегда неправильным. Это вызвано тем, что "$@" хорошо работает, когда аргументы содержат пробелы и работы то же как [1 113], когда они не делают. При некоторых обстоятельствах, "$*" в порядке также, но "$@" обычно (но не всегда) работы в тех же местах. Неупомянутый, $@ и $* эквивалентны (и почти всегда неправильно).

Так, каково различие между [1 118], $@, "$*", и "$@"? Они все связаны с 'всеми аргументами оболочке', но они делают разные вещи. Когда закрывшийся кавычки, $* и $@ делают то же самое. Они рассматривают каждое 'слово' (последовательность непробела) как отдельный аргумент. Заключенные в кавычки формы очень отличаются, хотя: "$*" обработки список аргументов как единственная разделенная пробелом строка, тогда как "$@" обработки аргументы почти точно, как они были, когда определено на командной строке. "$@" не расширяется ни до чего вообще, когда нет никаких позиционных параметров; "$*" расширяется до пустой строки — и да, существует различие, хотя может быть трудно чувствовать его. Посмотрите больше информации ниже после введения (нестандартной) команды al.

Вторичный тезис: , если необходимо обработать споры с пробелами и затем передать их на другие команды, тогда Вам иногда нужны нестандартные инструменты для помощи. (Или необходимо использовать массивы, тщательно: "${array[@]}" ведет себя аналогично к [1 130].)

Пример:

    $ mkdir "my dir" anotherdir
    $ ls
    anotherdir      my dir
    $ cp /dev/null "my dir/my file"
    $ cp /dev/null "anotherdir/myfile"
    $ ls -Fltr
    total 0
    drwxr-xr-x   3 jleffler  staff  102 Nov  1 14:55 my dir/
    drwxr-xr-x   3 jleffler  staff  102 Nov  1 14:55 anotherdir/
    $ ls -Fltr *
    my dir:
    total 0
    -rw-r--r--   1 jleffler  staff  0 Nov  1 14:55 my file

    anotherdir:
    total 0
    -rw-r--r--   1 jleffler  staff  0 Nov  1 14:55 myfile
    $ ls -Fltr "./my dir" "./anotherdir"
    ./my dir:
    total 0
    -rw-r--r--   1 jleffler  staff  0 Nov  1 14:55 my file

    ./anotherdir:
    total 0
    -rw-r--r--   1 jleffler  staff  0 Nov  1 14:55 myfile
    $ var='"./my dir" "./anotherdir"' && echo $var
    "./my dir" "./anotherdir"
    $ ls -Fltr $var
    ls: "./anotherdir": No such file or directory
    ls: "./my: No such file or directory
    ls: dir": No such file or directory
    $

, Почему это не работает? Это не работает, потому что оболочка обрабатывает кавычки, прежде чем это развернет переменные. Так, заставить оболочку обращать внимание на кавычки встроило в [1 131], необходимо использовать eval:

    $ eval ls -Fltr $var
    ./my dir:
    total 0
    -rw-r--r--   1 jleffler  staff  0 Nov  1 14:55 my file

    ./anotherdir:
    total 0
    -rw-r--r--   1 jleffler  staff  0 Nov  1 14:55 myfile
    $ 

Это становится действительно хитрым, когда у Вас есть имена файлов такой как" He said, "Don't do this!"" (с кавычками и двойными кавычками и пробелами).

    $ cp /dev/null "He said, \"Don't do this!\""
    $ ls
    He said, "Don't do this!"       anotherdir                      my dir
    $ ls -l
    total 0
    -rw-r--r--   1 jleffler  staff    0 Nov  1 15:54 He said, "Don't do this!"
    drwxr-xr-x   3 jleffler  staff  102 Nov  1 14:55 anotherdir
    drwxr-xr-x   3 jleffler  staff  102 Nov  1 14:55 my dir
    $ 

оболочки (все они) не делают особенно легким обработать такой материал, таким образом (странно достаточно) много программ Unix не делают хорошего задания обработки их. На Unix имя файла (единственный компонент) может содержать любые символы кроме наклонной черты и NUL '\0'. Однако оболочки сильно не поощряют пробелов или новых строк или вкладок нигде в пути. Это также, почему стандартные имена файлов Unix не содержат пробелы, и т.д.

При контакте с именами файлов, которые могут содержать пробелы и другие неприятные символы, необходимо быть чрезвычайно осторожными, и я нашел давно, что мне была нужна программа, которая не является стандартной на Unix. Я называю его escape (версия 1.1 была датирована 1989-08-23T16:01:45Z).

Вот пример [1 136] используем - с системой управления SCCS. Это - сценарий покрытия, который делает обоих delta (думайте регистрация ), и get (думают контроль ). Различные аргументы, особенно -y (причина, почему Вы внесли изменение) будут содержать пробелы и новые строки. Обратите внимание, что даты сценария с 1992, таким образом, это использует обратные галочки вместо [1 140] нотация и не использует #!/bin/sh на первой строке.

:   "@(#)$Id: delget.sh,v 1.8 1992/12/29 10:46:21 jl Exp $"
#
#   Delta and get files
#   Uses escape to allow for all weird combinations of quotes in arguments

case `basename [113] .sh` in
deledit)    eflag="-e";;
esac

sflag="-s"
for arg in "$@"
do
    case "$arg" in
    -r*)    gargs="$gargs `escape \"$arg\"`"
            dargs="$dargs `escape \"$arg\"`"
            ;;
    -e)     gargs="$gargs `escape \"$arg\"`"
            sflag=""
            eflag=""
            ;;
    -*)     dargs="$dargs `escape \"$arg\"`"
            ;;
    *)      gargs="$gargs `escape \"$arg\"`"
            dargs="$dargs `escape \"$arg\"`"
            ;;
    esac
done

eval delta "$dargs" && eval get $eflag $sflag "$gargs"

(я, вероятно, не использовал бы Escape вполне так полностью в эти дни - это не нужно с -e аргумент, например - но в целом, это - один из моих более простых сценариев с помощью [1 143].)

escape программа просто производит свои аргументы, скорее как [1 145] делает, но она гарантирует, что аргументы защищены для использования с [1 146] (один уровень [1 147]; у меня действительно есть программа, которая сделала удаленное выполнение оболочки, и это должно было выйти из вывода [1 148]).

    $ escape $var
    '"./my' 'dir"' '"./anotherdir"'
    $ escape "$var"
    '"./my dir" "./anotherdir"'
    $ escape x y z
    x y z
    $ 

у меня есть другая программа, названная al, который перечисляет ее аргументы один на строку (и это является еще более древним: версия 1.1, датированная 1987-01-27T14:35:49). Это является самым полезным при отладке сценариев, поскольку это может быть включено в командную строку для наблюдения, какие аргументы на самом деле передаются команде.

    $ echo "$var"
    "./my dir" "./anotherdir"
    $ al $var
    "./my
    dir"
    "./anotherdir"
    $ al "$var"
    "./my dir" "./anotherdir"
    $

[ Добавленный: И теперь показать различие между различным "$@" нотации, вот еще один пример:

$ cat xx.sh
set -x
al $@
al $*
al "$*"
al "$@"
$ sh xx.sh     *      */*
+ al He said, '"Don'\''t' do 'this!"' anotherdir my dir xx.sh anotherdir/myfile my dir/my file
He
said,
"Don't
do
this!"
anotherdir
my
dir
xx.sh
anotherdir/myfile
my
dir/my
file
+ al He said, '"Don'\''t' do 'this!"' anotherdir my dir xx.sh anotherdir/myfile my dir/my file
He
said,
"Don't
do
this!"
anotherdir
my
dir
xx.sh
anotherdir/myfile
my
dir/my
file
+ al 'He said, "Don'\''t do this!" anotherdir my dir xx.sh anotherdir/myfile my dir/my file'
He said, "Don't do this!" anotherdir my dir xx.sh anotherdir/myfile my dir/my file
+ al 'He said, "Don'\''t do this!"' anotherdir 'my dir' xx.sh anotherdir/myfile 'my dir/my file'
He said, "Don't do this!"
anotherdir
my dir
xx.sh
anotherdir/myfile
my dir/my file
$

Уведомление, что ничто не сохраняет исходные пробелы между * и */* на командной строке. Кроме того, обратите внимание, что можно изменить 'параметры командной строки' в оболочке при помощи:

set -- -new -opt and "arg with space"

Это устанавливает 4 опции, '-new', '-opt', 'and', и' arg with space'.
]

Хм, это - вполне длинное ответ - возможно , толкование является лучшим термином. Исходный код для [1 157] доступный по запросу (электронная почта к firstname отмечают точкой lastname в точке Gmail com). Исходный код для [1 158] невероятно прост:

#include 
int main(int argc, char **argv)
{
    while (*++argv != 0)
        puts(*argv);
    return(0);
}

Это - все. Это эквивалентно test.sh сценарий, который Robert Gamble показал и мог быть записан как функция оболочки (но функции оболочки не существовали в локальной версии Оболочки Bourne, когда я сначала записал al).

Также записка, которую можно написать al как простой сценарий оболочки:

[ $# != 0 ] && printf "%s\n" "$@"

условное выражение необходимо так, чтобы оно не производило вывода, когда передано никакие аргументы. Эти printf управляют, продолжит пустую линию только с аргументом строки формата, но программа C ничего не производит.

5
задан 19.05.2020, 04:34

2 ответа

У меня была та же проблема. Вы правы, что это связано с контейнерами LXC. Я добавил net.ipv4.ip_nonlocal_bind = 1 к своему sysctl.conf хоста LXC, затем работал: sysctl -p (требует корня access/sudo)

я действительно должен был перезагрузить контейнер для изменения для вступления в силу. Кроме того, Вы все еще доберетесь sysctl: cannot stat /proc/sys/net/ipv4/ip_nonlocal_bind: No such file or directory на контейнере. Если функциональность работает, я не совсем уверен, что необходимо для той же команды быть выполненным на гостевом контейнере.

я могу теперь получить доступ к контейнеру через VIP или определенный IP.

2
ответ дан 19.05.2020, 04:35

Очень последнее обновление, но может помочь кому-то еще.

у Вас был/proc смонтированным в Вашем контейнере?

в сообщении об ошибке говорится, что оно не смогло найти файл в/proc файловой системе, которая должна (для меня) быть явно смонтирована, чтобы быть доступной в контейнере LXC.

2
ответ дан 19.05.2020, 04:36

Теги

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