Nginx для реверсирования прокси на гуакамоле, но RDP не работает во внешней локальной сети с прокси

В конце концов мне вообще не понадобилась PROMPT_COMMAND. Спасибо Кристоферу за то, что указал мне правильное направление.

Вместо этого рассмотрите этот файл, ps1.prompt:

${__cmdnbary[\#]+$(
    echo '\u@\h: \w' # Your fancy prompt goes here, with all the usual special characters available.
) }${__cmdnbary[\#]=}\$

Затем я могу загрузить это в свою PS1:

PS1=$(cat ps1.prompt)

(вам не нужно делать это способом, но мне он показался удобным для иллюстрации и редактирования.)

Итак, мы видим:

mikemol@zoe:~$ echo hi
hi
mikemol@zoe:~$ echo ho
ho
mikemol@zoe:~$ echo hum
hum
mikemol@zoe:~$ 
mikemol@zoe:~$ PS1=$(cat ps1.prompt)
$ 
mikemol@zoe: ~ $ echo hi
hi
$ echo ho
ho
$ echo hum
hum
$ 
mikemol@zoe: ~ $ 

Мы используем хак массива , продемонстрированный здесь, но вместо bash для подстановки параметра ${parameter:-word}, мы используем ${parameter+word}, поэтому мы срабатываем только при отсутствии предыдущего запуска команды.

Это требует некоторых пояснений, поскольку в нашей логике мы вынуждены использовать двойное отрицание.

Как работает ${__cmdnbary[\#]-word}${__cmdnbary[\#]=}

В оригинальной демонстрации взлома массива конструкция ${__cmdnbary[\ #]-слово}${__cmdnbary[\#]=}. (Для ясности я заменил $? на слово). Если вы не особенно знакомы с расширением параметров и массивами (я не был), то совсем не понятно, что происходит.

Во-первых, поймите \#

Согласно руководству:

\# номер команды этой команды

...

номер команды это позиция в последовательности команд, выполняемых во время текущего сеанса оболочки.

Это означает, что \# изменится только тогда и только тогда, когда будет выполнена команда.Если пользователь вводит в приглашении пустую строку, никакая команда не выполняется, поэтому \# не изменится.

Установка пустой строки в ${__cmdnbary[#]=}

${__cmdnbary[\#]=} использует расширение параметра. Возвращаясь к руководству:

${параметр:=слово}

Назначить значения по умолчанию. Если параметр не установлен или равен нулю, параметру присваивается расширение слова. Затем подставляется значение параметра.

Итак, если __cmdnbary[\#] не задано или имеет значение null, эта конструкция присвоит пустую строку (word — пустая строка в нашем случае), и вся конструкция будет быть заменены в нашем выводе той же пустой строкой.

__cmdnbary[\#] будет всегда иметь значение unset или null в первый раз, когда мы его увидим, поскольку # является монотонным — оно всегда увеличивается или остается неизменным. (То есть, пока не зациклится, вероятно, около 2^31 или 2^63, но есть и другие проблемы, которые у нас будут задолго до того, как мы туда доберемся. Вот почему я описываю решение как немного хак.)

Условие в ${__cmdnbary[\#]-word}

${__cmdnbary[\#]-word} — это еще одно расширение параметра. Из руководства:

${параметр:-слово}

Использовать значения по умолчанию. Если параметр не установлен или равен нулю, подставляется расширение слова. В противном случае подставляется значение параметра.

Таким образом, если запись массива по адресу \# является неустановленной или нулевой, вместо нее используется слово.Поскольку мы не пытаемся присвоить значение __cmdnbary[\#] (используя замену ${parameter:=word}) до тех пор, пока не проверим его, при первой проверке для заданного \# следует найти эту позицию в массиве неустановленной.

bash использует разреженные массивы

Одно уточнение для тех, кто привык к массивам в стиле C. bash фактически использует разреженные массивы; пока вы не присвоите что-то позиции в массиве, эта позиция не установлена. Пустая строка — это не то же самое, что «null или unset».

Почему мы используем ${__cmdnbary[#]+word}${__cmdnbary[#]=} вместо

${__cmdnbary[\#]+word}${__cmdnbary[\#]=} и ${__cmdnbary[#]-word}${__cmdnbary[#]=}выглядят очень похоже. *Единственное*, что мы меняем между двумя конструкциями, можно найти в первой части; мы используем ${параметр:+слово}вместо ${параметр:-слово}`.

Помните, что с ${параметр:-слово} слово будет представлено только в том случае, если параметр равен нулю или не установлен — в нашем случае, только если мы еще еще не установили позицию в массиве, чего мы не сделаем тогда и только тогда, когда \# увеличилось, что произойдет, только если мы только что выполнили команда.

Это означает, что с ${parameter:-word} мы будем представлять word, только если мы не выполнили команду, которая прямо противоположно тому, что мы хотим сделать. Итак, вместо этого мы используем ${параметр:-слово}.Опять же, из руководства:

${параметр:+слово}

Использовать альтернативное значение. Если параметр нулевой или не задан, ничего не подставляется, иначе подставляется расширение слова.

Что (к сожалению) больше похоже на двойную отрицательную логику для понимания, но вот так.

Сама подсказка

Мы объяснили механизм переключения, но что насчет самой подсказки?

Здесь я использую $( ... ) для содержания подсказки. В первую очередь для моей выгоды для удобства чтения; Вы не должны делать это таким образом. Вы можете заменить $( ... ) тем, что вы обычно можете использовать в присваивании переменной.

Почему это взлом?

Помните, как мы добавляем записи в разреженный массив? Мы не удаляем эти записи, поэтому массив будет постоянно расти до тех пор, пока сеанс оболочки не будет завершен; оболочка протекает через PS1. Насколько я знаю, нет способа сбросить позицию переменной или массива в подсказке. Вы можете попробовать $(), но вы обнаружите, что это не сработает; изменения, внесенные в пространство имен переменных внутри подоболочки, не будут применяться к пространству, из которого была создана подоболочка.

Вы можете попробовать использовать mktmp в начале вашего .bashrc, до PS1 назначения, и добавить информацию в результирующий файл; тогда вы можете сравнить свой текущий \# с тем, что вы там сохранили, но теперь вы сделали свое приглашение зависимым от дискового ввода-вывода, что является хорошим способом заблокировать себя в чрезвычайных ситуациях. .

1
06.04.2019, 04:49
1 ответ

В user-mapping.xml вы можете добавить

param name="security" nla   

Если это не сработает, добавьте имя пользователя и пароль ваше RDP-соединение.

0
28.01.2020, 01:11

Теги

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