Вопрос неопределенный, ваш Сервис X - загадка, мы ничего не знаем об этом.
Обычно инструменты, которые читают учетные данные из терминала, не используют для этого стандартный ввод. Служба может использовать или не использовать стандартный ввод. Это может обеспечить возможность чтения учетных данных из стандартного ввода. Это может обеспечить возможность чтения учетных данных из файла.
Примечание: отныне я буду использовать servicex
в качестве команды, потому что X
у вас Service X
есть операнд, поэтому с опциями он должен выглядеть странно Service -a -b --optionc X
. Я сомневаюсь, что такой синтаксис был вашим намерением.
Если servicex
по умолчанию считывает учетные данные из stdin, это должно работать:
printf '%s\n' "your username" "your password" | servicex
Если он считывает учетные данные из stdin только тогда, когда ему приказывают, что-то вроде:
printf '%s\n' "your username" "your password" | servicex --credentials-from-stdin
В обоих случаях может быть лучше прочитать учетные данные из файла, который не может прочитать ни один другой пользователь:
<secret_file servicex --credentials-from-stdin
Или служба может предоставить возможность считывать учетные данные из файла (оставляя стандартный ввод для других целей или неиспользуемый):
servicex --credentials-from-file secret_file
Но, скорее всего, служба использует терминальное устройство напрямую, чтобы запросить учетные данные и прочитать их. В этом случае expect
это правильный инструмент. Сравните этот мой ответ или этот . Неопределенный эскиз решения вашей неопределенной проблемы может быть:
expect -c '
log_user 0
spawn servicex
expect "Service X: Username:"
send "your username\n"
expect "Service X: Password:"
send "your password\n"
interact
'