Почему "requiretty" не работает?

Ваша команда может найти каталоги (и другие не -обычные файлы ). Каталоги — это не обычные файлы, которые вы можете редактировать с помощью sed.

Добавление теста -type fк команде findгарантирует, что вы обрабатываете только обычные файлы:

find. -type f -not -path \*.hg\* -exec sed -i 's/FCLP1025/FCLP1080/g' {} \;

или, со стандартными опциями findи более читаемым цитированием,

find. -type f ! -path '*.hg*' -exec sed -i 's/FCLP1025/FCLP1080/g' {} \;

Если вы просто хотите полностью пропустить какой-либо каталог .hg, используйте -prune, чтобы удалить его из пути поискаfind:

find. -name.hg -prune -type f -exec sed -i 's/FCLP1025/FCLP1080/g' {} \;

Это заставляет findдаже не входить в каталоги с именем .hg. Ваша команда будет входить в такие каталоги и проверять все в них с помощью -path, что будет немного неэффективно.

Обратите внимание, что не будет вывода вашей команды find, так какsed -i(sedвыполнение в -редактировании места )никогда не приводит к выводу на терминал (, если нет диагностических сообщений ). Вывод sed -iпопадает в файлы, которые он редактирует.

Также обратите внимание, что последняя команда findвыше попытается отредактировать каждый файл. Если вы что-то знаете об именах файлов, которые хотите отредактировать,вы можете добавить -name 'some pattern'непосредственно перед -exec, чтобы ограничить запуск sedтолько этими файлами.

5
26.05.2021, 20:41
1 ответ

Ваше понимание неверно. :Псевдо -TTY считается полностью эквивалентным «настоящему» TTY.

Когда ttyпечатает /dev/pts/0, это означает, что сеанс имеет действительный TTY.

Но если вы подключитесь к ВМ с настройками SSH по умолчанию и укажете команду для запуска, ситуация будет другой:

$ ssh VM-user@VM-hostname "hostname; tty"
VM-hostname
not a tty

и , что — это ситуация, отвергнутая опцией sudorequiretty.

Требование наличия TTY позволяет SSH отклонять попытки передать ответ на запрос пароля через стандартный ввод, как это делают многие другие программы Unix при запросе пароля.

Это также позволяет вам делать подобные вещи:

sudo -u some-user data_producing_command 2> error-log-file | data_consuming_command

без запроса пароля, который не смешивается ни с данными, переданными в data_consuming_command, ни с error-log-file. (Обратите внимание, что data_consuming_commandздесь запускается от вашего имени, а не от some-user!)

Другими словами, с установленным requirettyвы не можете использовать sudoв таких контекстах, как:

  • удаленные команды через SSH, если вы не форсируете выделение TTY, то есть ssh VM-user@VM-host sudo somethingзавершится ошибкой, а ssh -tt VM-user@VM-host sudo somethingзавершится успешно.
  • команды crontab или сценарии, выполняемые через crontab или команды atили batch
  • скриптов, выполненных черезnohup
  • скрипты, выполняемые через cgi-binили любой другой демонизированный процесс, который не имеет отношения к сеансам пользователя

Когда requirettyустановлен и sudoзапрашивает пароль, он делает это примерно так же, как в этом фрагменте скрипта:

printf "[sudo] password for $USER: " > /dev/tty  # display prompt

TTYSETTINGS=$(stty -F /dev/tty --save)  # save current TTY settings
stty -F /dev/tty -echo -echoe           # prevent displaying the password

read PASSWORD < /dev/tty  

stty -F /dev/tty $TTYSETTINGS           # restore TTY settings 
# now check if $PASSWORD is correct...

/dev/tty— это «волшебное» устройство, которое всегда будет действовать как псевдоним фактического устройства TTY сеанса, если сеанс имеет TTY. Он существует именно для таких вещей :, чтобы позволить любому сценарию или программе «избежать» конвейера или другого перенаправления ввода/вывода и взаимодействовать непосредственно с пользователем, когда это необходимо.

Если requirettyустановлен, а /dev/ttyне используется (, т. е. когда с процессом не связан реальный TTY ),это рассматривается так же, как ошибка аутентификации пароля.

10
28.07.2021, 11:29

Теги

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