Есть ли способ увидеть символы, набранные для пароля su

Я пишу сценарий bash, которому может потребоваться su для запуска команды. Что-то вроде этого-

echo "Установка системы XYZ" echo "Пожалуйста, введите пароль root-" su -c "java -cp ./Installer.jar com.company.FmMain ; выход"

Есть ли способ использовать символы su print (звездочки или что-то подобное), чтобы у пользователя была визуальная обратная связь при вводе пароля?


person SystemCalls    schedule 30.08.2012    source источник
comment
Ага. Возьмите исходный код su, перепишите его так, чтобы он давал обратную связь, и заставьте пользователя установить его.   -  person    schedule 31.08.2012
comment
Я не думаю, что есть какая-либо стандартная команда, но вы можете найти дополнительную помощь на superuser.com.   -  person teppic    schedule 31.08.2012
comment
Невозможно без изменения исходного кода.   -  person Icarus    schedule 31.08.2012


Ответы (2)


Сначала вам нужно будет прочитать пароль в переменной за пределами su. См. вопрос Как отображать звездочки (*) при чтении пароля с помощью `read` ? для примера использования read для достижения этой цели.

Затем вам нужно будет использовать expect, чтобы передать этот пароль в запрос пароля, который представляет su. См. вопрос Как мне использовать ожидание для подключения через ssh к системе и изменить пароль хост-системы? в качестве примера выполнения чего-то подобного.

person Grisha Levit    schedule 30.08.2012
comment
Отлично, большое спасибо. Эти ссылки - именно то, что я искал. - person SystemCalls; 31.08.2012

Я бы не рекомендовал маскировать пароль в Linux, это противоречит ожидаемому нормальному поведению и, вероятно, запутает пользователей, особенно если они опытные пользователи Linux. Стандартный способ считывания паролей — отключить эхо и отключить обработку специальных символов, таких как управляющие последовательности и т. д., перед принятием пароля (обычно это делается с помощью установки атрибутов терминала — tcsetattr и т.п.), так работает su.

Существуют стандартные библиотечные функции, такие как getpass, которые делают это за вас: http://www.gnu.org/s/hello/manual/libc/getpass.html

Попытка реализовать свои собственные методы для этого имеет потенциальные последствия для безопасности. Я бы настоятельно предостерег от этого.

person Matt    schedule 31.08.2012