Автоматизация ввода имени пользователя и пароля bash с помощью команды «ожидается» для команды «systemctl restart openvpn» - PullRequest
0 голосов
/ 07 апреля 2020

Мне нужно подключить ноутбук Ubuntu 18.04 к двухступенчатой ​​защищенной VPN. Чтобы заставить его работать, я должен написать в терминале 3 раза команду 'sudo systemctl restart openvpn':

  • Первый раз, чтобы предоставить пароль 'sudo' (в консоли ничего не возвращается).
  • Во второй раз запрашивается мое имя пользователя с помощью openvpn (в консоли запрашивается «Введите имя пользователя:».
  • В третий раз запрашивается мой пароль с помощью openvpn («Введите пароль для входа:» запрашивается в консоли).

Чтобы автоматизировать процесс, я должен повторять каждый раз, когда подключаю свой ноутбук к Inte rnet, я написал следующий скрипт:

#!/usr/bin/expect -f
# shows usage to user
if {$argc!=2} {
   send_user "In order to use this script, you must provide ans user and password:\n"
   send_user "\tsudo $argv0 user password\n"
   exit 1
}
# checks for root privileges
set whoami [exec id -u]
if {$whoami!=0} {
   send_user "You must run this script with root privileges:\n"
   send_user "\tsudo $argv0 user password\n"
   exit 1
}

### Variables
## terminal wait time
#set timeout 1
#match_max 100000

# var to store the user
set user [lindex $argv 0]
# var to store the password
set password [lindex $argv 1]

### start system shell
spawn $env(SHELL)

### First command run: starts the VPN process of asking for the user and password
send -- "systemctl restart openvpn\r"
#expect "\r"

### Second command run: waits for username request
send -- "systemctl restart openvpn\r"
#expect "*?name:*"
expect -exact "Enter Auth Username: "
send "$user\r"

### Third command run: waits for password request
send -- "systemctl restart openvpn\r"
#expect  "*?assword:*"
expect -exact "Enter Auth Password: "
send "$password\r"

expect eof

Но он не работает, так как ожидается , expect не обеспечивает правильный ответ на systemctl restart openvpn запросы. Например:

  • Иногда работает правильно,
  • иногда заполняет неправильный запрос (вводит имя пользователя при запросе пароля или наоборот)

Но когда я запускаю 3 раз скрипт, он правильно заполняет запросы, и я подключаюсь.

Любой совет будет полезен.

Заранее спасибо.

1 Ответ

0 голосов
/ 07 апреля 2020

С помощью инструмента expect autoexpect я обнаружил, что для заполнения поля запроса "Введите пароль авторизации:" скрипт должен отправить букву пароля по буквам, т.е. (упрощая мой первоначальный сценарий, чтобы сосредоточиться на этом вопросе):

#!/usr/bin/expect -f
set timeout -1
spawn $env(SHELL)
match_max 100000

# First command run: start of process
send -- "systemctl restart openvpn\r"
# time between first and second systemctl to synchronize terminal responses
send -- "sleep 5\r"

# Second command run: input username (case username = username)
send -- "systemctl restart openvpn\r"
expect -exact "Enter Auth Username: "
send -- "username"
expect -exact ""
send -- "\r"

# Third command run: input password (case password = flower)
send -- "systemctl restart openvpn\r"
expect -exact "Enter Auth Password: "
send -- "f"
expect -exact "*"
send -- "l"
expect -exact "*"
send -- "o"
expect -exact "*"
send -- "w"
expect -exact "*"
send -- "e"
expect -exact "*"
send -- "r"
expect -exact "*"
send -- "\r"
send -- "exit\r"
expect eof

Теперь сценарий работает.

...