Лично, я предпочитаю не использовать генератор пароля, поскольку сгенерированный пароль очень трудно помнить, но одно портативное решение состоит в том, чтобы использовать/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
затем выбирает первый пароль, который отвечает требованиям.
В сценарии:
echo "${1//$/\\$}"
Это - замена простой строки, встраивают в оболочку. Синтаксис ${[VARIABLE_NAME]//[PATTERN]/[REPLACEMENT]}
для глобальной замены литеральной строки.
Не уверенный, почему Вы хотели бы сделать это. Сценарий на самом деле просто сообщает о строке, которую Вы отправили в него; \$sad\$test
оценивает к точно той же строке как '$sad$test'
, кроме последнего использует одинарные кавычки для выхода $
.
Я предполагаю, что Вы хотите, чтобы строка была показана “заключенную в кавычки оболочку”.
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
Если Вы хотите к “самокрутке”, самая легкая и самая надежная вещь сделать к вещи, генерируют Ваше собственное единственное заключение в кавычки. Простой алгоритм следует:
'\''
.Это работает на подобные Границе оболочки, потому что единственное заключение в кавычки полностью 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 обратной косой черты (хотя они будут также использовать $''
если некоторые символы присутствуют).
%q
отсутствует в printf в значении по умолчанию MINIX sh, sh
.
– mcandre
28.12.2017, 21:35
Поместите одинарные кавычки вокруг \$sad\$test
:
$ echo $SHELL
/bin/bash
$ ./test.sh '\$sad\$test'
\$sad\$test
Путем выполнения 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"
$
. Если Вы только используете выход обратной косой черты, для многих других символов также нужен выход: обратная косая черта, одинарные и двойные кавычки, одинарная левая кавычка, точка с запятой, амперсанд, менее - и больше - чем, звездочка, вопросительный знак, и т.д. Список в значительной степени неограничен, так как более новые оболочки/функции часто дают особое значение (неупомянутым) символам, которые не были ранее специальны. Единственная безопасная вещь сделать состояла бы в том, чтобы выйти из каждого символа (хотя Вам мог, вероятно, сойти с рук не выход из буквенно-цифрового индикатора). номер – Chris Johnsen 09.08.2011, 08:48eval
. – amphetamachine 09.08.2011, 10:42echo
замена выполнения значения. Это не изменяет то, чтоtest.sh
сценарий получает$sad$test
как значение 1$. – jfg956 09.08.2011, 13:39