LINUX.ORG.RU

Как перенаправление вывода влияет на процесс?

 , , ,


0

2

Имеется консольная утилита, опционально запрашивающая пароль.
Мне нужно автоматически отреагировать на появившееся password: и передать туда пароль.
При запуске в терминале всё проходит нормально и «password:» выводится на экран. Однако, если перенаправить вывод (например, в cat или в файл), то строка password: не выводится. Причём, не выводится даже после успешного ввода пароля.
Куда копать? Под strace отследить не удаётся. прямой запуск приводит к sigtrap, а если приаттачиться - молчит.

P.S решилось так:

diff --git a/sources/resolvconf-override.c b/sources/resolvconf-override.c
index a24fed7..d303965 100644
--- a/sources/resolvconf-override.c
+++ b/sources/resolvconf-override.c
@@ -86,6 +86,8 @@ int __res_init(void)
        int ret = f();

        override_ns ();
+       setbuf(stdout, NULL);
+       setbuf(stderr, NULL);

        return ret;
 }

★★★★★

Последнее исправление: mittorn (всего исправлений: 1)
Ответ на: комментарий от arturpub

Если вывод потоковый (printf), то читает библиотека libc, так как по умолчанию вывод в файл block buffered (man setbuf).

А, вобще нормальная утилита не должна читать пароли откуда угодно, а только с tty, чтобы не провоцировать конструкции типа:

echo passwd | program

mky ★★★★★
()
Ответ на: комментарий от mky

Однако такие конструкции вполне работают.

mittorn ★★★★★
() автор топика
Ответ на: комментарий от mky

нормальная утилита не должна читать пароли откуда угодно, а только с tty, чтобы

... создавать лишние проблемы тем, у кого паролей больше одного. Нормальная программа должна молча читать пароли из стдина максимум после указания странного неочевидного параметра, в документации по которому сослаться на описание популярных способов потери секретности.

DonkeyHot ★★★★★
()

автоматически отреагировать на появившееся password

Зачем? Ты не уверен, что она таки спросит пароль? Тогда запускай expect-ами по вкусу, они жертвам tty подсовывают, т.ч. заметить разницу не так просто.

DonkeyHot ★★★★★
()
Ответ на: комментарий от DonkeyHot

Да вроде бы проблема из-за буфферизированного вывода. Сейчас попробую через LD_PRELOAD буфферизацию рубануть.

mittorn ★★★★★
() автор топика

Гугли что такое Взаимоотношение между процессами, Сеесии, Группы процессов и Управляющие терминалы. Там на самом деле не всё так просто...

itn ★★★
()
Ответ на: комментарий от DonkeyHot

Незачем плодить уязвимости. Программа должна уметь читать пароли из файла. Или уж запускайте програму через ″expect″, там хоть можно нормально отслеживать ход выполнения — expect скрипт короткий и в нём просто указывать таймауты.

mky ★★★★★
()
Ответ на: комментарий от mky

программа умеет читать их из файла. Но мне было нужно интерактивное взаимодействие т.к она и хранить их умеет (не запрашивает при втором запуске, если сохранённая сессия действительна).
Проблема решена, я обновил шапку, setbuf помог.

mittorn ★★★★★
() автор топика
Ответ на: комментарий от itn

Терминал у меня предельно прост т.к он не tty. Из-за этого и включилась буфферизация.

mittorn ★★★★★
() автор топика
Ответ на: комментарий от mittorn

setbuf() это не обязательно syscall, это ещё и команда, из под которой можно запускать другую, чтобы без правки исходников. Правда, она не всегда помогает. Но, так, может в другом случае пригодится.

mky ★★★★★
()
Ответ на: комментарий от mky

Незачем плодить уязвимости. Программа должна уметь читать пароли из файла

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

2. echo password как раз в файле и хранится, т.ч. секретность ничем не отличается (разве что c suid-ами).

Т.ч. пока при своём: stdin - более безопасное место получения пароля, чем большинство из того, что приходит в голову. Хотя бы потому, что можно «echo password | ssh server sudo service start».

DonkeyHot ★★★★★
()
Ответ на: комментарий от mky

Так я через LD_PRELOAD. У меня там всё равно неймсервер хукнут и библиотека уже есть.

mittorn ★★★★★
() автор топика
Ответ на: комментарий от DonkeyHot

Верно. Причём в отличие от файла stdin только безопаснее т.к храниться млжет в щифрованном виде.
Как пример, у pppd есть плагин авторизации с дескриптора.

mittorn ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.