Питання неясне, ваша служба X - це таємниця, про це ми нічого не знаємо.
Зазвичай інструменти, які зчитують облікові дані з терміналу, не використовують для цього stdin. Служба може або не може використовувати stdin. Він може надавати можливість читати облікові дані з stdin. Він може надавати можливість для читання облікових даних з файлу.
Примітка: відтепер я буду використовувати 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
Або сервіс може надавати можливість зчитувати облікові дані з файлу (залишаючи 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
'