Кажется, есть еще одна ссылка под названием «Номинация для выпуска», которая, как предполагается, доступна только для администраторов ошибок, в соответствии с этим обсуждением списка рассылки и этим сообщением об ошибке. Поскольку ни один из нас не является одним из них, лучшим вариантом является оставить комментарий, отметив, что он все еще влияет на 12.04.
Хорошо, я заблокировал проблему. Поскольку вывод mkpassword приведет к $id$salt$hash, когда вы скопируете и вставьте это в команду useradd, bash попытается выполнить замену переменной на $. Таким образом, они должны быть экранированы с помощью \$id\$salt\$hash, так что bash не будет заменять переменную перед добавлением строки в /etc/shadow.
mkpasswd -m sha-512 "my password" приводит к
$6$5AfGzrQ9u$r6Q7Vt6h8f2rr4TuW4ZA22m6/eoQh9ciwUuMDtVBX31tR3Tb0o9EB1eBdZ2L9mvT.pX3dIEfxipMoQ0LtTR3V1
, который можно скопировать и вставить в useradd, обязательно заменив каждый $ на \$.
useradd -m -s /bin/bash -p \$6\$5AfGzrQ9u\$r6Q7Vt6h8f2rr4TuW4ZA22m6/eoQh9ciwUuMDtVBX31tR3Tb0o9EB1eBdZ2L9mvT.pX3dIEfxipMoQ0LtTR3V1
Хорошо, я заблокировал проблему. Поскольку вывод mkpassword приведет к $id$salt$hash, когда вы скопируете и вставьте это в команду useradd, bash попытается выполнить замену переменной на $. Таким образом, они должны быть экранированы с помощью \$id\$salt\$hash, так что bash не будет заменять переменную перед добавлением строки в /etc/shadow.
mkpasswd -m sha-512 "my password" приводит к
$6$5AfGzrQ9u$r6Q7Vt6h8f2rr4TuW4ZA22m6/eoQh9ciwUuMDtVBX31tR3Tb0o9EB1eBdZ2L9mvT.pX3dIEfxipMoQ0LtTR3V1
, который можно скопировать и вставить в useradd, обязательно заменив каждый $ на \$.
useradd -m -s /bin/bash -p \$6\$5AfGzrQ9u\$r6Q7Vt6h8f2rr4TuW4ZA22m6/eoQh9ciwUuMDtVBX31tR3Tb0o9EB1eBdZ2L9mvT.pX3dIEfxipMoQ0LtTR3V1
Хорошо, я заблокировал проблему. Поскольку вывод mkpassword приведет к $id$salt$hash, когда вы скопируете и вставьте это в команду useradd, bash попытается выполнить замену переменной на $. Таким образом, они должны быть экранированы с помощью \$id\$salt\$hash, так что bash не будет заменять переменную перед добавлением строки в /etc/shadow.
mkpasswd -m sha-512 "my password" приводит к
$6$5AfGzrQ9u$r6Q7Vt6h8f2rr4TuW4ZA22m6/eoQh9ciwUuMDtVBX31tR3Tb0o9EB1eBdZ2L9mvT.pX3dIEfxipMoQ0LtTR3V1
, который можно скопировать и вставить в useradd, обязательно заменив каждый $ на \$.
useradd -m -s /bin/bash -p \$6\$5AfGzrQ9u\$r6Q7Vt6h8f2rr4TuW4ZA22m6/eoQh9ciwUuMDtVBX31tR3Tb0o9EB1eBdZ2L9mvT.pX3dIEfxipMoQ0LtTR3V1
Причина, по которой он терпит неудачу, состоит в том, что элементы с ведущим $ рассматриваются как переменные и не сортируются, когда вы передаете его в useradd.
] Части $6..., $1... и $b... из вашего хэша рассматриваются как переменные. Конечно, ошибка заключается в том, что shell-оболочки выполняют переменное расширение (если только они не одинарные кавычки), прежде чем что-нибудь начнет работать. И поскольку эти 3 переменные не существуют в вашей среде, они исчезают из строки, которую вы передаете useradd.
Давайте посмотрим, какая действительная команда запускается после завершения оболочки с выполнением всех необходимых расширений и замещений и передала ее системному вызову execve(). Compare:
$ strace -e execve useradd -p $abra$cadabra newuser
execve("/usr/sbin/useradd", ["useradd", "-p", "newuser"], [/* 82 vars */]) = 0
$ strace -e trace=execve useradd -p '$abra$cadabra' newuser
execve("/usr/sbin/useradd", ["useradd", "-p", "$abra$cadabra", "newuser"], [/* 82 vars */]) = 0
В первом примере $abra$cadabra (где находится ваш хэш) исчезает из команды, которая фактически запускается системой. Напротив, одинарная кавычка $abra$cadabra во втором примере появляется в списке аргументов, которые передаются в execve().
Другими словами, вы создали правильный хэш, но оболочка передает совершенно другую вещь в useradd как аргумент, который в конечном счете является командой, которую запускает система. Фактически, давайте просто возьмем ваш хэш, например, и сравним два случая цитирования и не цитирования:
$ strace -e execve echo $6$1FuuSdKgVke$bc8doOVGZhzomoeafvcQnpYhAxfR4aWdAuYvbxSHw6ZCFZ4NC5j9C762kmvs4Pc66bv4.LYTfrlknm5cWx65g
execve("/bin/echo", ["echo", "FuuSdKgVke.LYTfrlknm5cWx65g"], [/* 82 vars */]) = 0
FuuSdKgVke.LYTfrlknm5cWx65g
+++ exited with 0 +++
Обратите внимание, что то, что система действительно видит после завершения оболочки, обрабатывает переменные FuuSdKgVke.LYTfrlknm5cWx65g. Но он увидит правильный хеш, если вы его процитируете:
$ strace -e execve echo '$6$1FuuSdKgVke$bc8doOVGZhzomoeafvcQnpYhAxfR4aWdAuYvbxSHw6ZCFZ4NC5j9C762kmvs4Pc66bv4.LYTfrlknm5cWx65g'
execve("/bin/echo", ["echo", "$6$1FuuSdKgVke$bc8doOVGZhzomoeaf"...], [/* 82 vars */]) = 0
Однако подоболочка работает, потому что не происходит замены - переменных нет. И цитирование также работает по той же причине.
Вот несколько методов:
Подстановка команд:$ sudo -p ">" useradd -m -s /bin/bash -p $(mkpasswd --hash=SHA-512 "123" ) newusr
>
$ su newusr
Password:
newusr@ubuntu1604:/home/admin$
Одиночное цитирование (обратите внимание, что я обрезал фактический хеш, потому что он слишком длинный и не вписывается в форматирование) : $ sudo -p ">" mkpasswd --hash=SHA-512 "112"
>
GVhvDY$vhw89D2X0bd2REQWE
$ sudo -p ">" useradd -m -s /bin/sh -p 'GVhvDY$vhw89D2X0bd2REQWE' newusr2
>
$ su newusr2
Password:
$ echo $USER
newusr2
Возьмите вывод из потока mkpasswd stdout и передайте его через xargs с флагом -I: $ mkpasswd -m sha-512 'password1' | sudo -p '>' xargs -I % useradd -p % newuser1
Добавьте \ к каждому $ (который OP выяснил в своем ответе ). Сценарий, также, согласно комментарию Джорджа. $ useradd -m -s /bin/bash -p \$6\$5AfGzrQ9u\$r6Q7Vt6h8f2rr4TuW4ZA22m6/eoQh9ciwUuMDtVBX31tR3Tb0o9EB1eBdZ2L9mvT.pX3dIEfxipMoQ0LtTR3V1 newuser
Причина, по которой он терпит неудачу, состоит в том, что элементы с ведущим $ рассматриваются как переменные и не сортируются, когда вы передаете его в useradd.
] Части $6..., $1... и $b... из вашего хэша рассматриваются как переменные. Конечно, ошибка заключается в том, что shell-оболочки выполняют переменное расширение (если только они не одинарные кавычки), прежде чем что-нибудь начнет работать. И поскольку эти 3 переменные не существуют в вашей среде, они исчезают из строки, которую вы передаете useradd.
Давайте посмотрим, какая действительная команда запускается после завершения оболочки с выполнением всех необходимых расширений и замещений и передала ее системному вызову execve(). Compare:
$ strace -e execve useradd -p $abra$cadabra newuser
execve("/usr/sbin/useradd", ["useradd", "-p", "newuser"], [/* 82 vars */]) = 0
$ strace -e trace=execve useradd -p '$abra$cadabra' newuser
execve("/usr/sbin/useradd", ["useradd", "-p", "$abra$cadabra", "newuser"], [/* 82 vars */]) = 0
В первом примере $abra$cadabra (где находится ваш хэш) исчезает из команды, которая фактически запускается системой. Напротив, одинарная кавычка $abra$cadabra во втором примере появляется в списке аргументов, которые передаются в execve().
Другими словами, вы создали правильный хэш, но оболочка передает совершенно другую вещь в useradd как аргумент, который в конечном счете является командой, которую запускает система. Фактически, давайте просто возьмем ваш хэш, например, и сравним два случая цитирования и не цитирования:
$ strace -e execve echo $6$1FuuSdKgVke$bc8doOVGZhzomoeafvcQnpYhAxfR4aWdAuYvbxSHw6ZCFZ4NC5j9C762kmvs4Pc66bv4.LYTfrlknm5cWx65g
execve("/bin/echo", ["echo", "FuuSdKgVke.LYTfrlknm5cWx65g"], [/* 82 vars */]) = 0
FuuSdKgVke.LYTfrlknm5cWx65g
+++ exited with 0 +++
Обратите внимание, что то, что система действительно видит после завершения оболочки, обрабатывает переменные FuuSdKgVke.LYTfrlknm5cWx65g. Но он увидит правильный хеш, если вы его процитируете:
$ strace -e execve echo '$6$1FuuSdKgVke$bc8doOVGZhzomoeafvcQnpYhAxfR4aWdAuYvbxSHw6ZCFZ4NC5j9C762kmvs4Pc66bv4.LYTfrlknm5cWx65g'
execve("/bin/echo", ["echo", "$6$1FuuSdKgVke$bc8doOVGZhzomoeaf"...], [/* 82 vars */]) = 0
Однако подоболочка работает, потому что не происходит замены - переменных нет. И цитирование также работает по той же причине.
Вот несколько методов:
Подстановка команд:$ sudo -p ">" useradd -m -s /bin/bash -p $(mkpasswd --hash=SHA-512 "123" ) newusr
>
$ su newusr
Password:
newusr@ubuntu1604:/home/admin$
Одиночное цитирование (обратите внимание, что я обрезал фактический хеш, потому что он слишком длинный и не вписывается в форматирование) : $ sudo -p ">" mkpasswd --hash=SHA-512 "112"
>
GVhvDY$vhw89D2X0bd2REQWE
$ sudo -p ">" useradd -m -s /bin/sh -p 'GVhvDY$vhw89D2X0bd2REQWE' newusr2
>
$ su newusr2
Password:
$ echo $USER
newusr2
Возьмите вывод из потока mkpasswd stdout и передайте его через xargs с флагом -I: $ mkpasswd -m sha-512 'password1' | sudo -p '>' xargs -I % useradd -p % newuser1
Добавьте \ к каждому $ (который OP выяснил в своем ответе ). Сценарий, также, согласно комментарию Джорджа. $ useradd -m -s /bin/bash -p \$6\$5AfGzrQ9u\$r6Q7Vt6h8f2rr4TuW4ZA22m6/eoQh9ciwUuMDtVBX31tR3Tb0o9EB1eBdZ2L9mvT.pX3dIEfxipMoQ0LtTR3V1 newuser
Причина, по которой он терпит неудачу, состоит в том, что элементы с ведущим $ рассматриваются как переменные и не сортируются, когда вы передаете его в useradd.
] Части $6..., $1... и $b... из вашего хэша рассматриваются как переменные. Конечно, ошибка заключается в том, что shell-оболочки выполняют переменное расширение (если только они не одинарные кавычки), прежде чем что-нибудь начнет работать. И поскольку эти 3 переменные не существуют в вашей среде, они исчезают из строки, которую вы передаете useradd.
Давайте посмотрим, какая действительная команда запускается после завершения оболочки с выполнением всех необходимых расширений и замещений и передала ее системному вызову execve(). Compare:
$ strace -e execve useradd -p $abra$cadabra newuser
execve("/usr/sbin/useradd", ["useradd", "-p", "newuser"], [/* 82 vars */]) = 0
$ strace -e trace=execve useradd -p '$abra$cadabra' newuser
execve("/usr/sbin/useradd", ["useradd", "-p", "$abra$cadabra", "newuser"], [/* 82 vars */]) = 0
В первом примере $abra$cadabra (где находится ваш хэш) исчезает из команды, которая фактически запускается системой. Напротив, одинарная кавычка $abra$cadabra во втором примере появляется в списке аргументов, которые передаются в execve().
Другими словами, вы создали правильный хэш, но оболочка передает совершенно другую вещь в useradd как аргумент, который в конечном счете является командой, которую запускает система. Фактически, давайте просто возьмем ваш хэш, например, и сравним два случая цитирования и не цитирования:
$ strace -e execve echo $6$1FuuSdKgVke$bc8doOVGZhzomoeafvcQnpYhAxfR4aWdAuYvbxSHw6ZCFZ4NC5j9C762kmvs4Pc66bv4.LYTfrlknm5cWx65g
execve("/bin/echo", ["echo", "FuuSdKgVke.LYTfrlknm5cWx65g"], [/* 82 vars */]) = 0
FuuSdKgVke.LYTfrlknm5cWx65g
+++ exited with 0 +++
Обратите внимание, что то, что система действительно видит после завершения оболочки, обрабатывает переменные FuuSdKgVke.LYTfrlknm5cWx65g. Но он увидит правильный хеш, если вы его процитируете:
$ strace -e execve echo '$6$1FuuSdKgVke$bc8doOVGZhzomoeafvcQnpYhAxfR4aWdAuYvbxSHw6ZCFZ4NC5j9C762kmvs4Pc66bv4.LYTfrlknm5cWx65g'
execve("/bin/echo", ["echo", "$6$1FuuSdKgVke$bc8doOVGZhzomoeaf"...], [/* 82 vars */]) = 0
Однако подоболочка работает, потому что не происходит замены - переменных нет. И цитирование также работает по той же причине.
Вот несколько методов:
Подстановка команд:$ sudo -p ">" useradd -m -s /bin/bash -p $(mkpasswd --hash=SHA-512 "123" ) newusr
>
$ su newusr
Password:
newusr@ubuntu1604:/home/admin$
Одиночное цитирование (обратите внимание, что я обрезал фактический хеш, потому что он слишком длинный и не вписывается в форматирование) : $ sudo -p ">" mkpasswd --hash=SHA-512 "112"
>
GVhvDY$vhw89D2X0bd2REQWE
$ sudo -p ">" useradd -m -s /bin/sh -p 'GVhvDY$vhw89D2X0bd2REQWE' newusr2
>
$ su newusr2
Password:
$ echo $USER
newusr2
Возьмите вывод из потока mkpasswd stdout и передайте его через xargs с флагом -I: $ mkpasswd -m sha-512 'password1' | sudo -p '>' xargs -I % useradd -p % newuser1
Добавьте \ к каждому $ (который OP выяснил в своем ответе ). Сценарий, также, согласно комментарию Джорджа. $ useradd -m -s /bin/bash -p \$6\$5AfGzrQ9u\$r6Q7Vt6h8f2rr4TuW4ZA22m6/eoQh9ciwUuMDtVBX31tR3Tb0o9EB1eBdZ2L9mvT.pX3dIEfxipMoQ0LtTR3V1 newuser