Вопрос неясен, ваш Сервис X - загадка, мы ничего не знаем об этом.
Обычно инструменты, которые читают учетные данные из терминала, не используют для этого стандартный ввод. Служба может использовать или не использовать stdin. Это может обеспечить возможность чтения учетных данных из стандартного ввода. Это может обеспечить возможность считывания учетных данных из файла.
Примечание: отныне я буду использовать servicex
в качестве команды, потому что X
в вашем Service X
является операндом, поэтому с параметрами он должен выглядеть странным образом как Service -a -b --optionc X
Я сомневаюсь, что такой синтаксис был вашим намерением.
Если servicex
читает учетные данные из стандартного ввода по умолчанию, это должно работать:
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
'