Я хочу создать скрипт (на языке bash), который позволит мне автоматически входить в службу X. Служба X запросит у меня имя пользователя и пароль, и я хочу, чтобы мой скрипт ввел их. Вот код:

Service X
#input username
#input password

Вот что я должен сделать вручную:

root@loacalhost~$ Service X  
Service X: Username:  
Service X: Password:  
You have successfully logged in to service X.  
root@loacalhost~$

Вот что я хочу сделать:

root@loacalhost~$ ./script.sh
You have successfully logged in to service X.
root@loacalhost~$ 

Как я могу это сделать? Я смотрел на перенаправление, STDIN, STDOUT и т.д., Но я не мог понять, как это сделать? Я также смотрел на использование echo для этого, но тоже не повезло.

1 ответ1

0

Вопрос неясен, ваш Сервис 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
'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .