Автоматически проверять пароли для занятий в классе?

Ваш вопрос не кристально ясен, но ваше сопоставление предложений

Aliases are expanded when a command is read, not when it is executed.

и

Bash always reads at least one complete line of input before executing any of the commands on that line.

предполагает, что в центре внимания вашего вопроса находится расширение псевдонима. (Я говорю «предполагает», потому что, помимо выдержки из руководства Bash, в вашем вопросе вообще не упоминаются псевдонимы.)

Первоначальная версия вашего вопроса

How can I show that Bash always reads at least one complete line of input before executing any of the commands on that line?

Единственный реальный способ сделать это заключается в использовании какого-либо инструмента отладки / мониторинга / трассировки изучить внутреннее состояние оболочки. Это несколько непрактично. Ответ PawkyPenguin показывает подход к тому, чтобы приводить -сомнительные аргументы в поддержку того, что говорится в руководстве. Вот вариант их ответа, который (ИМО )немного яснее:

$ alias myalias=date

$ alias myalias="ls -ld"; myalias
Fri, Aug 04, 2017  3:33:33 AM

Мы можем утверждать, что оболочка должна полностью прочитать (вторую )полную строку прежде чем он начал выполнять его потому что, когда он выполнил myalias, он выполнил его как date. К моменту выполнения псевдонима myaliasон был переопределен как ls -ld. Следовательно, оболочка должна была расшириться с myaliasна date. перед выполнением

alias myalias="ls -ld"

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


Ваш измененный вопрос,

How can I show the results after Bash reads one complete line of input but before executing any of the commands on that line?

имеет немного больше смысла в этом контексте. Думаю, вы хотите увидеть командную строку с расширенными псевдонимами . перед выполнением любой из команд в этой строке; см. результаты расширения псевдонима. Я думаю, вы хотите увидеть что-то вроде

alias myalias="ls -ld"; date

Насколько я знаю, нет никакого способа получить этот вывод — развернута полная строка с псевдонимами. Но вариантxtrace(-x)подходит близко.

$ set -x

$ alias myalias=date
+ alias myalias=date

$ alias myalias="ls -ld"; myalias
+ alias 'myalias=ls -ld'
+ date                                                         ← The expansion of the alias
Fri, Aug 04, 2017  3:33:42 AM

Конечно, это выводит каждую расширенную команду только непосредственно перед его выполнением, поэтому результаты расширения псевдонима смешиваются с выводом команд. Также,это показывает все расширения:

$ animal=cat
+ animal=cat

$ echo Hello; echo world; myalias "$animal" R*
+ echo Hello
Hello
+ echo world
world
+ ls -ld cat README                                            ← The expansion of the alias
ls: cannot access cat: No such file or directory
-rw-r--r-- 2 myusername  mygroupname  489 Feb 22  2015 README

Мы не увидим ls -ld "$animal" R*; мы видим это только после расширения переменной и пути (glob ). Он также не «хорошо работает» с конвейерами :

.

$ alias myalias=date
+ alias myalias=date

$ myalias | od -cb
+ date                                                         ← The expansion of the alias
+ od -cb
0000000   F   r   i  ,       A   u   g       0   4  ,       2   0   1
        106 162 151 054 040 101 165 147 040 060 064 054 040 062 060 061
0000020   7           9   :   4   2   :   1   7       P   M  \n
        067 040 040 071 072 064 062 072 061 067 040 120 115 012
0000036

, где вывод трассировки показывает нам dateи od -cbв двух отдельных строках. (Вам нужно посмотреть исходную командную строку выяснить, что он делает date | od -cb, если это не было очевидно из вывода.)

3
17.11.2019, 19:39
1 ответ

если у вас есть root:

salt=$(awk -F\$ '$1 ~ /student:/ { print $3 }' /etc/shadow)
hashedpasswd=$(awk -F: '$1 == "student" { print $2} ' /etc/shadow)
expected=$(mkpasswd -m sha-512 given-passwd $salt)
if [ "$hashedpasswd" = "expected" ]
then
   echo good
else
   echo bad
fi
  • замените studentна возмутительную строку, конечно.
  • также заменяет given-passwd.

подробнее см. мой вопрос:/etc/shadow :как сгенерировать зашифрованный пароль $6$?

5
27.01.2020, 21:13

Теги

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