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

Благодаря двум другим постам SE (один на SO, другой на SF), ответ заключается в использовании продвинутого управляющего синтаксиса. Поэтому

auth required pam_unix.so try_first_pass nullok
# and sometime later
auth optional pam_ssh.so  use_first_pass

должно стать

auth [success=1 new_authtok_reqd=1 ignore=ignore default=ignore] pam_unix.so try_first_pass nullok
auth required pam_ssh.so use_first_pass

Теперь необходимо, чтобы строка pam_ssh точно предшествовала строке pam_unix, поскольку success=N означает пропуск N следующих модулей.

Кроме того, не забудьте строку session pam_ssh.so, пока вы здесь!


В своей первой попытке я использовал

auth [success=1 default=ignore] pam_ssh.so try_first_pass
auth required pam_unix.so use_first_pass nullok

вместо нее, но этот метод блокирует всех пользователей без ключей SSH! Оказалось, что default=ignore недостаточно, нужно добавить auth_err=ignore, поскольку это, по-видимому, не считается частью default. Кроме того, эта попытка означает, что появится запрос "пароль" или "парольная фраза SSH" в зависимости от того, есть ли у пользователя ключ SSH!


Обратите внимание, что в Arch Linux строка pam_unix, используемая login, находится в цепочке include

login -> system-local-login -> system-login -> system-auth

и что system-login имеет некоторые другие required до, включая system-auth, поэтому вы не можете просто поставить auth [success=1 default=ignore] pam_ssh. поэтому try_first_pass перед login в auth include system-local-login - вы бы пропустили неправильный required и благодаря pam_unix.so use_first_pass (вместо try_first_pass) вы всё равно могли бы войти только с вашим логин-паролем! С другой стороны, изменяя system-auth, вы также позволяете другим сервисам, таким как sshd, использовать ваш SSH-ключ в качестве опции аутентификации вместо пароля для входа. Если вы действительно хотите, чтобы только ваш login использовал это, вам придется разорвать цепочку include и вручную скопировать все auths в login.

6
13.04.2018, 16:44
2 ответа

В вашей оболочке может быть встроенная функция printf, которую вы можете использовать для форматирования чисел.

$ type printf
printf is a shell builtin
$ printf "%.3e\n" 646512354651316486246729519751795724672467596754627.06843
6.465e+50
$ printf "%.4e\n" 646512354651316486246729519751795724672467596754627.06843
6.4651e+50
$ _

Если нет, часто также существует специальный printfдвоичный файл.

$ which printf
/usr/bin/printf
$ _
13
27.01.2020, 20:20

Если вы хотите преобразовать только определенный столбец, awkпоможет

$ cat ip.txt
foo 64651235465131648624672951975 123
bar 3452356235235235 xyz
baz 234325236452352352345234532 ijkls

$ # change only second column
$ awk '{$2 = sprintf("%.3e", $2)} 1' ip.txt
foo 6.465e+28 123
bar 3.452e+15 xyz
baz 2.343e+26 ijkls
9
27.01.2020, 20:20

Теги

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