Как повторить завершенную строку

Лично, я предпочитаю не использовать генератор пароля, поскольку сгенерированный пароль очень трудно помнить, но одно портативное решение состоит в том, чтобы использовать/dev/urandom

Создание случайных паролей, который не содержит специальных символов, является 10 символами долго:

$ cat /dev/urandom | tr -dc 'a-zA-Z0-9' | head -c 10` 
dyxJRKldvp

Это работает путем захвата байтов от/dev/urandom, удаления тех, которые не соответствуют шаблону, указанному в tr команда и ограничение его к 10 символам с head.

Создание случайных паролей, который содержит специальные символы, является 10 символами долго:

$ cat /dev/urandom | tr -dc 'a-zA-Z0-9-_!@#$%^&*()_+{}|:<>?=' | fold -w 10 | grep -i '[!@#$%^&*()_+{}|:<>?=]' | head -n 1
MSF4wj@vP0

Это использует немного отличающуюся технику после tr удаляет нежелательные байты, поскольку идея состоит в том, чтобы вынудить это иметь по крайней мере один специальный символ. Это работает при помощи fold управляйте для обертывания строки в группы 10, затем с помощью grep выбирать только строки, которые содержат специальный символ. head затем выбирает первый пароль, который отвечает требованиям.

6
09.08.2011, 05:05
4 ответа

В сценарии:

echo "${1//$/\\$}"

Это - замена простой строки, встраивают в оболочку. Синтаксис ${[VARIABLE_NAME]//[PATTERN]/[REPLACEMENT]} для глобальной замены литеральной строки.

Не уверенный, почему Вы хотели бы сделать это. Сценарий на самом деле просто сообщает о строке, которую Вы отправили в него; \$sad\$test оценивает к точно той же строке как '$sad$test', кроме последнего использует одинарные кавычки для выхода $.

0
27.01.2020, 20:25
  • 1
    То, что все еще только обрабатывает $. Если Вы только используете выход обратной косой черты, для многих других символов также нужен выход: обратная косая черта, одинарные и двойные кавычки, одинарная левая кавычка, точка с запятой, амперсанд, менее - и больше - чем, звездочка, вопросительный знак, и т.д. Список в значительной степени неограничен, так как более новые оболочки/функции часто дают особое значение (неупомянутым) символам, которые не были ранее специальны. Единственная безопасная вещь сделать состояла бы в том, чтобы выйти из каждого символа (хотя Вам мог, вероятно, сойти с рук не выход из буквенно-цифрового индикатора). номер –  Chris Johnsen 09.08.2011, 08:48
  • 2
    безопасная вещь сделать должен был бы изучить надлежащие методы заключения в кавычки и строковую безопасность. –  amphetamachine 09.08.2011, 10:35
  • 3
    , если Вы - выход оболочки что-то, что Вы собираетесь сделать, чему-то чрезвычайно опасному с ним нравится, передают его через eval. –  amphetamachine 09.08.2011, 10:42
  • 4
    Это не решение. Это только echo замена выполнения значения. Это не изменяет то, что test.sh сценарий получает $sad$test как значение 1$. –  jfg956 09.08.2011, 13:39

Я предполагаю, что Вы хотите, чтобы строка была показана “заключенную в кавычки оболочку”.

printf встроенная команда в ksh, ударе и zsh все понимают %q спецификатор формата. Эффективная выходная мощность не стандартизирована и может варьироваться в зависимости от входной строки (см. ниже). Из-за изменения в форме вывода Вы не можете использовать вывод от одной оболочки с другим (особенно, если Ваша целевая оболочка является менее многофункциональной оболочкой как пепел, тире, и т.д.).

zsh также имеет поддержку генерации кавычек непосредственно в расширениях параметра:

echo "${(q)1}"    # backslashes, with $'' for unprintable/invalid characters
echo "${(qq)1}"   # single quotes
echo "${(qqq)1}"  # double quotes
echo "${(qqqq)1}" # $'' quoting

Если Вы хотите к “самокрутке”, самая легкая и самая надежная вещь сделать к вещи, генерируют Ваше собственное единственное заключение в кавычки. Простой алгоритм следует:

  1. Измените любые одинарные кавычки на последовательность '\''.
  2. Перенесите результат в одинарные кавычки.

Это работает на подобные Границе оболочки, потому что единственное заключение в кавычки полностью literal1. Для представления одинарной кавычки Вы заканчиваете текущий единственный заключенный в кавычки промежуток, предоставляете оставленную из обратной косой черты одинарную кавычку и возобновляете единственную остальную часть заключения в кавычки строки. Вышеупомянутый алгоритм неэффективен при контакте с выполнениями последовательных одинарных кавычек и одинарных кавычек вначале и конца строки, но это очень надежно и довольно просто реализовать.

1 одинарная кавычка на других языках часто не является абсолютно литеральной (по крайней мере, они часто позволяют некоторый ограниченный выход обратной косой черты). Поэтому критически важно, чтобы Вы знали все правила заключения в кавычки для формы заключения в кавычки, Вы будете генерировать (т.е. в том, какой язык/контекст заключенный в кавычки текст будет использоваться).


Вот некоторые примеры printf %q в оболочках я установил локально:

for s in /bin/ksh {,/opt/local}/bin/bash {,/opt/local}/bin/zsh
do
  "$s" --version | head -1
  "$s" -c 'printf "%q\n" "$@"' - \$sad\$test \'mixed\ quotes\" back\`tick
  echo
done

Вывод:

  version         sh (AT&T Research) 1993-12-28 s+
'$sad$test'
$'\'mixed quotes"'
'back`tick'

GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin10.0)
\$sad\$test
\'mixed\ quotes\"
back\`tick

GNU bash, version 4.2.10(2)-release (i386-apple-darwin10.7.0)
\$sad\$test
\'mixed\ quotes\"
back\`tick

zsh 4.3.9 (i386-apple-darwin10.0)
\$sad\$test
\'mixed\ quotes\"
back\`tick

zsh 4.3.12 (i386-apple-darwin10.7.0)
\$sad\$test
\'mixed\ quotes\"
back\`tick

Мы видим, что ksh, кажется, “нравится” заключать в кавычки с одинарными кавычками и использует $'' форма в некоторых случаях. Другие оболочки, кажется, главным образом используют Escape обратной косой черты (хотя они будут также использовать $'' если некоторые символы присутствуют).

7
27.01.2020, 20:25
  • 1
    Это - фантастический полный ответ, который имеет право быть корректным ответом. –  dlamblin 13.09.2017, 12:12
  • 2
    К сожалению, %q отсутствует в printf в значении по умолчанию MINIX sh, sh. –  mcandre 28.12.2017, 21:35

Поместите одинарные кавычки вокруг \$sad\$test:

$ echo $SHELL
/bin/bash
$ ./test.sh '\$sad\$test'
\$sad\$test
1
27.01.2020, 20:25

Путем выполнения test.sh \$sad\$test, test.sh сценарий получает $sad$test как его параметр, нет \$sad\$test. Причиной этого является оболочка, которая заменяет \$ $ перед вызовомtest.sh. Если Вы хотите, чтобы Ваш сценарий получил \$sad\$test, необходимо или сделать test.sh '\$sad\$test' или test.sh "\\\$sad\\\$test".

Попробуйте это для убеждения себя:

function cat1stpar() {
cat << EOF
$1
EOF
}
cat1stpar \$sad\$test
cat1stpar '\$sad\$test'
cat1stpar "\\\$sad\\\$test"

Кроме того, в общем случае, с помощью echo $1 опасно. Если Вы делаете:

./test.sh "aaa bbb"
./test.sh "aaa    bbb"

Вывод будет:

aaa bbb
aaa bbb

и нет:

aaa bbb
aaa    bbb

Если Вы хотите 2-й вывод, Вы, shoud, по крайней мере, делают echo "$1" который удостоверится echo получает единственный параметр, не так, как существуют слова в 1$. Для полного обсуждения слова посмотрите переменную IFS в человеке оболочки.

Это также сказано то выполнение printf "%s\n" "$1"более безопасно, чем echo "$1" потому что echo изменения некоторые символы перед печатью, но я не имею, полностью понимают это все же.

Править:

О нас echo изменяя символы, я просто понял это. Попробуйте:

echo "-n"
printf "%s\n" "-n"
./test.sh "-n"
cat1stpar "-n"
1
27.01.2020, 20:25

Теги

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