Скрипт Bash, который вводит строки в команду после ее выполнения

0

Я хочу создать скрипт (на языке 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чтобы сделать это, но также не повезло.

Даш Конрой
источник

Ответы:

0

Вопрос неопределенный, ваш Сервис 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
'
Камиль Мачоровски
источник